引⼊mybatis-plus报Invalidboundstatement错误怎么办,动动⼿。。。
错误
Mybatis-Plus (简称MP) 是mybatis的⼀个增强⼯具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就是帮我们封装了⼀些简单的curd⽅法,可以直接调⽤,不必再重写这些简单的sql语句,类似JPA那样。
前两天创建了⼀个新项⽬,持久层框架⽤的是mybatis,同时引⼊mybatis-plus做增强⼯具,项⽬启动后,调⽤接⼝却发现报错了,报错的提醒如下:
错误的信息显⽰的是 “⽆效的绑定语句“,报错的地⽅正是操作sql语句的⽅法,从⽹上查了⼀下答案,该错误主要是数据源绑定的配置问题,于是我顺腾摸⽠,从配置数据源的地⽅下⼿。
查原因
因为项⽬是做了多数据源的读写分离,所以我把数据源的动态配置整合到了⼀个类DataSourceConfig中,这是该类的代码:
@Configuration
@MapperScan(basePackages = "com.xjt.proxy.mapper", sqlSessionTemplateRef = "sqlTemplate")
public class DataSourceConfig {
/**
* 主库
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDb() {
ate().build();
}
/**
* 从库
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDb() {
ate().build();
}
/**
* 主从动态配置
*/
@Bean
public DynamicDataSource dynamicDb(@Qualifier("masterDb") DataSource masterDataSource,
@Autowired(required = false) @Qualifier("slaveDb") DataSource slaveDataSource) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceName(), masterDataSource);
if (slaveDataSource != null) {
targetDataSources.put(DataSourceName(), slaveDataSource);
}
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory sessionFactory(@Qualifier("dynamicDb") DataSource dynamicDataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*l"));
bean.setDataSource(dynamicDataSource);
Object();
}
@Bean
public SqlSessionTemplate sqlTemplate(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
jpa mybatis}
@Bean(name = "dataSourceTx")
public DataSourceTransactionManager dataSourceTx(@Qualifier("dynamicDb") DataSource dynamicDataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dynamicDataSource);
return dataSourceTransactionManager;
}
}
内容没什么复杂的,主要是对主从库的数据源配置映射,以及把数据源注⼊SqlSessionFactory对象中,如果对该部分代码或者读写分离⽐较疑惑的话,可以看我之前的⽂章
主从库映射数据源没什么异议,想来想去应该是注⼊那⼀步有问题,然后就把⽬光放到了sessionFactory⽅法上,该⽅法主要是返回⼀
个SqlSessionFactory对象,该对象是由通过新建⼀个SqlSessionFactoryBean对象并注⼊数据源后返回的,问题应该是出在这个SqlSessionFactoryBean类上,后来,经平哥(我旁边的⼤佬)提醒后,这⾥应该要换成mybatis-plus中另⼀个Bean⼯⼚类,叫做MybatisSqlSessionFactoryBean,点开该类的源码,才发现该类正是拷贝了SqlSessionFactoryBean,并且重写了⾃⼰的⾃定义加载⽅法buildSqlSessionFactory,
跳转到该⽅法的源码中,发现其中有⼀段代码⽐较重要,配置中少了这⼀步就会注⼊失败,
改动
也就是说,注⼊数据源的地⽅还需要配置mapper的扫描路径,如此⼀来,改动的地⽅也⽐较明确了,就是注⼊数据源的地⽅把SqlSessionFactoryBean 改成 MybatisSqlSessionFactoryBean 后,并配置mapper⽂件对应的路径,也就是把sessionFactory⽅法改成如下代码:
@Bean
public SqlSessionFactory sessionFactory(@Qualifier("dynamicDb") DataSource dynamicDataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(Resources("classpath*:mapper/*l"));
Object();
}
这样⼀来,再次启动项⽬就可以正常操作sql语句了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论