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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis中xml映射和方法注解两种配置sql语句的方式是不是可以同时存在相关的知识,希望对你有一定的参考价值。

假如使用接口映射器的方式来执行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配置两种方式同时存在?

不能进行同时设置。执行会找不到接口的mapper代理工厂。mybatis会先解析xml文件,将解析后的sql封装在mapperstament中并放进Configuration的mappedStatements中,将命名空间和方法名(也就是id)作为key,mappedStatements是个自定义map。然后生成接口的代理工程,生产代理工厂后会解析注解,解析完注解,也会生成mapperstament,也会往统一的Configuration大对象里面放,但是放的时候自定义map会先判断是否存在,此时已经存在了,存在就会抛出IllegalArgumentException(name + " already contains value for " + key)。但是创建代理工厂的时候把异常吃掉了,所以加载的时候不会报错,但是不会给接口生成代理工厂。没有代理工厂,接口就没有实现类去操作。 参考技术A 当你程序需要执行的时候,系统会去寻找对应的sql语句,你如果存在两个 那么系统就会迷茫 不知道该选择哪一个 所以就报错了 xml格式最后在编译的时候也是存放在内存中,相当于一段代码 所以他和注解表示的作用是一样的 两个一样的东西 最后系统选择的时候肯定会报错的 因为不知道选哪一个本回答被提问者和网友采纳 参考技术B 这个问题 ,我们可以看下mybatis的配置文档
在SqlMapConfig中有俩种配置分别为注解配置 和 xml文档配置
在我们为一个dao接口注册了俩种配置的时候,源码里会进行判断首先进行判断使用的哪种属性配置,如果俩种配置都写了将会抛出
Cause: org.apache.ibatis.binding.BindingException: Type interface IUserDao is already known to the MapperRegistry.

以上是关于mybatis中xml映射和方法注解两种配置sql语句的方式是不是可以同时存在的主要内容,如果未能解决你的问题,请参考以下文章

mybatis执行CRUD操作的两种方式配置和注解

Mybatis1

Mybatis中的动态SQL

springboot整合mybatis使用xml映射文件和使用注解两种方式的切换

mybatis框架简介

MyBatis 使用简单的 XML或注解用于配置和原始映射