mybatis面试题:在最佳实践中,一个XML文件对应一个DAO接口,这个DAO接口的实现原理是什么,DAO接口的方法参数不同时,可以被重载吗

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>

此文章作为思路整理,未实际测试,仅供参考,如果想详细了解可查看以下信息

1.Javaguide面试题整理-3、最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

Javaguide的此题相关issue讨论

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值