目录
3.2、一个mapper.xml对应一个Dao接口,该Dao接口工作原理
1、Mybatis介绍
1.1、什么是Mybatis
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句即可。
通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
1.2、Mybaits的优缺点
(1)优点
- 消除了JDBC大量冗余的代码,不需要手动开关连接;
- 基于SQL语句编程,相当灵活;
- 与各种数据库兼容
(2)缺点
- SQL语句的编写工作量较大
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
1.3、#{}和${}的区别
${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性
1.4、如何在MyBatis中进行分页查询
(1)使用limit和offset
(2)使用RowBounds
(3)使用插件或自定义分页插件,如PageHelper
1.5、延迟加载
(1)什么是MyBatis延迟加载
是指在需要使用关联对象时才加载关联对象的数据,而不是在查询主对象时立即加载关联对象的数据,可以减少不必要的数据库查询。
(2)如何开启延迟加载
lazyLoadingEnabled配置文件方式:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
fetchType属性方式:略
2、 MyBatis的工作原理
(1)加载配置
MyBatis首先会加载配置文件,包括数据库连接信息、SQL映射文件的位置、插件等配置信息
(2) 解析映射:解析SQL映射文件,将内容解析成相应的数据结构
(3) 创建SqlSession
当应用程序需要执行SQL时,MyBatis会创建一个SqlSession对象,SqlSession提供了对数据库操作的接口
(4)执行SQL
通过SqlSession执行SQL命令,在执行SQL之前,MyBatis会通过参数映射将Java对象的属性值传递给SQL语句
(5)结果映射:当SQL执行完毕后,MyBatis会将结果集映射为Java对象
(6)缓存处理
MyBatis支持一级缓存和二级缓存,在执行SQL时会根据配置对缓存进行处理,以提高查询性能
(7) 关闭资源:SQL执行完毕后,MyBatis会关闭SqlSession并释放相关的数据库连接和资源。
3、MyBatis与XML
3.1、不同的Xml映射文件,id是否可以重复
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;原因就是namespace+id是作为Map的key使用的(新版本的namespace已经是必填项了)
3.2、一个mapper.xml对应一个Dao接口,该Dao接口工作原理
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象 MappedProxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,因为在Mybatis中每一个SQL标签,都会被解析为一个MapperStatement对象,最后将sql执行结果返回。
4、MyBatis与插件
4.1、插件运行原理
Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法
4.2、如何编写一个插件
实现Mybatis的Interceptor接口并复写intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件
4.3、MyBatis如何分页的(limit内存分页)
使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。
4.4、分页插件的原理(物理分页)
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。根据dialect方言,添加对应的物理分页语句和物理分页参数。
5、MyBatis与缓存
5.1、MyBatis中的一级缓存和二级缓存是什么
(1)一级缓存(默认)
是HashMap 本地缓存,其存储作用域为 Session。指在同一个SqlSession中,对相同的查询进行缓存,当再次执行相同的查询时,MyBatis会直接从缓存中获取结果,而不再去数据库中执行查询。
只在当前SqlSession的生命周期内有效,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。
(2)二级缓存
二级缓存是指在多个SqlSession之间共享缓存,因此可以跨越多个SqlSession的生命周期。这意味着当一个SqlSession执行查询后,结果会被缓存起来,当其他SqlSession执行相同的查询时,可以直接从缓存中获取结果
也是HashMap 本地缓存,但是其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache,默认不打开。
5.2、如何配置二级缓存
以通过<cache/>元素来配置二级缓存
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
配置表示使用FIFO算法进行缓存清理,每隔60秒刷新缓存,最多缓存512个对象,只读模式
5.3、二级缓存注意事项
要确保被缓存的对象是可序列化的,因为二级缓存的实现通常会将对象序列化到磁盘或网络中。