Mybatis常见面试题

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注入
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值