一、第一个Mybatis程序
- 搭建环境
- 创建一个模块
- 编写代码
二、CRUD(增删改需要提交事务)
- namespace
namespace中包名与接口对应
- select
选择,查询语句
- id:对应namespace中的方法名
- resultType:SQL语句执行的返回值
- insert
- update
- Delete
三、万能Map(03)
如果实体类或者数据库中的表的字段或参数过多,应当考虑使用Map
四、配置解析
- 核心配置文件
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
- 环境配置
Mybatis默认的事务管理器为JDBC,连接池为POLLED
- 属性
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
- 类型别名
- 类型别名可为 Java 类型设置一个缩写名字。
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
- 设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
- 其它配置
- 映射器(mappers)
- 使用相对于类路径的资源引用 – resource
- 使用完全限定资源定位符 – url(❌不推荐)
- 使用映射器接口实现类的完全限定类名 – class
- 接口和Mapper配置文件必须同名
- 接口和Mapper配置文件必须在同一个包下
- 将包内的映射器接口实现全部注册为映射器 – name
五、问题
- 解决列名不匹配 – 结果映射(resultMap)
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
六、日志(03)
- 日志工厂
如果数据库操作出现异常,需要排错,使用日志实现。
- Log4j
日志级别 – INFO、DEBUG、ERROR
七、分页(03)
- 目的 – 减少数据的处理量
八、注解开发(04)
- 使用注解开发
- CRUD
我们可以在工具类创建的时候自动提交事务
- 关于@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
- @Data
无参构造,get, set, tostring, hashcode, equals
- ……
十、多对一处理(05)
- 测试环境搭建
- 导入lombok
- 新建实体类
- 建立Mapper接口
- 建立Mapper.xml文件
- 在核心配置文件中绑定注册Mapper接口或文件
- 测试
- 查询方式
- 子查询
- 联表查询
十一、一对多处理(06)
- 查询方式
- 按结果嵌套处理
- 按查询嵌套处理
- 小节
- 关联 – association 【多对一】
- 集合 – collection 【一对多】
- Javatype & oftype
- 前者用来指定实体类中属性的类型
- 后者用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
- 注意点
- 保证SQL的可读性
- 注意一对多和多对一中字段的问题
- 使用日志排查问题
十二、动态SQL(07)
(根据不同的条件生成、拼接不同的SQL语句)
- if
- choose, when, otherwise
- trim, where, set
- SQL片段
使用SQL标签抽取公共部分,在需要使用的地方使用include标签引用
- 最好基于单表来定义SQL片段
- 不要存在where标签
- foreach
十三、缓存
- 一级缓存(本地缓存)
- 与数据库同一次会话期间查询到的数据会放在本地缓存中
- 如果需要再次获取相同的数据,直接从缓存中获取
失效情况:
- 查询不同的东西
- 增删改操作,可能改变原有数据,缓存被刷新
- 查询不同的Mapper.xml
- 手动清理缓存
- 在sqlsession连接到关闭期间有效
- 二级缓存(全局缓存)
- 基于namespace级别的缓存,一个命名空间对应一个二级缓存
- 工作机制
- 一个会话查询一条数据,该数据放在当前会话的一级缓存中
- 如果当前会话关闭,这个会话对应的一级缓存就没了,但我们想要的是,绘画关闭了,一级缓存中的数据被保存到二级缓存中
- 新的会话查询信息可以从二级缓存中获取内容
- 不同的mapper查处的数据会放在对应的缓存中
- 步骤:
- 开启全局缓存
- 在要使用二级缓存的mapper中开启
(注意序列化实体类!!!)
- 总结
- 只要开启了二级缓存,在同一个Mapper下就有效
- 所有的数据都会先放再一级缓存中
- 只有当会话提交或者关闭的时候,才会提交到二级缓存中
- 自定义缓存(ehcache)