【JAVA】mybatis手动创建sqlSession实现不同数据源查询【并且指定mapper扫描路径】解决报错Invalid bound statement (not found)

本文介绍了在Java项目中如何手动创建MyBatis的SqlSession以实现不同数据源查询,并解决了使用SqlSessionFactoryBean创建时mapper扫描路径的问题。文中详细对比了两种创建SqlSessionFactory的方式,一种是通过SqlSessionFactoryBean配置mapper.xml扫描路径,另一种是确保mapper接口与xml文件在同一包下。在遇到'Invalid bound statement (not found)'错误时,分析了问题原因——src/main/java下的xml文件未被编译,最后给出了修改pom.xml配置以编译这些xml文件的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景描述

由于项目要求,需要根据不同用户查询不同的sqlite数据源,所以想到通过JAVA实现手动创建MyBatis  SqlSession,从而实现数据库查询;

由于此次碰到问题比较多,借鉴了很多博客,所以觉得有必要总结一下。

创建SqlSession的两种方式

1、SqlSessionFactoryBean创建SqlSessionFactory,可配置mapper.xml扫描路径

创建SqlSession代码

//导入的第三方包
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public SqlSession cre
### MyBatis中 'Invalid bound statement (not found)' 错误原因及解决方案 尽管已经确认包路径正确,但在MyBatis应用中仍然可能出现 `Invalid bound statement (not found)` 的错误。以下是可能的原因及其对应的解决方案: #### 1. Mapper接口与Mapper XML文件未匹配 如果Mapper接口名称与其对应的XML文件名不一致,则可能导致无法找到MappedStatement对象。例如,在Spring Boot项目中,`UserMapper` 接口应对应名为 `UserMapper.xml` 的映射文件[^2]。 #### 2. Mapper XML文件未被正确加载 即使包路径无误,仍需验证Mapper XML文件是否已被成功加载至classpath下。可以通过检查项目的 `target/classes/` 或者构建后的JAR包中的资源目录来确认XML文件是否存在[^4]。若发现缺失,可能是由于以下原因之一: - **Maven配置问题**:确保POM文件中有 `<resources>` 配置项以包含XML文件。 ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` #### 3. SQL命名空间(namespace)定义有误 在Mapper XML文件中,namespace属性必须精确匹配其关联的Mapper接口全限定类名(Fully Qualified Class Name),否则SQL语句将不可见于绑定层。例如,对于 `com.example.mapper.UserMapper` 接口,XML文件头部应当声明如下 namespace 属性[^1]: ```xml <mapper namespace="com.example.mapper.UserMapper"> ``` #### 4. Spring Boot自动扫描范围不足 当使用Spring Boot集成MyBatis时,默认情况下仅会扫描特定基础包下的Mapper接口。因此需要通过设置 `@MapperScan` 注解或者调整application.properties/yml文件指定正确的扫描路径。比如: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 显式指明mapper所在位置 public class Application { } ``` #### 5. 编译过程中丢失XML资源 某些开发环境(如IDEA)可能会因为编译选项或其他因素忽略掉部分非Java类型的静态资源文件。建议清理整个工程并重新构建一次尝试解决问题;另外也可以单独测试单个功能模块排除干扰变量影响[^3]^。 --- ### 示例代码片段展示如何调试此异常情况 下面提供一段简单的单元测试样例用于验证上述提到的一些潜在风险点: ```java @SpringBootTest class UserMapperTest { @Autowired private SqlSession sqlSession; @Test void testSelectById() throws Exception{ try(SqlSession session=sqlSession.openSession()){ UserMapper mapper=session.getMapper(UserMapper.class); assertNotNull(mapper); List<User> users=mapper.selectAllUsers(); assertFalse(users.isEmpty()); } } } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值