Mybatis:
- 可以说是半个ORM(对象关系映射)的持久层框架,其内部进行对JDBC的封装,在开发是只需要关注SQL语句的优化问题等,没有必要进行频繁的驱动加载、数据库连接、创建statement等操作。
- 通过注解和XML两种方式映射原生信息(实体类与数据库表的映射)
- 优点:(1)编写SQL非常灵活,接触SQL与程序的耦合,支持动态SQL(if,choose,trim,when,otherwise,foreach等标签),可重用性高。(2)代码量少,消除JDBC的代码冗余,自动资源的开关。(3)兼容性强,可以市面上大多数的数据库软件整合使用。(4)能与Spring很好的集成,提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象组件的维护。
- 缺点:SQL依赖数据库,造成数据库可移植性不好,不能随意更换数据库
Mybatis的执行过程
mybatis的底层原理就是:动态代理;本质就是:反射机制
#{ }与${}的区别:
#{} 是预编译处理,${}是字符串的替换。
Mybatis处理#{}是,将它替换成问号?,在调用PreparedStatement的set方法进行赋值;而 $ { }只是将里面的值替换成变量的值。
还有就是#{}能防止SQL的注入,提高系统安全性。
实体类中的属性名与表中的字段不一致时怎么办:
- 通过在SQL语句定义字段名的别名,让字段名的别名与实体类的属性名一直就行了。
- 通过映射字段名和实体属性名一一对应就行了。在resultMap中使用id属性映射主键字段,使用result属性映射非主键字段,其中property是实体类的属性名称,column是数据库表的字段名。
分页:
使用RowBounds对象进行分页,
使用第三方插件分页(pageHelper)
1对1的操作
联合查询:几张表进行联合查询,只进行一次,通过resultMap中的association配置1对1的类即可
嵌套查询:先查一张表,再根据这个表的结果里的id再去查询另一张表的内容,也是通过association配置,但是另一张就是普通的select的。
Mybatis缓存
- MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
- MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
- 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
- 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
- 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
一级缓存:
基于PerpetualCache的HashMap本地缓存,它的声明周期和SqlSession一致,有许多SqlSession或者分布式的环境中数据库操作,可能出现脏读数据。当Session flush或者close之后,该Session中的所有缓存就被清空,默认一级缓存是被开启的。
二级缓存
- 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
- 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
- 工作机制
- 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
- 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
- 新的会话查询信息,就可以从二级缓存中获取内容;
- 不同的mapper查出的数据会放在自己对应的缓存(map)中;
- 开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。
- 缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。