mybatis面试题:在最佳实践中,一个XML文件对应一个DAO接口,这个DAO接口的实现原理是什么,DAO接口的方法参数不同时,可以被重载吗
1.DAO接口的实现原理答:Dao的实现原理,是Mybatis框架通过JDK动态代理接口,当调用接口方法时,代理拦截调用,并通过接口全限名+方法名组成key的方式,查找XML映射文件中的MapperStatement,返回执行SQL后的结果2.DAO接口的方法参数不同时,可以被重载吗?答:DAO接口的方法在JDK代理层面可以被重载。对于default修饰的方法mybatis会直接代理执行,而不是指
1.DAO接口的实现原理
答:Dao的实现原理,是Mybatis框架通过JDK动态代理接口,当调用接口方法时,代理拦截调用,并通过接口全限名+方法名组成key的方式,查找XML映射文件中的MapperStatement,返回执行SQL后的结果
2.DAO接口的方法参数不同时,可以被重载吗?
答:DAO接口的方法在JDK代理层面可以被重载。对于default修饰的方法mybatis会直接代理执行,而不是指向MapperStatement,所以重载default方法是有效的。
另一种有争议的答案:
mybatis层面可以实现有条件的重载,但xml配置文件中的id是唯一不可重复的,所以对于重载的多个(同名)方法,都将指向同一个MapperStatement,但有潜在的异常风险,一般不建议使用
如何使用?
答: 在同一个ID的MapperStatement下,使用动态SQL,例如if标签来进行参数判断
接口:
public Data getOne()
public Data getOne(@Parme("id") long id)
<select id="getOne" resultType="xxx.xxx.Data">
SELECT * FROM data_table
<if test="id != null">
WHERE id = #{id}
</if>
</select>
有前提条件吗?
答:同时满足以下条件可以实现重载
a. 只有一个无参方法和一个有参方法
b. 有多个有参方法时,参数的数量需要相同,且使用相同的@Param值
对于只有单个参数的2方法来说,会抛出错误Parameter ‘name’ not found. Available parameters are [id, param1],
public Data getOne()
//此方法使用时会抛出错误Parameter 'name' not found. Available parameters are [id, param1]
public Data getOne(@Param("id") long id)
public Data getOne(@Param("id") long id,@Param("name")String name)
<select id="getOne" resultType="xxx.xxx.Data">
SELECT * FROM data_table
<where>
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
</where>
</select>
此文章作为思路整理,未实际测试,仅供参考,如果想详细了解可查看以下信息
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)