对于web开发的人来说mybatis并不陌生,用官网的话来说MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。它的优势在于消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。使用框架一般使用约定大于配置的方式。
Mybatis使用
- 编程式
- 集成式(容器,如spring)
建议使用的时候不要使用example,便于后期排查问题。Mapper的注解和xml方式兼容,但是两者对应的一个方法不能同时存在。
作用域
实体类 | 编程式scope | 集成式scope |
---|---|---|
SqlSessionFactoryBuilder | method | method |
SqlSessionFactory | application | application |
SqlSession | request/method(线程级) | request/method(线程级) |
Mapper | method | application(mapper在spring框架中是单例的,mapper 内部不包含 成员字段,无状态单例是安全的,一直存在不用每次调用都new 一个新实例) |
Config 文件部分解读
environment
typeHandler:用于JavaType<->JdbcType转化,可以自定义想要的转换方式
plugins:类似拦截器,但只能在以下操作时进行拦截:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
Mapper 文件解读
- namespace:关联对应的接口,区分类似package
- resultType/resultMap(支持对应字段联合查询):返回值对应到类或者用Map一一映射resultType/resultMap(支持对应字段联合查询):返回值对应到类或者用Map一一映射
- parameterType/
parameterType:参数,现都使用parameterTypeparameterType/parameterType:参数,现都使用parameterType - sql:类似定义变量,可引入的通用sqlsql:类似定义变量,可引入的通用sql
- CRUD:useGeneratedKeys自动生成主键CRUD:useGeneratedKeys自动生成主键
- 动态sql动态sql
- 缓存:mybatis有一级和二级缓存。
一级缓存是SqlSession级别的(减小数据库压力,如果多次调用查询同一个数据期间修改会存在脏数据的问题但基本不会出现),默认开启;
二级缓存是基于Mapper级别的(减轻数据库压力,容易造成脏数据的问题且有更新全部失效不建议使用,一般使用redis等第三方缓存替代),默认关闭。
基本常识
- 分页
1)逻辑分页mybatis自带,不建议使用
org.apache.ibatis.executor.resultset.DefaultResultSetHandler$handleRowValuesForSimpleResultMap
2)物理分页
select … limit 0,10
三方插件PageHelper或自己实现 - 批量操作
方式 | 性能 | 缺点 |
---|---|---|
for循环一个一个插入 | 低 每次都要IO | |
foreach拼SQL(性能最高,推荐) | 高 | 有sql长度限制 show variables like ‘%packet%’ show variables like ‘%net_buffer%’ |
ExeutorType.BATCH | 高 | 需要配置BATCH的SqlSessionTemplate |
- 联合查询
1)嵌套结果
2)嵌套查询:Lazy loading