1、#{}和${}的区别是什么?(这个真的问过N遍了)
#{}会产生预编译,可以安全的设置参数(?),可以防止sql注入,
${} 则是直接插入,会产生sql注入,如果在sql末尾order by 中使用也无妨。
2、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
<sql>、<include> <if>........
3、通常一个.xml文件,都会写一个dao接口与之对应,请问这个dao接口的工作原理;
这个dao接口就是常说的MAPPER接口,接口的aa.bb,中的aa(全限名?)就是映射文件中的namespace
的值,bb(方法名)就是映射文件中的 MappedStatement的id值,接口内的参数就是传递给sql的参数,
当调用接口的时候,接口全限名+方法名 拼接字符串作为key值,可唯一定位一个MappedStatement,
工作原理是jdk动态代理的,mybatis运行时会使用jdk动态代理为dao接口生成代理proxy对象,
代理对象会拦截接口方法,执行MappedStatement所代表的sql,然后将sql执行结果返回。
4、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
mybatis动态sql可以让我们在xml映射文件内,以标签的形式编写sql,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind
执行原理;使用ognl从sql参数对象中计算表达式的值根据表达式的值动态拼接sql以此来完成动态sql的功能
5、mybatis是否支持延迟加载,如果支持,实现原理?
仅支持association 关联对象和collection关联集合对象的延迟加载,association指的是一对一,比如调用
a.getB().getName(),拦截器invoke()发现。a.getB()竟然是null