springboot + mybatis plus + hikari 分包实现多数据源 + 处理 Invalid bound statement
项目结构
数据源配置
主数据源配置文件
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.hzlq.iot.mapper.zhltwlzx", sqlSessionTemplateRef = "zhltwlzxSqlSessionTemplate")
public class DataSourceConfigZhltwlzx {
// 将这个对象放入Spring容器中
@Bean
// 表示这个数据源是默认数据源
@Primary
// 读取application.properties中的配置参数映射成为一个对象
@ConfigurationProperties(prefix = "spring.datasource.zhltwlzx")
public DataSource getDateSourceZhltwlzx() {
return DataSourceBuilder.create().build();
}
@Bean
// 表示这个数据源是默认数据源
@Primary
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory zhltwlzxSqlSessionFactory(@Qualifier("getDateSourceZhltwlzx") DataSource datasource)
throws Exception {
//重点:是 MybatisSqlSessionFactoryBean 不是 SqlSessionFactoryBean
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/zhltwlzx/*.xml"));
return bean.getObject();
}
@Bean
// 表示这个数据源是默认数据源
@Primary
public SqlSessionTemplate zhltwlzxSqlSessionTemplate(
@Qualifier("zhltwlzxSqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
其他数据源配置文件
去掉@Primary
,里外改个名就行了
测试代码
service - serviceImpl - mapper - mapper.xml关系如上,均为自动生成,只有 serviceImpl 添加了一个@Service
标签
import com.hzlq.iot.mapper.zhltwlzx.TbIotMapper;
import com.hzlq.iot.model.DO.TbIot;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
class IotApplicationTests {
@Resource
TbIotMapper tbIotMapper;
@Test
void contextLoads() {
//调用mybatis plus定义好的 selectList 方法
List<TbIot> list = tbIotMapper.selectList(null);
for (TbIot tbIot : list) {
System.out.println(tbIot);
}
}
}
运行结果
我的纠错过程
1.bean 的名称与累的名称不对应
2.是 MybatisSqlSessionFactoryBean 不是 SqlSessionFactoryBean
3.是 jdbc_url 不是 url
若有其他原因可以参照单数据源先排错