关于mybatis面试题

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中定义的每个sqlid相同
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql parameterType的类型相同
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同

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方言,添加对应的物理分页语句和物理分页参数。

猜你喜欢

转载自www.cnblogs.com/mcahkf/p/9138621.html