一、MyBatis框架

数据访问层ORM框架,基于对象操作实现数据访问层交互,数据访问层零实现(没有实现类)
image.png
通过xml或者注解进行配置,实现java对象与sql语句的对应关系(映射)

jar包依赖

  1. <!--MySQL依赖-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.38</version>
  6. </dependency>
  7. <!--mybatis依赖-->
  8. <dependency>
  9. <groupId>org.mybatis</groupId>
  10. <artifactId>mybatis</artifactId>
  11. <version>3.5.4</version>
  12. </dependency>
  13. <!--日志依赖-->
  14. <dependency>
  15. <groupId>org.slf4j</groupId>
  16. <artifactId>slf4j-log4j12</artifactId>
  17. <version>1.7.30</version>
  18. </dependency>

二、配置文件

配置步骤:
1、使用 configuration 标签
2、引入数据库连接文件image.png
3、总配置文件:
使用environments 标签,可配置多个对象,属性 default 的值为默认的 environment 的id
设置环境(包括数据源和事务管理器):
JDBC:JdbcTransactionFactory 使用jdbc默认事物
MANAGED:ManagedTransactionFactory 自定义事务管理
dataSource:
JNDI:使用JDNI数据源
POOLED:使用连接池数据源
UNPOOLED:不使用连接池的数据源
image.png

4、配置mapper配置文件时,需要在总配置文件加上mapper配置文件的映射路径
image.png
5、配置mapper配置文件
使用 mapper 标签
属性namespace用于设置命名空间,需要与接口的全限定名一直,如果是在同级目录可以不遵守该规则
image.png
mybatis会根据当前配置创建一个Mapper对象 声明对象id为com.qt.mapper.RoleMapper
insert等标签会创建成为MapperStatement对象

image.png
id与接口方法名一致
parameterType与方法的参数类型全限定名对应
mybatis根据占位符表达式来决定使用哪种语句对象
#{属性名}:mybatis会以预编译语句对象来进行sql操作 属性名与方法参数的对象的属性名对应,可替代sql语句中的
${属性名}:直接输出值,可以使表名
如果是 _#{}_ mybatis会以PreparedStatement来执行sql
_${}_ 则会以Statement来执行sql 需要结合参数池自定义参数名使用
当方法只有一个参数的时候,只需要类型一致即可

image.png
resultType设置返回的一条记录对应的Java对象类型全限定名
mybatis根据该属性对一条记录自动映射到一个对应配置的Java对象中
自动映射必须保证数据表的字段名与实体类的属性名一致

可以使用别名简写替代全限定名,需要现在总配置文件中设置
image.png

若数据库中字段和实体对象中字段名不一致时,需要在主配置文件设置转驼峰
image.png

三、工具类

  1. /**
  2. * 1.通过Resources读取总配置文件
  3. * 2.创建SqlSessionFactoryBuilder
  4. * 3.创建SqlSessionFactory
  5. * 4.创建SqlSession
  6. */
  7. private static SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
  8. /**
  9. * ThreadLocal:本地线程对象 key:value——本地线程对象:sqlSession
  10. * 通过将SqlSessioin与本地线程绑定,可以让用户与程序交互的时候是唯一一个连接
  11. * 通过牺牲控件换取线程安全
  12. */
  13. private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
  14. public static SqlSessionFactory getSqlSessionFactory(){
  15. try {
  16. Reader reader = Resources.getResourceAsReader("config.xml");
  17. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  18. return sqlSessionFactory;
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. return null;
  23. }
  24. /*获取每个用户的唯一sqlSession会话对象*/
  25. public static SqlSession getSqlSession(){
  26. SqlSession sqlSession = threadLocal.get();
  27. if (null==sqlSession){ // ThreadLocal中不存在当前用户的本地线程对象key
  28. sqlSession = sqlSessionFactory.openSession();
  29. threadLocal.set(sqlSession); // 放入ThreadLocal中
  30. }
  31. return sqlSession;
  32. }

四、注解配置

在接口中使用注解,需要主配置文件,但不需要mapper配置文件
image.png
使用注解需要在主配置文件中将映射文件设置为该接口,而不是mapper配置文件
image.png

五、其他Mapper配置

mybatis是先操作数据库,返回投影结果后,再进行实体类映射通过自定义结果映射可以处理任意不同的映射封装resultMap指定已经配置好的映射配置id

多参数配置(分页查询):
在接口中,方法参数将参数自定义命名,然后在mapper配置文件使用表达式 #{自定义命名} 传递参数

ResultMap:
用于手工关联实体类数据库表的字段的关联关系(当数据库表字段名与实体类字段名不一致时使用)

<!--
    type指定需要映射的java对象类型
    -->
    <resultMap id="userMap" type="cn.nyse.entity.User2" >
        <!--
        id标签必须有用于设置数据库对应的主键字段的封装
        column:设置表的字段名
        jdbcType:设置表的字段类型   可以使用mybatis提供的简写  将数据库类型全部改大写  可以省略会自动识别
        参考 org.apache.ibatis.type.JdbcType
        property:实体类属性名
        javaType:实体类的属性类型   可以省略会自动识别
        -->
        <id column="id" jdbcType="INTEGER" property="uid" javaType="integer" ></id>
        <!--
        result:设置非主键字段映射关系
        -->
        <result property="username" column="username"></result>
        <result property="uBirthday" column="birthday"></result>
        <result property="uSex" column="sex"></result>
        <result property="uAddress" column="address"></result>
    </resultMap>