jjzjj

Spring笔记_mybatis

EnkiZhang 2023-03-28 原文

mybatis

  • 使用数据库连接池初始化连接资源
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

介绍

mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

步骤

  • 添加坐标

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    
  • 创建user数据表

CREATE TABLE USER( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, userName VARCHAR(32) not null, passWord VARCHAR(32) not null )

  • 编写user实体类
package com.spring.demo;

/**
 * @author Enki
 * @Version 1.0
 */
public class User {
    private int id ;
    private String userName;
    private String passWord;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }
}
  • 编写映射文件UserMapper.xml

    在resource下新建文件夹

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="userMapper">
<!--    结果集封装的对象时resultType-->
    <select id="findAll" resultType="com.spring.demo.User">
        select * from user
    </select>
</mapper>

找到userMapper文件下的findAll方法并执行结果封住为User类型

  • 核心配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <!--    数据源环境部-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                    <property name="username" value="root"/>
                    <property name="password" value="enki"/>
                </dataSource>
            </environment>
        </environments>
        <!--    加载映射文件-->
        <mappers>
            <mapper resource="com\spring\mybatis\demo\mapper\UserMapper.xml"/>
        </mappers>
    </configuration>
    
  • 编写测试

    查询:

    @Test
    public void test() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = build.openSession();
        //执行操作 参数
        List<User> objects = sqlSession.selectList("userMapper.findAll");
        //测试
        System.out.println(objects);
        sqlSession.close();
    }
    

添加

<!--    添加 values值对应于User的属性-->
    <insert id="insertUser" parameterType="com.spring.demo.User">
        insert into user values(#{id},#{userName},#{passWord})
    </insert>
   @Test
    public void test02() throws IOException ?。
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = build.openSession();
        //执行操作 参数
        int insert = sqlSession.insert("userMapper.insertUser",new User("zhangsan","2121"));
//mybatis 默认不提交事务 主动提交
        sqlSession.commit();
        //测试
        System.out.println(insert);
        sqlSession.close();
    }

修改

<!--    修改-->
    <update id="updateUser" parameterType="com.spring.demo.User">
        update user set passWord=#{passWord} where userName=#{userName}
    </update>
 @Test
    public void test03() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = build.openSession();
        //执行操作 参数
        int update = sqlSession.update("userMapper.updateUser", new User("zhangsan", "1111"));
//mybatis 默认不提交事务
        sqlSession.commit();
        //测试
        System.out.println(update);
        sqlSession.close();
    }

删除

<!--    删除-->
    <delete id="deleteUser" parameterType="com.spring.demo.User">
        delete from user where userName=#{userName}
    </delete>
    @Test
    public void test04() throws IOException {
        //获得核心配置文件+
        
        InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = build.openSession();
        //执行操作 参数
        int delete = sqlSession.delete("userMapper.deleteUser", new User("zhangsan", "1111"));
//mybatis 默认不提交事务
        sqlSession.commit();
        //测试
        System.out.println(delete);
        sqlSession.close();
    }

或者直接用id删除

<!--    删除-->
<delete id="deleteUser" parameterType="java.lang.Integer">
    delete from user where userName=#{id}
</delete>

所以可以根据sql语句的所需要的参数类型进行对paramterType的类型进行对应,不一定必须写数据库的封装类型

映射部分属性

常用配置解析

数据库环境的配置 支持多环境配置

其中,事务管理器(transactionManager)类型有两种:

• JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

• MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE

应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置

为 false 来阻止它默认的关闭行为。

其中,数据源(dataSource)类型有三种:

• UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。

• POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。(JDBC使用POOLED)

• JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置

一个 JNDI 上下文的引用

mapper标签

用于加载映射,加载方式如下:

  • 使用相对于类路径的资源引用

  • 使用完全限定资源定位符(URL)

  • 使用映射器接口实现类的完全限定类名

  • 将包内映射器接口实现全部注册为映射器

properties标签

单独抽取出来,明确分工

typeAliases标签

用于设置别名

<typeAliases>
    <typeAlias type="com.spring.demo.User" alias="user"/>
</typeAliases>

常用apl SqlSessionFactory build(InputStream inputStream)

//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = build.openSession();
方法 解析
openSession() 会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交
openSession(boolean autoCommit) 参数为是否自动提交,如果设置为true,那么不需要手动提交事务

SqlSession实例对象

可以查询单个对象

mybatis的代理开发

mapper接口开发方法需要编写Mapper接口由mybatis框架根据接口定义创建接口的动态代理对象;

需要遵循以下规范:

  • Mapper.xml文件中的namespace与mapper接口的全限定名相同

  • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

测试

public static void main(String[] args) throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession session = build.openSession();

    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAll();
    System.out.println(users);
}

有关Spring笔记_mybatis的更多相关文章

  1. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  4. ruby-on-rails - Spring 不起作用。 [未初始化常量 Spring::SID::DL] - 2

    我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li

  5. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  6. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  7. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  8. Spring Boot集成ElasticSearach - 2

    文章目录前言一、Elasticsearch版本介绍二、客户端种类三、客户端与版本兼容性四、引入Elasticsearch依赖包五、客户端配置六、Elasticsearch使用前言ElasticSearch是Elastic公司出品的一款功能强大的搜索引擎,被广泛的应用于各大IT公司,它的代码位于https://github.com/elastic/elasticsearch,目前是一个开源项目。ElasticSearch公司的另外两个开源产品Logstash、Kibana与ElasticSearch构成了著名的ELK技术栈。。他们三个共同形成了一个强大的生态圈。简单地说,Logstash负责数据

  9. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  10. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

随机推荐