引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法
錯誤
Mybatis-Plus (簡稱MP) 是mybatis的一個增強工具,在mybatis的基礎上只做增強不做改變,簡化了開發(fā)效率。其實就是幫我們封裝了一些簡單的curd方法,可以直接調(diào)用,不必再重寫這些簡單的sql語句,類似JPA那樣。
前兩天創(chuàng)建了一個新項目,持久層框架用的是mybatis,同時引入mybatis-plus做增強工具,項目啟動后,調(diào)用接口卻發(fā)現(xiàn)報錯了,報錯的提醒如下:
錯誤的信息顯示的是 “無效的綁定語句“,報錯的地方正是操作sql語句的方法,從網(wǎng)上查了一下答案,該錯誤主要是數(shù)據(jù)源綁定的配置問題,于是我順騰摸瓜,從配置數(shù)據(jù)源的地方下手。
查找原因
因為項目是做了多數(shù)據(jù)源的讀寫分離,所以我把數(shù)據(jù)源的動態(tài)配置整合到了一個類DataSourceConfig中,這是該類的代碼:
@Configuration @MapperScan(basePackages = "com.xjt.proxy.mapper", sqlSessionTemplateRef = "sqlTemplate") public class DataSourceConfig { /** * 主庫 */ @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDb() { return DruidDataSourceBuilder.create().build(); } /** * 從庫 */ @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDb() { return DruidDataSourceBuilder.create().build(); } /** * 主從動態(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)容沒什么復雜的,主要是對主從庫的數(shù)據(jù)源配置映射,以及把數(shù)據(jù)源注入SqlSessionFactory對象中,如果對該部分代碼或者讀寫分離比較疑惑的話,可以看我之前的文章《讀寫分離很難嗎?springboot結(jié)合aop簡單就實現(xiàn)了》
主從庫映射數(shù)據(jù)源沒什么異議,想來想去應該是注入那一步有問題,然后就把目光放到了sessionFactory
方法上,該方法主要是返回一個SqlSessionFactory
對象,該對象是由通過新建一個SqlSessionFactoryBean
對象并注入數(shù)據(jù)源后返回的,問題應該是出在這個SqlSessionFactoryBean類上,后來,經(jīng)平哥(我旁邊的大佬)提醒后,這里應該要換成mybatis-plus中另一個Bean工廠類,叫做MybatisSqlSessionFactoryBean,點開該類的源碼,才發(fā)現(xiàn)該類正是拷貝了SqlSessionFactoryBean,并且重寫了自己的自定義加載方法buildSqlSessionFactory
,
跳轉(zhuǎn)到該方法的源碼中,發(fā)現(xiàn)其中有一段代碼比較重要,配置中少了這一步就會注入失敗,
改動
也就是說,注入數(shù)據(jù)源的地方還需要配置mapper的掃描路徑,如此一來,改動的地方也比較明確了,就是注入數(shù)據(jù)源的地方把 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(resolver.getResources("classpath*:mapper/*Mapper.xml")); return sqlSessionFactoryBean.getObject(); }
這樣一來,再次啟動項目就可以正常操作sql語句了。
總結(jié)
到此這篇關于引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法的文章就介紹到這了,更多相關Mybatis plus Invalid bound statement內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤解決方法
- 解決mybatis-plus通用mapper調(diào)用報錯:Invalid bound statement
- 使用mybatis-plus報錯Invalid bound statement (not found)錯誤
- MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)
- mybatisplus報Invalid bound statement (not found)錯誤的解決方法
- 使用mybatis報Invalid bound statement解決分析
相關文章
Java中Buffer緩沖區(qū)的ByteBuffer類詳解
這篇文章主要介紹了Java中Buffer緩沖區(qū)的ByteBuffer類詳解,ByteBuffer類是Java NIO庫中的一個重要類,用于處理字節(jié)數(shù)據(jù),它提供了一種靈活的方式來讀取、寫入和操作字節(jié)數(shù)據(jù),ByteBuffer類是一個抽象類,可以通過靜態(tài)方法創(chuàng)建不同類型的ByteBuffer對象,需要的朋友可以參考下2023-10-10Spring Cloud學習教程之DiscoveryClient的深入探究
這篇文章主要給大家介紹了關于Spring Cloud學習教程之DiscoveryClient的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04Java實現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn) 逆序等
單鏈表是鏈表的其中一種基本結(jié)構。一個最簡單的結(jié)點結(jié)構如圖所示,它是構成單鏈表的基本結(jié)點結(jié)構。在結(jié)點中數(shù)據(jù)域用來存儲數(shù)據(jù)元素,指針域用于指向下一個具有相同結(jié)構的結(jié)點。 因為只有一個指針結(jié)點,稱為單鏈表2021-10-10淺析Spring配置中的classpath:與classpath*:的區(qū)別
這篇文章主要介紹了Spring配置中的"classpath:"與"classpath*:"的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08關于SpringBoot中controller參數(shù)校驗的使用
本文主要介紹了關于SpringBoot中controller參數(shù)校驗的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01