MyBatis面试题

MyBatis面试题总结

#{}和${}的区别是什么
  • ${} 是 Properties ⽂件中的变量占位符,它可以⽤于标签属性值和 sql 内部,属于静态⽂本
    替换。拿着字符串直接拼接。
  • #{} 是sql占位符,MyBatis会将sql中的#{}替换为?号,然后在执行sql前使用PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值。拿着数值放在引号号内部后拼接.

优先使用 #{}。因为 ${} 会导致 sql 注入的问题。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

Xml 映射⽂件中,除了常⻅的 select|insert|updae|delete 标签之外,还有哪些标签?
  • resultMap SQL查询结果字段与实体属性的映射关系


        
        
        
        

  • 动态sql标签 if,foreach

    
    
    
  • 定义常量 ,引用常量

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

不能

Dao 接⼝,就是⼈们常说的 Mapper 接⼝,接⼝的全限名通过XML中namespace标签与MyBatis定义的语句相关联。这个类并没有实现类,我们调用的时候,是如何执行SQL的呢? 显然MyBatis为我们实现了,因为接口定义明确,通过JDK的动态代理就可以实现,那动态代理实际做了什么工作?

首先一个namespace下的每⼀个