文章目录
Mybatis开发流程
传统开发简要流程
- 导入mybatis依赖
- 配置mybatis-config.xml
- 配置mapper.xml
- 定义接口及其实现类
接口代理开发简要流程
- 导入mybatis依赖
- 配置mybatis-config.xml
- 配置mapper.xml
- 定义接口
接口开发六点注意事项
- 映射文件目录与接口所在目录一致 (不一致需要 指定地址 mapper-locations:classpath: )
- 映射文件名与接口名一致
- namespace设置为接口的全限定类名
- id 为接口方法名一致
- parameterType应与接口形参类型一致 (一般不写 ,写就要写对)
- resultType与接口方法返回值类型一致
sqlMapperConfig 核心配置文件
mybatis相关API
输入输出映射
如果数据库表字段名称和实体类属性名称不一致,那么可以使用三种方式解决:设置别名、设置 驼峰规则、resultMap。
常用动态Sql标签
动态sql执⾏原理
1. SqlResource
该接⼝含义是作为sql对象的来源,通过该接⼝可以获取sql对象。其唯⼀的实现类是
XmlSqlResource,表示通过xml⽂件⽣成sql对象。
2. Sql
该接⼝可以⽣成sql语句和获取sql相关的上下⽂环境(如ParameterMap、ResultMap等),有三个
实现类: RawSql表示为原⽣的sql语句,在初始化即可确定sql语句;SimpleDynamicSql表示简单
的动态sql,即sql语句中参数通过$property$⽅式指定,参数在sql⽣成过程中会被替换,不作为
sql执⾏参数;DynamicSql表示动态sql,即sql描述⽂件中包含isNotNull、isGreaterThan等条件
标签。
3. SqlChild
该接⼝表示sql抽象语法树的⼀个节点,包含sql语句的⽚段信息。该接⼝有两个实现类: SqlTag表
示动态sql⽚段,即配置⽂件中的⼀个动态标签,内含动态sql属性值(如prepend、property值 等);SqlText表示静态sql⽚段,即为原⽣的sql语句。每条动态sql通过SqlTag和SqlText构成相应的
抽象语法树。
4. SqlTagHandler
该接⼝表示SqlTag(即不同的动态标签)对应的处理⽅式
5. SqlTagContext
⽤于解释sql抽象语法树时使⽤的上下⽂环境。通过解释语法树每个节点,将⽣成的sql存⼊
SqlTagContext。最终通过SqlTagContext获取完整的sql语句。
分步查询
什么是分步查询 : 概念:将一次多表查询拆分多次单表查询 为延迟加载做铺垫
延迟加载
MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。
例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。
MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。
注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能
是使用多表连接所进行的select查询
延迟加载失效的情况
对象调用 toString hashcode equals 等方法都会使的延迟加载失效
延迟加载原理
使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用A.getB().getName(),拦截器invoke()方法发现A.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用A.setB(b),于是a的对象b属性就有值了,接着完成A.getB().getName()方法的调用。
缓存机制
好处:减少了数据库的查询次数,提高了执行效率
坏处:影响了数据的时效性,会产生脏数据
二级缓存默认是关闭的,当设置了cacheEnabled=true后,在mapper.xml中设置cache标签就会去创建一个cacah对象,所以同一个mapper的mapperStatement公用同一个cache对象
一级缓存工作机制
一级缓存 是 SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。
不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的
二级缓存机制
二级缓存是 mapper 级别的缓存,多个 SqlSession 去操作同一个Mapper的sql语句,多个 SqlSession可以共用二级缓存,二级缓存是跨 SqlSession 的。
UserMapper有一个二级缓存区域(按 namespace 划分),每个 mapper 也有自己的二级缓存区域(按namespace分)。每一个 namespace 的 mapper 都有一个二级缓存区域,如果相同两个 mapper 的 namespace ,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。
注解开发常用注解
版权归原作者 秋日的晚霞 所有, 如有侵权,请联系我们删除。