mybatis初识

mybatis避免几乎所有的JDBC代码和手动设置参数以及获取结果集 :使用简单的XML / 注解 来配置和映射原生类型、接口 和 Java 的POJO为数据库中的记录。

  • 数据库
  • mybatis-config.xml:连接数据库+后续还要注册每一个mapper
  • MybatisUtil:获取SqlSession对象
  • 实体类
  • UserDao接口

万能map

resultMap

日志工厂

STDOUT_LOGGING

标准日志输出

  • mybatis-config.xml
    在mybatis核心配置文件中,配置我们的日志

LOG4J

1、通过使用Log4j,控制日志信息输送到控制台、文件、GUI组件; 2、控制每一条日志的输出格式; 3、控制每一条日志的级别 —— 更细致的控制日志的生成过程; 4、通过配置文件来灵活配置,而不修改代码。

  • mybatis-config.xml

  • 导入依赖

  • 配置文件log4j.properties

  • 简单使用

    • 在要Log4j的类中,导入包org.apache.log4j.Logger

    • 生成日志对象 static Logger logger = Logger.getLogger(UserDaoTest.class);

    • 日志级别

  • 日志的输出

分页

Limit分页

RowBound分页

面向对象

  • 接口

  • mapper.xml

  • 测试

分页插件PageHelper

mybatis:面向注解开发

面向接口开发

  • 接口

  • 配置文件

  • 测试

    • 本质:反射机制实现

    • 底层:动态代理

    • 源码debug分析

  • 使用注解CRUD

    • 可以在工具类创建时 实现自动提交事务

    • 编写接口,增加注解

      • 注意:@Param()注解

        • 基本类型的参数 / String类型,需要加上; 引用类型不必加入
    • 测试类

      • 注意:我们必须将接口注册到我们的核心配置文件中

        • 映射器mappers

          • 方式一:推荐使用

          • 方式二:使用class文件绑定注册

            • 接口和他的mapper配置文件必须同名
            • 接口和他的mapper配置文件必须放在同一个包下
          • 方式三:使用扫描包进行注入绑定

Lombok插件

复杂查询环境搭建:多对一

  • 关联:对学生而言,多个学生关联一个老师
    集合:对老师而言,一个老师集合很多学生

  • JavaType:用来指定实体类中属性的类型
    ofType:用来指定映射到List或者集合中的pojo类型,泛型中的约束类型


  • Student、Teacher实体类

  • 建立Mapper接口

  • 建立 Mapper.xml 文件

    改造后,teacher不为null:


  • 在核心配置文件mybatis-spring.xml绑定我们的mapper接口 / 文件

  • 测试查询是否成功


方式一:按照嵌套查询

  • 类似 子查询

方式二:按照结果嵌套查询

  • 类似 联表查询

复杂查询环境搭建:一对多

一个老师拥有多个学生

  • 实体类
  • 接口

方式一:按结果嵌套处理

  • TeacherMapper.xml

    • null:

    • 按结果嵌套查询

  • 测试

方式二:按查询嵌套处理

  • TeacherMapper.xml

动态SQL

  • 根据不同的条件生成不同的SQL语句:所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码

环境搭建

if语句

实现SQL的复用,避免重载

  • xml

  • 测试

常用标签

trim(where,set)

  • where

    • trim
  • set

  • trim

choose

Foreach

  • SQL片段:将一些功能的部分抽出来,方便复用

    • 使用SQL标签抽取公共部分

    • 在需要的地方使用Include标签引用即可

  1. - 注意事项
  2. - 最好基于单表来定义 SQL片段
  3. - 不要存在where标签
  • 动态SQL的应用场景:对一个集合进行遍历,通常是在构建IN条件语句的时候

缓存

简介

  • 放在内存中,减少和数据库交互的次数,解决了高并发的性能问题

一级缓存:本地会话缓存

  • 缓存失效的情况

    • 查询不同的东西
    • 增删改的操作,可能会改变原来的数据,所以必须刷新缓存
    • 查询不同的mapper.xml —— 二级缓存
    • 手动清理缓存
  • 一级缓存默认开启,只在一次sqlSession中有效,也就是拿到连接到关闭这个区间段。一级缓存:一个map

二级缓存:全局缓存

工作机制

  • 一个会话查询一条数据,这个数据会被放在当前会话的一级缓存中
  • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但我们想要:会话关闭了,一级缓存中的数据被保存到二级缓存中
  • 新的会话查询信息,就可以从二级缓存中获取内容
  • 不同的mapper查出的数据会放在自己对应的缓存map中

步骤

  • 开启全局缓存

    • cacheEnabled:全局地开启 / 关闭配置文件中的 所有映射器已经配置的任何缓存 (默认:true)
  • 在要使用二级缓存的mapper中开启

    • 也可以自定义参数

      • flushInterval
      • size
      • readOnly
      • 提示:二级缓存是事务性的,这意味着:当sqlSession完成并提交时,或是完成并回滚,但没有执行flushCache=true的insert/update/delete语句时,缓存会获得更新。
  • 测试

    • 问题:我们需要将实体类 序列化,否则可能报错

  • 小结

    • 只要开启了二级缓存,在同一个mapper下就有效
    • 所有的数据都会先放在一级缓存中
    • 只有当会话提交 / 关闭的时候,才会提交到二级缓存中

mybatis缓存原理

  • 原理
  • 调优使用

自定义缓存 Ehcache

  • ehcache.xml
  • UserMapper.xml:指定我们的ehcache实现