Mybatis调用dao层(Mapper接口类)的方法时,访问了错误的数据源

目录

问题现象:

问题分析:

1. Mapper接口类和映射文件(Mapper.xml文件)的名字没有相同,为什么要保证相同,这里简单提一下:

2. 存在了同名的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文件)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值