引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問(wèn)題的解決方法
錯(cuò)誤
Mybatis-Plus (簡(jiǎn)稱(chēng)MP) 是mybatis的一個(gè)增強(qiáng)工具,在mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,簡(jiǎn)化了開(kāi)發(fā)效率。其實(shí)就是幫我們封裝了一些簡(jiǎn)單的curd方法,可以直接調(diào)用,不必再重寫(xiě)這些簡(jiǎn)單的sql語(yǔ)句,類(lèi)似JPA那樣。
前兩天創(chuàng)建了一個(gè)新項(xiàng)目,持久層框架用的是mybatis,同時(shí)引入mybatis-plus做增強(qiáng)工具,項(xiàng)目啟動(dòng)后,調(diào)用接口卻發(fā)現(xiàn)報(bào)錯(cuò)了,報(bào)錯(cuò)的提醒如下:

錯(cuò)誤的信息顯示的是 “無(wú)效的綁定語(yǔ)句“,報(bào)錯(cuò)的地方正是操作sql語(yǔ)句的方法,從網(wǎng)上查了一下答案,該錯(cuò)誤主要是數(shù)據(jù)源綁定的配置問(wèn)題,于是我順騰摸瓜,從配置數(shù)據(jù)源的地方下手。
查找原因
因?yàn)轫?xiàng)目是做了多數(shù)據(jù)源的讀寫(xiě)分離,所以我把數(shù)據(jù)源的動(dòng)態(tài)配置整合到了一個(gè)類(lèi)DataSourceConfig中,這是該類(lèi)的代碼:
@Configuration
@MapperScan(basePackages = "com.xjt.proxy.mapper", sqlSessionTemplateRef = "sqlTemplate")
public class DataSourceConfig {
/**
* 主庫(kù)
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDb() {
return DruidDataSourceBuilder.create().build();
}
/**
* 從庫(kù)
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDb() {
return DruidDataSourceBuilder.create().build();
}
/**
* 主從動(dòng)態(tài)配置
*/
@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(DynamicDataSourceEnum.MASTER.getDataSourceName(), masterDataSource);
if (slaveDataSource != null) {
targetDataSources.put(DynamicDataSourceEnum.SLAVE.getDataSourceName(), 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/*Mapper.xml"));
bean.setDataSource(dynamicDataSource);
return bean.getObject();
}
@Bean
public SqlSessionTemplate sqlTemplate(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "dataSourceTx")
public DataSourceTransactionManager dataSourceTx(@Qualifier("dynamicDb") DataSource dynamicDataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dynamicDataSource);
return dataSourceTransactionManager;
}
}
內(nèi)容沒(méi)什么復(fù)雜的,主要是對(duì)主從庫(kù)的數(shù)據(jù)源配置映射,以及把數(shù)據(jù)源注入SqlSessionFactory對(duì)象中,如果對(duì)該部分代碼或者讀寫(xiě)分離比較疑惑的話(huà),可以看我之前的文章《讀寫(xiě)分離很難嗎?springboot結(jié)合aop簡(jiǎn)單就實(shí)現(xiàn)了》
主從庫(kù)映射數(shù)據(jù)源沒(méi)什么異議,想來(lái)想去應(yīng)該是注入那一步有問(wèn)題,然后就把目光放到了sessionFactory方法上,該方法主要是返回一個(gè)SqlSessionFactory對(duì)象,該對(duì)象是由通過(guò)新建一個(gè)SqlSessionFactoryBean對(duì)象并注入數(shù)據(jù)源后返回的,問(wèn)題應(yīng)該是出在這個(gè)SqlSessionFactoryBean類(lèi)上,后來(lái),經(jīng)平哥(我旁邊的大佬)提醒后,這里應(yīng)該要換成mybatis-plus中另一個(gè)Bean工廠類(lèi),叫做MybatisSqlSessionFactoryBean,點(diǎn)開(kāi)該類(lèi)的源碼,才發(fā)現(xiàn)該類(lèi)正是拷貝了SqlSessionFactoryBean,并且重寫(xiě)了自己的自定義加載方法buildSqlSessionFactory,

跳轉(zhuǎn)到該方法的源碼中,發(fā)現(xiàn)其中有一段代碼比較重要,配置中少了這一步就會(huì)注入失敗,

改動(dòng)
也就是說(shuō),注入數(shù)據(jù)源的地方還需要配置mapper的掃描路徑,如此一來(lái),改動(dòng)的地方也比較明確了,就是注入數(shù)據(jù)源的地方把 SqlSessionFactoryBean 改成 MybatisSqlSessionFactoryBean 后,并配置mapper文件對(duì)應(yīng)的路徑,也就是把sessionFactory方法改成如下代碼:
@Bean
public SqlSessionFactory sessionFactory(@Qualifier("dynamicDb") DataSource dynamicDataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*Mapper.xml"));
return sqlSessionFactoryBean.getObject();
}
這樣一來(lái),再次啟動(dòng)項(xiàng)目就可以正常操作sql語(yǔ)句了。
總結(jié)
到此這篇關(guān)于引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問(wèn)題的解決方法的文章就介紹到這了,更多相關(guān)Mybatis plus Invalid bound statement內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis創(chuàng)建項(xiàng)目報(bào)Invalid?bound?statement?(not?found)錯(cuò)誤解決方法
- 解決mybatis-plus通用mapper調(diào)用報(bào)錯(cuò):Invalid bound statement
- 使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤
- MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)
- mybatisplus報(bào)Invalid bound statement (not found)錯(cuò)誤的解決方法
- 使用mybatis報(bào)Invalid bound statement解決分析
相關(guān)文章
深入理解java動(dòng)態(tài)代理的兩種實(shí)現(xiàn)方式(JDK/Cglib)
本篇文章主要介紹了java動(dòng)態(tài)代理的兩種實(shí)現(xiàn)方式,詳細(xì)的介紹了JDK和Cglib的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-04-04
淺析Spring的事務(wù)實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)介紹了Spring中事務(wù)實(shí)現(xiàn)的原理,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Spring有一定的幫助,需要的可以參考一下2022-11-11
SpringBoot與spring security的結(jié)合的示例
這篇文章主要介紹了SpringBoot與spring security的結(jié)合的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
mybatis-generator-gui 工具使用(圖形化工具)
基于 mybatis generator 開(kāi)發(fā)一款界面工具, 本工具可以使你非常容易及快速生成 Mybatis 的 Java POJO 文件及數(shù)據(jù)庫(kù) Mapping 文件。本文重點(diǎn)給大家介紹mybatis-generator-gui 工具使用,感興趣的朋友一起看看吧2022-03-03

