目录
1. Mapper接口类和映射文件(Mapper.xml文件)的名字没有相同,为什么要保证相同,这里简单提一下:
以上这两个原因使得sql语句访问了错误的数据源,导致了上面的报错问题!
问题现象:
今天在项目运行过程中出现了SQL报错:
java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
从报错信息可以看出,这是因为:该sql执行时访问的表不存在于该数据源(run)中。
问题分析:
我们都知道mybatis可以通过application.properties(或.yml/.yaml类型)配置文件,来配置多个数据源,当配置了多个数据源后,就可以依据数据源,创建Mapper接口类和Mapper.xml文件进行对应数据源的表映射关系;从而确定每个Dao层(Mapper层)中的sql语句访问的数据源;而不会出现数据源间的混乱访问。
而上面这个错误就是因为,访问了我配置的多个数据源中的一个,但却不是我想要的数据源,通过查看Mapper接口类和Mapper.xml文件,发现没有问题,但是访问了错误的数据源;后来发现可能是以下原因导致的:
1. Mapper接口类和映射文件(Mapper.xml文件)的名字没有相同,为什么要保证相同,这里简单提一下:
1.1. 在注册映射文件(XxxMapper.xml)时使用<package name="包名">标签时,需要映射文件名和接口名一样,不然会报错。
1.2. 在注册映射文件时使用<mapper class="">mapper标签的class属性时,需要映射文件名和接口名一样,不然会报错。
1.3. 在注册映射文件时使用<mapper resource="org/xx/demo/mapper/xx.xml"/>,不需要映射文件名和接口名一样。
1.4. 在使用 @Mapper 或者 @Component 注解来注入Mapper接口类时,映射文件中使用 <mapper namespace="xx.mapper.xx.xxMapper" >指定Mapper接口,同时 需要保证映射文件名和接口名一样。
这里我用的是1.4 的注解方式来注入bean对象的,Mapper接口类放在src文件夹下;映射文件(Mapper.xml文件)放在resource文件夹下;所以需要保证映射文件名和接口名一样。
2. 存在了同名的Mapper.xml文件:
如果存在映射文件同名的话,Mapper接口类在注入成bean对象时,会寻找同名的映射文件,先找到的就先注入,于是就导致了同名的后者注入失败!
以上这两个原因使得sql语句访问了错误的数据源,导致了上面的报错问题!
那么该如何避免这个问题,其实就很简单了!!!
解决方法:
1. 保证 Mapper接口类 和 映射文件(Mapper.xml文件) 同名。
2. 保证 不存在同名的映射文件(Mapper.xml文件)。