首页 > 其他分享 >02_MyBatis01

02_MyBatis01

时间:2023-07-01 18:01:46浏览次数:53  
标签:02 Mapper 映射 配置文件 SqlSession Mybatis public MyBatis01

1. JDBC操作的缺陷

JDBC查询数据代码

image

JDBC添加数据代码
image

JDBC操作的问题

  • 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
  • sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql变动需要改变java代码。
  • 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置(jdbcTemplate)

解决方案

  • 使用数据库连接池初始化连接资源(c3p0、druid、hikari)
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射。(内省:Java语言对JavaBean类属性、事件的处理方法,例如类User中有属性name,那么必定有 getName,setName方法,我们可以通过他们来获取或者设置值,这是常规操作。)

解决方案实现框架

  • JdbcTemplate
  • Dbutils
  • Hibernate
  • Mybatis

2. Mybatis框架介绍

什么是框架?
image

上图我们称之为汽车框架,汽车工人可以在汽车框架的基础上组装发动机、轮胎、方向盘、座椅、仪表盘等组件,最终生产出一辆汽车,我们可以认为汽车框架其实就是个半成品,汽车工人在半成品的基础上进行开发,最终生产出一个成品的汽车。

框架就是是完成了一定基础的、有难度的、通用的功能的半成品软件,程序员在框架的基础上实现自己项目系统的功能,最终完成一个完整的项目系统。

Mybatis框架介绍

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

ORM介绍

ORM:Object relation Mapping (对象关系映射)

让JavaBean实体类对象和数据库表之间产生映射关系,使我们可以通过操作实体类对象,操作数 据库表中的数据,称之为ORM思想

image

3. Mybatis快速入门-查询

1.创建项目,引入依赖

<dependencies>
        <!--mybatis坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!--mysql驱动坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </dependency>
        <!--单元测试坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--日志坐标-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
      <!--lombok 注解-->
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
      </dependency>
    </dependencies>

2.创建数据库表

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(50) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;
INSERT INTO `user` VALUES ('1', 'lucy', '123');
INSERT INTO `user` VALUES ('2', 'haohao', '123');

3.创建实体类

public class User {
    private Integer id;
    
    private String userName;
    
    private String password;
    
    public User() {
    }
    
    public User(Integer id, String userName, String password) {
        this.id = id;
        this.userName = userName;
        this.password = password;
    }
    
    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
    
    public Integer getId() {
    	return id;
    }
    
    public void setId(Integer 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 + '\'' +
            '}';
    }
    
}

4.编写Mybatis核心配置文件

核心配置文件主要用来配置Mybatis的配置,比如:数据源配置、别名设置、映射文件引入、分 页、外部文件引入等等。

映射文件和核心文件不知道如何编写约束信息,可以通过此地址参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html

jdbc.properties

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/yan8?
useUnicode=true&characterEncoding=UTF8&userSSL=false&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=root

Mybatis-Config.xml

<?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>
    <!--核心配置操作-->
    <!--引入外部配置文件-->
    <properties resource="jdbc.properties"></properties>
    <!--mybatis配置-->
    <settings>
        <!--开启数据库表字段下划线和pojo类中的驼峰命名的属性名称的映射对应关系
        user_name:userName -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--mybatis的pojo实体类别名设置
        以前寻找实体类的时候,需要寻找的是全限定名的实体类,com.test.pojo.User
        使用user别名之后,可以直接用别名user代表com.test.pojo.User
        相当于在使用user别名的时候,就是在使用com.test.pojo.User
        -->
    <typeAliases>
        <!--给一个实体类设置别名-->
        <!--<typeAlias type="com.test.enity.User" alias="user">-->
        <!--</typeAlias>&ndash;&gt;-->
        <!--如果com.test.pojo包下有很多实体类,该怎么去别名呢?-->
        <!--给对应包下的所有pojo实体类设置别名,别名就是类名(大小不区分)-->
        <package name="com.test.enity"/>
    </typeAliases>
    <!--数据库连接配置-->
    <!--default:默认使用哪个数据库连接,值为environment的id-->
    <environments default="default">
        <!--数据库连接-->
        <environment id="default">
            <!--事务管理器-->
            <transactionManager type="jdbc"></transactionManager>
            <!--数据源配置 type:设置是否使用数据库连接池-->
            <dataSource type="POOLED">
                <!--数据源驱动配置-->
                <!--<property name="driver"
                value="com.mysql.cj.jdbc.Driver"/>-->
                <property name="driver" value="${jdbc.driverClassName}"/>
                <!--数据库连接-->
                <property name="url" value="${jdbc.url}"/>
                <!--用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件设置-->
    <mappers>
        <!-- 路径引入:通过映射文件路径引入映射文件 -->
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

5.编写Mybatis映射配置文件

映射配置文件主要用来编写对应的sql语句。

<?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">
<!-- namespace:值为mapper(dao)接口的全类名,表示和mapper接口绑定-->
<mapper namespace="com.test.mapper.UserMapper">
    <!-- 查询全部用户 -->
    <!-- select表示查询sql语句 -->
    <!-- id:sql语句的statement id标识 -->
    <!-- resultType:sql语句执行之后的返回类型,会自动进行ORM对象关系映射 -->
    <select id="findAllUser" resultType="com.test.enity.User">
        select * from user
    </select>

</mapper>

6.编写Mapper(dao)接口

Mybatis中将原来的Dao统一称作为Mapper。

public interface UserMapper {
    public List<User> findAllUser();
}

注意:Mapper接口是没有实现类的,Mybatis可以通过代理的方式自动设置Mapper接口的实现 类,通过自动映射的方式找到映射文件中的sql语句,那为了映射成功,映射文件编写需要遵守以下规则:

  1. namespace必须为接口全类名

  2. statement id标识比须和接口中的方法名一致 service -> dao -> 操作数据库

  3. resultType返回值类型必须和接口方法的返回值类型一致

  4. parameterType参数类型必须和接口方法的参数类型一致

不遵守,则会报错

image

7.编写单元测试代码

public class UserTest {
    
    @Test
    public void test1() throws IOException {
        //加载Mybatis核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
        //根据核心配置文件获取SqlSession工厂
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //通过SqlSession工厂获取SqlSession
        SqlSession sqlSession = build.openSession();
        //通过SqlSession获取Mapper接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //执行对应的方法,会通过映射查找对应的sql语句执行
        List<User> allUser = mapper.findAllUser();
        System.out.println(allUser);
    }
    
}

4. Mybatis快速入门-Mapper映射文件引入方式

1.Mybatis核心配置文件中引入映射配置文件除了之前的方式,还可以使用Mapper映射的方式引 入。

<!--加载映射文件设置-->
<mappers>
    <!--直接加载映射文件-->
    <!--<mapper resource="mapper/UserMapper.xml"></mapper>-->
    
    <!--直接加载硬盘上的映射文件-->
    <!--<mapper url="file:///D:\Lesson\WorkSpace\LanOuWorkSpace\ZZJ230201WorkSpace\IDEA\Mybatis\Mybatis-Day01\src\main\resources\mapper\UserMapper.xml"></mapper>-->
    <!--根据mapper接口加载对应的映射文件
        遵守规则:
            1.mapper接口的类名必须和mapper.xml的名称一致
            2.mapper接口的包名必须和mapper.xml的包名一致
    -->
    <!--<mapper class="com.test.mapper.UserMapper"></mapper>-->
    <!--通过包扫描加载映射配置文件
        遵守规则:
            1.mapper接口的类名必须和mapper.xml的名称一致
            2.mapper接口的包名必须和mapper.xml的包名一致
    -->
    <package name="com.test.mapper"/>
</mappers>

注意:Mapper映射的方式要求Mapper接口和映射文件的包名、文件名一致,不一致会报错。
image

如上图所示,如果不一致,执行会报如下错误:

image

改为一致,则可以成功

image

通过查看编译之后的代码可以知道,当Mapper接口和映射文件包名、类名一致时,编译之后, Mapper接口和映射文件是在一个包下的。

5. Mybatis快速入门-添加

2.映射文件中编写添加sql语句

<!-- insert表示添加 -->
<!-- parameterType:sql语句所需参数的实体类类型,会自动进行ORM对象关系映射 -->
<insert id="insert" parameterType="user">
	insert into user values (#{id},#{userName},#{password})
</insert>

3.Mapper接口中编写对应的方法

public interface UserMapper {

    public List<User> findAllUser();
    
    public void insert(User user);
    
}

4.单元测试编写对应的代码

@Test
public void test2() throws IOException {
    //加载Mybatis核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
    //根据核心配置文件获取SqlSession工厂
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //通过SqlSession工厂获取SqlSession
    SqlSession sqlSession = build.openSession();
    //通过SqlSession获取Mapper接口的代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    User user = new User(3,"zhangsan","123456");
    mapper.insert(user);
}

执行之后发现数据库中没有增加数据

image

这是因为mybatis在执行操作的时候,会开启事务,默认事务不自动提交,必须手动提交,所以可以改为

@Test
public void test2() throws IOException {
    //加载Mybatis核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
    //根据核心配置文件获取SqlSession工厂
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //通过SqlSession工厂获取SqlSession
    SqlSession sqlSession = build.openSession();
    //通过SqlSession获取Mapper接口的代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User(3,"zhangsan","123456");
    mapper.insert(user);
    
    sqlSession.commit();//提交事务
    //sqlSession.rollback();//回滚事务
}

当然如果不想手动提交事务,可以在获取sqlSession的时候,进行自动事务提交开启配置。

@Test
public void test2() throws IOException {
    //加载Mybatis核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("Map-Config.xml");
    //根据核心配置文件获取SqlSession工厂
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    //通过SqlSession工厂获取SqlSession
    SqlSession sqlSession = build.openSession(true);//true:自动提交事务
    false:不自动提交事务,默认
    //通过SqlSession获取Mapper接口的代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    User user = new User(3,"zhangsan","123456");
    mapper.insert(user);
    
    //sqlSession.commit();//提交事务
    //sqlSession.rollback();//回滚事务
}

6. 深入了解Mybatis的API

6.1 SqlSessionFactory

一个SqlSessionFactory表示一个连接会话工厂

一个SqlSessionFactory只能连接一个数据库实例,如果需要连接多个数据库,需要构建多个 SqlSessionFactory对象。

在构建SqlSesssionFactory时可以指定environment的id,表示使用指定的数据源来构建factory 对象

//参数2:数据源名称
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(in, "default");

SqlSessionFactory是线程安全。

6.2 SqlSession

一个SqlSession对象代表一次到数据库的会话 ,该对象有以下功能:

  • 获取Mapper实现类
  • 处理事务操作

注意: SqlSession对象是非线程安全的,在多线程环境下,建议不要作为类的全局属性来用。

6.3 Mapper

  • Mapper接口类(dao接口类)

    定义了增删改查的方法。注意,必须是Interface类型,而且方法只需要定义就可以了。

  • Mapper配置文件(映射配置文件)

    Mapper配置文件中就是负责实现接口中的方法,它定义了具体要执行什么SQL语句,如何映射结果集。

    • 配置文件中select、delete、update、insert标签的id必须是对应接口中的方法名。
    • mapper文件的namespace属性需要对应Mapper接口的完全类型限定名。

7. 深入Mybatis核心配置文件

7.1. 核心配置文件的作用

核心配置文件是Mybatis的入口,它里面可以配置mybatis的具体参数、数据源、类型别名、关联映射文件等。

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构 如下:

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseldProvider(数据库厂商标识)
    • mappers(映射器)

注意:上面的顺序就是实际配置顺序,顺序不对会报错的。

详细的参数配置说明参见:Mybatis3核心配置文件官方说明

7.2. Properties属性配置

属性配置可以直接在properties内部配置,也可以引入外部配置文件,如果两个都使用了,外 部配置文件会覆盖properties内部的配置。

<!--加载外部配置文件-->
<!--
url="file:///D:\Lesson\WorkSpace\LanOuWorkSpace\ZZJ220603WorkSpace\Mybatis\
Mybatis-QuickStart\src\main\resources\jdbc.properties" -->
<!--外部文件配置 resource和url不能同时使用-->
<properties resource="jdbc.properties">
	<property name="jdbc.username" value="root"/>
</properties>

<!-- 使用外部properties文件中定义的属性 -->
<dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</dataSource>

7.3. Settings设置参数

Mybatis支持的设置参数非常多, 其中绝大多数我们都无需关注。

比较有用的参数:

<settings>
    <!--
        是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性
    名aColumn(默认关闭)
    -->
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

7.4. TypeAliases类型别名

类型别名可为 Java 类设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写 。

配置了别名的类型在映射文件中就可以使用类的别名,而不用写全名称了。

使用示例:

<!--定义别名,在映射文件中使用的时候可以不用再使用全类名,直接使用别名即可-->
<typeAliases>
    <!-- 单独类设置 -->
    <typeAlias type="com.test.quickstart.pojo.User" alias="user">
</typeAlias>
</typeAliases>

也支持将整个包下所有类批量指定别名,这也是我们最经常的做法

<typeAliases>
	<package name="com.test.quickstart.pojo"/>
</typeAliases>

使用的时候(在映射文件中)

<select id="selectUser" resultType="user">
	select * from user;
</select>

Mybatis针对一些常见的Java类型内建了类型别名,具体如下:

image

image

image

7.5. Plugins配置插件

Mybatis插件的作用是在执行语句的过程中进行拦截,插入用户自定义的操作 。

通过 MyBatis 提供的强大机制,我们可以很方便的扩展Mybatis的功能,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。

在实际的开发中,通常不需要自己去定义插件, 而是使用别人已经写好的插件,后面我们会学习Mybatis分页插件的使用。

7.6. Environments配置数据源和事务

在Mybatis中数据源和事务都是放在一个叫做 environments (环境)的标签中来配置的。

一个 environments 标签可以包含若干个 environment 标签,每个 environment 标签对应一个 数据源和一套事务配置。

配置示例:

<!--数据库连接-->
<!--default:默认使用的数据库环境表示-->
<environments default="default">
    <!-- 数据库环境配置 id:数据库环境标识-->
    <environment id="default">
        <!-- 使用的事务管理类型 -->
        <transactionManager type="jdbc"></transactionManager>
        <!-- 数据源配置 type:使用的数据库连接池类型 -->
        <dataSource type="POOLED">
            <!-- 可以直接写 -->
            <!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
            <!-- 也可以通过${}获取外部配置文件内容 -->
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

7.6.1. 事务管理器

在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚,而是让容器来管理事务的整个生命周期(比如 J2EE 应用服务器的上下文)。

如果使用了Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

后面我们会使用Spring来管理事务,Mybatis中的事务很弱,可以不做了解。

7.6.2. 数据源

Mybatis支持三种数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。

POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实 例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。

除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:

  • poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
  • poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
  • poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
  • poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
  • poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置,作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超 过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)
  • poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
  • poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。

JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部 配置数据源,然后放置一个 JNDI 上下文的数据源引用。(用的比较少,这里不做过多介绍)

在实际的开发中,数据源往往是交给Spring来管理, 这里只做了解即可。

7.7. Mappers管理映射配置文件

mybatis支持四种方式配置

1. 添加类路径下XML映射文件

<!-- 使用相对于类路径的资源引用 -->
<mappers>
	<mapper resource="mappers/UserMapper.xml"/>
</mappers>

2. 添加物理绝对路径映射文件

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
 <mapper url="file:///D:/Lesson/WorkSpace/Test/Mybatis/MybatisQuickStart/src/main/resources/mapper/UserMapper.xml"></mapper>
</mappers>

3. 以映射器实现类的完全限定名类名配置

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
	<mapper class="com.test.quickstart.mapper.UserMapper"/>
</mappers>

4. 将某个包下所有的映射器添加进来

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
	<package name="com.test.quickstart.mapper"/>
</mappers>

注意事项(针对第3种和第4种)

  1. 映射文件必须和Mapper接口包名一致

  2. 映射文件必须和Mapper接口文件名一致

  3. 映射文件中的namespace必须为接口全类名

  4. sql语句的statement id必须和接口中的方法名一致

  5. 映射文件中的resultType返回值类型必须和接口方法中的返回值类型一致

  6. 映射文件中的parameterType参数类型必须和接口方法的参数类型一致

8. SqlSessionFactory工具类

在单元测试的时候,我们每写一个单元测试,就需要写一次构建SqlSessionFacotry的代码,太麻烦了,我们可以将构建SqlSessionoFactory的代码封装成一个工具类。

创建MybatisUtil.java工具类

public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    public static SqlSessionFactory getSqlSessionFactory(String xml) {
        return createSqlSessionFactory(xml, null);
    }

    public static SqlSessionFactory getSqlSessionFactory(String xml, String env) {
        return createSqlSessionFactory(xml, env);
    }

    private static SqlSessionFactory createSqlSessionFactory(String xml, String env) {
        if (sqlSessionFactory == null) {
            synchronized (MybatisUtil.class) {
                if (sqlSessionFactory == null) {
                    try {
                        InputStream resourceAsStream = Resources.getResourceAsStream(xml);
                        if (env == null) {
                            sqlSessionFactory = new
                                    SqlSessionFactoryBuilder().build(resourceAsStream);
                        } else {
                            sqlSessionFactory = new
                                    SqlSessionFactoryBuilder().build(resourceAsStream, env);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("加载核心配置文件失败");
                    }
                }
            }
        }
        return sqlSessionFactory;
    }
}

在单元测试中使用工具类

@Test
public void test3() throws IOException {
    SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory("Map-Config.xml");
    //通过SqlSession工厂获取SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession(true);//true:自动提交事务 false:不自动提交事务,默认
    //通过SqlSession获取Mapper接口的代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //执行对应的方法,会通过映射查找对应的sql语句执行
    List<User> allUser = mapper.findAllUser();
    System.out.println(allUser);
}

@Test
public void test4() throws IOException {
    SqlSessionFactory sqlSessionFactory =
MybatisUtil.getSqlSessionFactory("Map-Config.xml", "default");
    //通过SqlSession工厂获取SqlSession
    SqlSession sqlSession =sqlSessionFactory.openSession(true);//true:自动提交事务 false:不自动提交事务,默认
    //通过SqlSession获取Mapper接口的代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User(4,"lisi","123456");
    mapper.insert(user);
}

标签:02,Mapper,映射,配置文件,SqlSession,Mybatis,public,MyBatis01
From: https://www.cnblogs.com/jiabaolatiao/p/17519642.html

相关文章

  • 2023年光伏行业发展面临哪些困难和挑战?拆卸组件回收
    (昆山鹏欣硅片硅料回收公司:摘要关键词:硅片回收,硅料回收,电池片回收,组件回收,逆变器回收,多晶硅回收,单晶硅回收,太阳能电池板回收)光伏行业发展取得突破的同时,也面临一些困难和挑战。补贴缺口持续扩大。国家能源局有关负责人介绍,截至2017年底,累计可再生能源发电补贴缺口总计达到1127亿元......
  • 2023年我国硅片总产能有多少?
    (昆山鹏欣硅片硅料回收公司:摘要关键词:硅片回收,硅料回收,电池片回收,组件回收,逆变器回收,多晶硅回收,单晶硅回收,太阳能电池板回收)2018年底,国内硅片总产能174GW,其中单晶硅片约81GW,超过多晶硅片。而今年仅隆基、中环、晶科三家扩产规模就高达80GW!直接让单晶硅片的产能至少翻一番! ......
  • 2023年光伏将回到快速发展轨道
    (昆山鹏欣硅片硅料回收公司:摘要关键词:硅片回收,硅料回收,电池片回收,组件回收,逆变器回收,多晶硅回收,单晶硅回收,太阳能电池板回收)近日,记者从苏州光伏产业协会得到一份苏州光伏产业2012年调研报告,这份材料显示,在过去的一年中,苏州市光伏企业在欧美双反中遭遇巨大冲击,多数企业业绩均出现严......
  • JDK ,JRE ,JVM的关系02
     JDK:JavaDevelopmentKit(Java开发者工具,JDK相当于在JRE的基础上扩充了一些开发工具,JDK包含JRE)JRE:JavaRuntimeEnvironment(Java运行时环境,只要安装JRE就可以运行java程序了)JVM:JAVAVirtualMachine(java虚拟机,可以理解为是一种规范)  JDK 包含JRE和JVM JRE包含......
  • 02修剪标准&&方法
    2.1修剪标准2.1.1基于权重大小的修剪标准参考上一节,对权重做绝对值按大小修剪,或者做L1/L2范数来进行修剪2.1.2基于梯度幅度来修剪基于前面可知,我们按照值的大小来修剪,把值小的裁剪掉了,或者说某个权重在训练过程中一直不变,直观上感觉没有那么重要。但其实这样是不对的,从梯度上......
  • 【哈佛cs50 2022】lab3 & problemSet3【ing】
    (1)lab3如何测试每个代码运行所需要的时间?time./sort1sorted5000.txt sort1sort2sort3sorted5000.txt0.037s0.020s0.045ssorted10000.txt0.058s0.050s0.151ssorted50000.txt1.244s2.238s5.637sreversed5000.txt0.088s0.026s0.045srever......
  • 【题解】#119. 最大整数 题解(2023-07-01更新)
    #119.最大整数题解题目传送门更新日志2023-05-2617:20文章完成2023-05-3015:22文章审核通过2023-07-0116:04修改了代码题目知识点字符串+贪心题意说明设有n个正整数($n<20$),将它们连接成一排,组成一个最大的多位整数。(题目简介明了,一看就是出题人懒得写题目背景)......
  • (2023.7.1)DPAA手册熟悉
    //路径https://www.nxp.com.cn/design/documentation:DOCUMENTATION#/collection=documents&start=0&max=12&language=cn&query=type%3E%3E%E5%BA%94%E7%94%A8%E7%AC%94%E8%AE%B0&sorting=ModifiedDate.desc&keyword=dpaaAN13329:  ......
  • 2023暑假软件工程打卡第一周
    一、学习使用cmd命令窗口1、打开cmd①、按下win+R键,在计算机中会出现运行窗口。 ②、输入cmd,点击回车,进入cmd命令窗口。 2、输入cmd命令①、常见的cmd命令Ⅰ、盘符加冒号。  因为默认为再C盘路径下操作,如果我们输入盘符+冒号后进行回车,我们就可以转换为在此盘符下操......
  • 【题解】P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    P8741[蓝桥杯2021省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-0923:19文章完成2023-05-0923:20通过审核2023-06-2021:03优化了文章代码格式试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能......