MyBatis常见面试题整理
${}和#{}的区别是什么?#
${}是字符串替换,#{}是预编译处理。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理{}原样替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?#
方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
<select id = ”selectorder” parametertype = ”int” resultetype = ”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>
方法二:通过
模糊查询再MyBatis中怎么写#
一般模糊查询都是通过 like %xx% 这种形式来查询的,xx是前端传过来的查询变量,在MyBatis中推荐使用字符串拼接函数的形式来使用,这样出错的可能性较小。
<if test="xx!= null and xx!= ''">
and user_name like concat('%',#{xx,jdbcType=VARCHAR},'%')
</if>
MyBatis中的Mapper只有接口,那实现类是怎么生成的?当我们调用Mapper接口中的某个方法时,这个方法是怎么跟Mapper映射文件中的SQL语句对应起来的。#
在使用MyBatis的时候我们只需要定义Mapper接口进行了,具体的Mapper接口实现是通过动态代理的方式生成的。
MyBatis在启动的时候会为每个Mapper映射文件指定一个MapperProxyFactory类,这个类是MapperProxy的工厂类,当我们调用sqlSession1.getMapper时,就会使用
MapperProxyFactory来生成动态代理类。生成的动态代理类代理了Mapper的所有接口。
CbondissuerMapper cbondissuerMapper10 = sqlSession1.getMapper(CbondissuerMapper.class);
下面来回答第二个问题,Mapper接口中的方法是怎么和映射文件中的SQL匹配起来的。
上面提到,Mapper接口的实现类是通过动态代理生成的,熟悉动态代理的应该知道调用Mapper接口的任何接口方法都会调到InvocationHandler接口的
invoke方法,在这里也就是MapperProxy的invoke方法。因为MapperProxy实现了InvocationHandler接口。
查看MapperProxy的invoke方法的源代码,我们会发现接口方法调用可具体的SQL是通过一个叫做MapperStatement的对象关联起来的。
MyBatis在启动时会将Mapper文件中的每一个 <select>
、<insert>
、<update>
、<delete>
标签解析为一个MapperStatement对象,并放入一个Map结构中。
放入时的key就是Mapper文件的namespace加上标签值的id值。(这里我们也就知道了为什么配置映射文件时namespace需要和接口的全限定名一致,标签的id需要
和接口的方法名一致)
也就是说在Mapper接口中定义的每个方法都有一个MapperStatement对象和它一一对应,这个MapperStatement对象包含了所有映射文件的信息,自然也包含了SQL
信息。所以Mapper接口就是通过MapperStatement对象和具体SQL匹配的。
Mapper接口中的方法定义能否通过方法签名重载?#
通过上面的介绍我们知道Mapper接口中的方法并不能通过方法名重载。因为MyBatis是通过接口的全限定名和方法名来匹配MapperStatement对象,
两个方法名相同方法签名不同的接口会匹配到同一个MapperStatement对象。
Mybatis是如何进行分页的?分页插件的原理是什么?#
插入数据返回主键ID#
参考#
作者:程序员自由之路
出处:https://www.cnblogs.com/54chensongxia/p/13130481.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?