1 Mybatis 常见面试题(转) 1、#{}和${}的区别是什么? 注:这道题是面试官面试我同事的。 答:${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为 com.mysql.jdbc.Driver。#{}是 sql 的参数占位符,Mybatis 会将 sql 中的#{}替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于param.getItem().getName()。 2、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签? 注:这道题是京东面试官面试我时问的。 答:还有很多其他的标签,
、、、、,加上动态 sql 的 9 个标签,trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中为sql 片段标签,通过标签引入 sql 片段,为不支持自增的主键生成策略标签。 3、最佳实践中,通常一个 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 中,每 一个