1.为什么要使用 MyBatis开发你的项目?
- 可在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
- 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
- Mybatis自动将java对象映射至sql语句。
- Mybatis自动将sql执行结果映射至java对象。
2.#{}和${}的区别是什么?
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
- $将传入的数据直接显示生成在sql中。
- $方式一般用于传入数据库对象,例如传入表名。
- #{}是预编译处理,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的set方法赋值。使用#{}可以有效的防止SQL注入。
3.Xml映射文件中有哪些标签?
- <select><insert><update><delete>
- <resultMap>、<parameterMap>、<sql>、<include>(<sql>为sql片段标签,通过<include>标签引入sql片段)
- if、choose (when, otherwise)、trim (where, set)、foreach、bind
4.MyBatis的有哪些映射规则?
- Mapper.xml文件中的namespace即是mapper接口的类路径。
- Mapper接口方法名和mapper.xml中定义的每个sql的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
5.MyBatis中命名空间(namespace)的作用?
绑定DAO接口,保证这个映射文件中sql语句id的唯一性。
6.DAO接口的工作原理
Dao接口的工作原理是JDK动态代理,Mybatis运行时会为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,
转而执行MappedStatement所代表的sql
,然后将sql执行结果返回。
7.Dao接口里的方法,能否重载?
不能重载,
当调用接口方法时,命名空间+方法名,才可以唯一定位一个MappedStatement。(
namespace+id是作为Map<String, MappedStatement>的key使用的
)
8.Mybatis是如何将sql执行结果封装为目标对象?都有哪些映射形式?
第一种是使用<resultMap>标签。第二种是使用别名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值。
9.在mapper中如何传递多个参数?
- DAO层的函数不带注解
:
对应的xml,#{0}代表接收的是dao层中的第一个参数 使用 @param 注解
10.动态sql的执行原理?
使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql。
11.Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。