十道常见的mybatis面试题

1. #{}和${}的区别是什么?

其中#{}是预编译处理,{}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理{}时,就是把{}替换成变量的值。 比如使用#传入参数是,sql语句解析是会加上{column}
传同样的column值id,上面的语句会解析成 order by 'id',下面的语句会解析成order by id,如果要做动态sql的话,就可以使用${}。

使用#{}可以有效的防止SQL注入,提高系统安全性。

2. Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis可以使用RowBounds对象来进行分页,通过ResultSet结果集来执行的内存分页,并不是一般来说的物理分页,可以在sql语句里面直接添加带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页,比如PageHelper。

分页插件的基本原理:通过使用Mybatis提供的插件接口,来实现自定义分页,在插件自带的拦截方法里拦截待执行的sql(也就啊hi我们查询的需要分页的内容),然后重写sql,根据dialect方法添加对应的分页语句和分页参数。

3. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

有两种映射关系
第一种是使用标签,定义多个列名和对象属性名之间的映射关系。
第二种是使用sql列的列别名功能,将列别名书写为对象属性名,比如T_ID AS ID,对象属性名一般是id,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,如果映射关系对应不上就无法完成复制。

4. 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,也就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个标签都会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

你可能感兴趣的:(十道常见的mybatis面试题)