Mybatis面试题

122 阅读2分钟

一、#{}和${}的区别是什么?

mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理时,就是将${}替换成变量的值,使用#{}可以有效的防止SQL注入,提高系统的安全性

二、mybatis分页原理和分页插件原理

mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,而结果集是一次性查询所有的结果

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数

重写之前:select * from student
重写之后(MySql):select * from student limit 0,10 

三、mybatis称作半自动ORM映射工具缘由

mybatis可以自动将java程序中的对象自动持久化到数据库,反过来也可以将数据库的记录映射成java程序中的对象,这是自动的一点,称作半自动的缘由是因为需要手动编写SQL,对比hibernate,不需要编写SQL,所以称作全自动ORM映射工具

四、使用mybatis的mapper接口调用时的要求

  • Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同
  • Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
  • Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
  • Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径

五、通常一个xml文件编写一个dao接口与之对应,dao接口的工作原理以及dao接口里的方法不能重载的缘由

dao 接口即 mapper 接口。接口的全限名,就是映射文件中的 namespace 的值; 接口的方法名,就是映射文件中 mapper 的 statement 的 id 值;接口方法内的参数,就是传递给 sql 的参数

mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个 mapperstatement。在 mybatis 中,每一个<select><insert><update><delete> 标签,都会被解析为一个mapperstatement 对象

举例: com.mybatis3.mappers.studentdao.findstudentbyid ,可以唯一找到 namespace 为 com.mybatis3.mappers.studentdao 下面 id 为findstudentbyid 的 mapperstatement

mapper 接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。mapper 接口的工作原理是 jdk 动态代理,mybatis 运行时会使用 jdk动态代理为 mapper 接口生成代理对象 proxy,代理对象会拦截接口方法,转而执行 mapperstatement 所代表的 sql,然后将 sql 执行结果返回