1. 谈一谈你对Mybatis框架的理解
Mybatis是一个半ORM框架,它内部封装了JDBC,使用它可以简化持久层的操作,使程序员在开发时只需要关注SQL语句即可。
2. 在mybatis中,${} 和 #{} 的区别是什么?
1. Mybatis中#{}是预编译处理,${}是字符串替换
2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,然后调用PreparedStatement进行数据库操作,此方式不存在sql注入问题
Mybatis在处理${}时,就是把${}替换成变量的值,然后调用Statement进行数据库操作,此方式存在sql注入问题
3. 如果使用#{}接收一个简单类型的参数,{}中可以随便写;如果使用${}接收一个简单类型的参数,{}中只能写value
3. 在mybatis中,resultType和ResultMap的区别是什么?
如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性
如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过resultMap手动建立对象关系映射
4. 在Mynbatis中你知道的动态SQL的标签有哪些?作用分别是什么?
1. <if>if是为了判断传入的值是否符合某种规则,比如是否不为空.
2. <where> where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类型where 1 = 1这种无用的条件
3. <foreach> foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中.
4. <include> include可以把大量的重复代码整理起来,当使用的时候直接include即可,减少重复代码的编写;
5. <set>适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作
5. 在mybatis中,Dao接口中的方法支持重载吗? 为什么?
不支持。
在Mybatis中,要求接口的方法名要跟映射文件中的ID一致,而ID又是不能重复的;如果接口中的方法重载了,就意味着映射文件中的ID会出现重复的情况,会出异常。
6. 谈一下你对mybatis缓存机制的理解?
Mybatis有两级缓存,一级缓存是SqlSession级别的,默认开启,无法关闭;二级缓存是Mapper级别的,默认开启,但是可以关闭
1. 一级缓存:基础PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,Session中的所有Cache就将清空
2. 二级缓存默认也是采用PerpetualCache的HashMap存储,不同在于其存储作用域为Mapper(Namespace),使用二级缓存属性类需要实现Serializable序列化接口
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear.