MyBatis学习笔记
MyBatis学习笔记

MyBatis学习笔记

一、第一个Mybatis程序

  1. 搭建环境
  2. 创建一个模块
  3. 编写代码

二、CRUD(增删改需要提交事务)

  1. namespace

namespace中包名与接口对应

  1. select

选择,查询语句

  • id:对应namespace中的方法名
  • resultType:SQL语句执行的返回值
  1. insert
  2. update
  3. Delete

三、万能Map(03)

如果实体类或者数据库中的表的字段或参数过多,应当考虑使用Map

四、配置解析

  1. 核心配置文件
  1. 环境配置

Mybatis默认的事务管理器为JDBC,连接池为POLLED

  1. 属性

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

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

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

  1. 其它配置
  2. 映射器(mappers)
  • 使用相对于类路径的资源引用 – resource
  • 使用完全限定资源定位符 – url(❌不推荐)
  • 使用映射器接口实现类的完全限定类名 – class
    • 接口和Mapper配置文件必须同名
    • 接口和Mapper配置文件必须在同一个包下
  • 将包内的映射器接口实现全部注册为映射器 – name

五、问题

  1. 解决列名不匹配 – 结果映射(resultMap)

ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

六、日志(03)

  1. 日志工厂

如果数据库操作出现异常,需要排错,使用日志实现。

  1. Log4j

日志级别 – INFO、DEBUG、ERROR

七、分页(03)

  1. 目的 – 减少数据的处理量

八、注解开发(04)

  1. 使用注解开发
  2. CRUD

我们可以在工具类创建的时候自动提交事务

  1. 关于@Param()注解
  • 参数为基本类型或String类型,需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型的话,可以忽略,但是建议加上
  • 在SQL中引用的就是@Param()中设定的属性名

九、Lombok(04)

@Getter and @Setter

@FieldNameConstants

@ToString

@EqualsAndHashCode

@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor

@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog

@Data

@Builder

@SuperBuilder

@Singular

@Delegate

@Value

@Accessors

@Wither

@With

@SneakyThrows

@val

@var

experimental @var

@UtilityClass

  1. @Data

无参构造,get, set, tostring, hashcode, equals

  1. ……

十、多对一处理(05)

  1. 测试环境搭建
    1. 导入lombok
    2. 新建实体类
    3. 建立Mapper接口
    4. 建立Mapper.xml文件
    5. 在核心配置文件中绑定注册Mapper接口或文件
    6. 测试
  2. 查询方式
  • 子查询
  • 联表查询

十一、一对多处理(06)

  1. 查询方式
  • 按结果嵌套处理
  • 按查询嵌套处理
  1. 小节
  • 关联 –  association 【多对一】
  • 集合 – collection 【一对多】
  • Javatype & oftype
    • 前者用来指定实体类中属性的类型
    • 后者用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
  1. 注意点
  • 保证SQL的可读性
  • 注意一对多和多对一中字段的问题
  • 使用日志排查问题

十二、动态SQL(07)

(根据不同的条件生成、拼接不同的SQL语句) 

  • if
  • choose, when, otherwise
  • trim, where, set
  • SQL片段

使用SQL标签抽取公共部分,在需要使用的地方使用include标签引用

  • 最好基于单表来定义SQL片段
  • 不要存在where标签
  • foreach

十三、缓存

  1. 一级缓存(本地缓存)
  • 与数据库同一次会话期间查询到的数据会放在本地缓存中
  • 如果需要再次获取相同的数据,直接从缓存中获取

失效情况:

  • 查询不同的东西
  • 增删改操作,可能改变原有数据,缓存被刷新
  • 查询不同的Mapper.xml
  • 手动清理缓存
  • 在sqlsession连接到关闭期间有效
  1. 二级缓存(全局缓存)
  • 基于namespace级别的缓存,一个命名空间对应一个二级缓存
  • 工作机制
    • 一个会话查询一条数据,该数据放在当前会话的一级缓存中
    • 如果当前会话关闭,这个会话对应的一级缓存就没了,但我们想要的是,绘画关闭了,一级缓存中的数据被保存到二级缓存中
    • 新的会话查询信息可以从二级缓存中获取内容
    • 不同的mapper查处的数据会放在对应的缓存中
  • 步骤:
    1. 开启全局缓存
    2. 在要使用二级缓存的mapper中开启

(注意序列化实体类!!!)

  • 总结
    • 只要开启了二级缓存,在同一个Mapper下就有效
    • 所有的数据都会先放再一级缓存中
    • 只有当会话提交或者关闭的时候,才会提交到二级缓存中
  1. 自定义缓存(ehcache)

发表评论

您的电子邮箱地址不会被公开。