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

背景描述

由于项目要求,需要根据不同用户查询不同的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 createSqlSession(ShiroUser shiroUser) {
        StringBuffer jdbcUrl = new StringBuffer(jdbcBaseUrl);
        StringBuffer dbFilePath = getDbFilePath(shiroUser);
        jdbcUrl.append(dbFilePath);
        //创建连接池
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(jdbcUrl.toString());
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession session = null;
        try {
            factoryBean.setMapperLocations(resolver.getResources("classpath:sqliteMapper/*.xml"));
            factoryBean.setTypeAliasesPackage("com.kyee.pis.db.entity");
            sqlSessionFactory = factoryBean.getObject();
            session = sqlSessionFactory.openSession();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return session;
    }

业务代码调用

public PageList getUploadList(ShiroUser shiroUser, PhysicalCar physicalCar, PageBounds pageBounds) {
        PageList list = null;
        SqlSession sqlSession = null;
        try {
            sqlSession = createSqlSession(shiroUser);
            PhysicalCarMapper physicalCarMapper = sqlSession.getMapper(PhysicalCarMapper.class);
            list = physicalCarMapper.getUploadList(physicalCar,pageBounds);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(sqlSession != null){
                sqlSession.close(); //必须关闭
            }
        }
        return list;
    }

2、SqlSessionFactoryBuilder创建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 createSqlSession2(ShiroUser shiroUser) {
        StringBuffer jdbcUrl = new StringBuffer(jdbcBaseUrl);
        StringBuffer dbFilePath = getDbFilePath(shiroUser);
        jdbcUrl.append(dbFilePath);
        //创建连接池
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(jdbcUrl.toString());
        //事务
        TransactionFactory transactionFactory = new JdbcTransactionFactory();

        //创建环境
        Environment environment = new Environment("development", transactionFactory, dataSource);
        //创建配置
        Configuration configuration = new Configuration(environment);
        //开启驼峰规则
        configuration.setMapUnderscoreToCamelCase(true);
        //加入资源(Mapper接口)
        configuration.addMapper(PhysicalCarMapper.class);
        //获取session工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }

业务调用代码与方法一相同

解决报错Invalid bound statement (not found)

session创建正常情况下,获取到mapper以后调用对应的dao方法报错

问题原因

mapper.xml与mapper接口在同一包下时,代码编译以后xml文件并没有编译到target目录下,原因为pom默认只会编译resource文件夹下的xml文件,不编译src/main/java下的xml文件

问题解决

配置pom文件,使得可以编译src/main/java下的xml文件,具体代码如下


	
		src/main/java
		
		**/*.xml
		
	

 

你可能感兴趣的:(mybatis)