mybatis中xml映射和方法注解两种配置sql语句的方式是否可以同时存在

假如使用接口映射器的方式来执行sql语句,对于某个方法,是否允许添加注解和在对应的xml配置文件中配置sql语句两种方式同时存在,比如对于DBMapper接口的selec... 假如使用接口映射器的方式来执行sql语句,对于某个方法,是否允许添加注解和在对应的xml配置文件中配置sql语句两种方式同时存在,比如对于DBMapper接口的selectAll()方法,我既在该方法上添加了@Select("select * from db_param"),又在对应的xml配置文件中配置了<select id="kd">select * from db_param</select>,这样是否允许?如果这样配的话,系统会报错,还是会优先用一种方式替换另一种方式?我自己测试的时候,mapper元素的namespace属性和接口的完整路径名相同的时候,而且使用接口的方式执行sql语句,同时配置会提示错误,但是我看到某篇文章中讲到Configuration对象的addMappers(String path)方法扫描指定包路径下的接口并注册,同时扫描该路径下的mapper配置文件并解析。而且该方法除了解析mapper配置文件,还会解析路径下的接口的注解,同时注解的sql语句会覆盖mapper文件的sql语句。

我因此感到比较困惑,所以想请教mybatis对于同一个接口的同一个方法,是否允许注解和mapper配置两种方式同时存在?
展开
 我来答
133104cz
2019-04-08
知道答主
回答量:1
采纳率:0%
帮助的人:758
展开全部
不能进行同时设置。执行会找不到接口的mapper代理工厂。mybatis会先解析xml文件,将解析后的sql封装在mapperstament中并放进Configuration的mappedStatements中,将命名空间和方法名(也就是id)作为key,mappedStatements是个自定义map。然后生成接口的代理工程,生产代理工厂后会解析注解,解析完注解,也会生成mapperstament,也会往统一的Configuration大对象里面放,但是放的时候自定义map会先判断是否存在,此时已经存在了,存在就会抛出IllegalArgumentException(name + " already contains value for " + key)。但是创建代理工厂的时候把异常吃掉了,所以加载的时候不会报错,但是不会给接口生成代理工厂。没有代理工厂,接口就没有实现类去操作。
JacobAmI
推荐于2017-11-27 · 超过68用户采纳过TA的回答
知道小有建树答主
回答量:143
采纳率:0%
帮助的人:103万
展开全部
当你程序需要执行的时候,系统会去寻找对应的sql语句,你如果存在两个 那么系统就会迷茫 不知道该选择哪一个 所以就报错了 xml格式最后在编译的时候也是存放在内存中,相当于一段代码 所以他和注解表示的作用是一样的 两个一样的东西 最后系统选择的时候肯定会报错的 因为不知道选哪一个
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
最长乃7个汉字
2018-12-29
知道答主
回答量:1
采纳率:0%
帮助的人:793
展开全部
这个问题 ,我们可以看下mybatis的配置文档
在SqlMapConfig中有俩种配置分别为注解配置 和 xml文档配置
在我们为一个dao接口注册了俩种配置的时候,源码里会进行判断首先进行判断使用的哪种属性配置,如果俩种配置都写了将会抛出
Cause: org.apache.ibatis.binding.BindingException: Type interface IUserDao is already known to the MapperRegistry.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式