1、什么是Mybatis?
mybatis是一款优秀的支持自定义SQL查询,存储过程和高级映射的持久层框架,消除了几乎所有的jdbc代码和参数手动设置以及结果集的检索。
mybatis可以使用XML或注解进行配置和映射,mybatis通过参数映射到配置的SQL形成最终执行的SQL语句,最后将执行的SQL的结果映射成Java对象返回。
2、mybatis优点
- 小巧,学习成本低,会写SQL上手就很快了。
- 封装了jdbc,基本配置好了,大部分的工作量就专注在SQL部分。
- 方便维护管理,SQL不需要在Java代码中找,SQL代码可以分离出来,可重用。
- 灵活,支持动态SQL。
- 支持对象与数据库orm字段关系映射。
3、mybatis的缺点
- 由于工作量在SQL上,需要SQL的熟练度高。
- 移植性差。SQL语法依赖数据库。不同的数据库的切换可能会因语法差异而报错。
4、什么时候用mybatis
如果你需要一个灵活的,可以动态生成映射关系的框架。目前来说,因为合适,互联网项目使用mybatis还是很多的。
5、mybatis的核心组件有哪些
- SqlSessionFactoryBuilder(构造器 ) :它会根据配置信息或者代码来生成SqlSessionFactory。
- SqlSessionFactory(工厂接口):依靠工厂来生成SqlSession。
- SqlSession(会话):既可以发送SQL去执行返回结果,也可以获取Mapper接口。
- SQLMapper:它是最新设计的组件,是由一个Java接口和XML文件(或注解)构成的。需要给出对象的SQL和映射规则。它负责发送SQL去执行,并返回结果。
6、#{}和${}的区别?
${}是字符串替换,#{}是预编译处理,#{}能防止SQL注入问题。
7、mybatis中9个动态标签
if,choose,when,oterwise,trim,where,set,foreach,bind。
8、XML映射文件中有哪些标签?
select,insert,updae,delete,resultMap,parameterMap,sql,include,selectKey和9个动态标签
9、mybatis支持注解吗?优点和缺点?
支持。
优点:对于需求简单SQL逻辑简单的系统,效率较高。
缺点:当SQL变化需要重新编译代码,SQL复杂时,写起来更不方便,不好维护。
10、mybatis动态SQL
mybatis动态SQL可以让我们在XML映射文件内,以标签的形式编写动态SQL,完成逻辑判断和动态拼接SQL的功能。
11、mybatis是如何进行分页的?分页插件的原理是什么?
- mybatis使用RowBounds对象进行分页,也可以直接编写SQL实现分页,也可以使用mybatis的分页插件。
- 分页插件的原理:实现mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL。
举例:select * from student,拦截SQL后重写为:select t.* from (select * from student) t limit 0,10
12、如何获取自增主键
- 注解:
@Options(useGeneratedKeys =true, keyProperty =”id”)
int insert( );
- XML
<insert id=”insert” useGeneratedKeys=”true” keyProperty=” id”>
sql
</insert>
13、为什么mapper接口没有实现类,却能被正常调用?
因为mybatis在mapper接口使用了动态代理。
14、用注解好还是XML好?
- 简单的增删改查可以用注解
- 复杂的SQL还是用XML,官方也比较推荐XML方式。XML方式更便于统一维护管理代码。
15、如果不想手动指定别名,如何用驼峰的形式自动映射?
mapUnderscoreToCamelCase=true
16、当实体属性名和表中字段不一致,怎么办?
- SQL语句使用别名,如 select order_num orderNum。
- 通过映射,
<result property = “order_Num" column =”order_num"/>
- 使用15问的驼峰注解的方式
17、like模糊查询怎么写?
- ‘%${value}%’,不推荐。
- CONCAT(‘%’,#{value},‘%’),推荐。
- like ‘%’|| #{value} || ‘%’
- LIKE #{value}
18、mybatis支持枚举吗?
支持,有转换器EnumTypeHandler; EnumOrdinalTypeHandler
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="枚举类(com.xx.StateEnum)"/>
</typeHandlers>
19、SqlSessionFactoryBuilder生命周期
利用XML或者Java代码获得资源构成SqlSessionFactoryBuilder,它可以创建多个SessionFactory,一旦构建成功SessionFactory,就可以回收它了。
20、一级缓存的结构,如何开启一级缓存,如何不使用一级缓存?
- 结构是Map.
- 默认一级缓存是开启的。
- < select >标签内加属性flushCache=true
21、二级缓存如何配置?
这个参数是二级缓存的全局开关,默认值是true,初始状态为启用状态。
如果把这个参数设置为false,即使有后面的二级缓存配置,也不会生效。
<settings>
<setting name=” cacheEnabled” value=” true ” />
</settings>
22、简述mybatis的插件运行原理,以及如何编写一个插件?
- mybatis仅可以编写针对ParameterHandler,ResultSetHandler,StatementHandler,Executor这4中接口的插件,mybatis通过动态代理,为需要的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
- 实现mybatis的Interceptor接口并复写 intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住在配置文件中配置你编写的插件。
23、二级缓存的回收策略
- LRU(最近最少使用):移除最长时间不被使用的对象,这是默认值。
- FIFO(先进先出):按对象进入缓存的顺序来移除它们。
- SOFT(软引用):移除基于垃圾回收器状态和软引用规则的对象。
- WEAK(弱引用):更积极的移除基于垃圾回收器状态和弱引用规则的对象。
24、mybatis的XML文件中的ID可以重复吗?
同一namespace下,ID不可以重复。
不同namespace下,ID可以重复。
25、和mybatis搭配的Java框架中比较好用的缓存框架以及它的特点?
EhCache是一个纯Java进程内的缓存框架,具有快速,精干等特点。
EhCache主要特性:
- 快速。
- 简单。
- 多种缓存策略。
- 缓存数据有内存和磁盘两级,无须担心容量问题。
- 缓存数据会在虚拟机重启的过程中写入磁盘。
- 可以通过XML,可插入API等方式进行分布式缓存。
- 具有缓存和缓存管理器的侦听接口。
- 支持多缓存管理器实例以及一个实例的多个缓存区域。
结束!
永远不要和旁人炫耀你即将得到的。
、