1、#{}和${}的区别是什么?
答:#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
2、最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
答:工作原理:JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回
Dao接口(也就是我们通常讲的Mapper接口)里的方法是不能重载的,因为:Dao接口没有实现类,方法构成:接口全限名+方法名的保存和寻找策略
3、Mybatis是如何进行分页的?分页插件的原理是什么?
答:使用RowBounds对象进行分页
基本原理:使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql
4、Mybatis动态sql是做什么的?
答:在xml文件中,以标签的形式编写动态sql,根据我们的需要进行逻辑判断和动态拼接,实现我们的功能需求
动态sql的执行原理:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能,根据dialect方言,添加对应的物理分页语句和物理分页参数
5、Mybatis是如何将sql执行结果封装为目标对象并返回的?
答:①使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关
②使用sql列的别名功能,将列别名书 写为对象属性名(Mybatis会忽略列名大小写)
6、Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
答:可以。
关联对象查询:①一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象
②使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,再语句最后面加上on 两个表相联系的属性值相等于
7、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
答:仅仅支持association(一对一)和collection(一对多)sql
原理:使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,转而执行Mapper接口里的
接口方法,最后将sql语句执行的结果返回
8、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
答:可以,前提是配置namespace,但不是必须的,只是最佳实践而已
9、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
答:同Hibernate比较
使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以说是全自动的
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,这种情况我们称之为半自动ORM映射工具。
10、模糊查询like语句该怎么写?
答:①在Java代码中添加sql通配符。%%
②在sql语句中拼接通配符,会引起sql注入