国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法

瀏覽:91日期:2023-10-24 08:42:35

錯(cuò)誤

Mybatis-Plus (簡(jiǎn)稱MP) 是mybatis的一個(gè)增強(qiáng)工具,在mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,簡(jiǎn)化了開發(fā)效率。其實(shí)就是幫我們封裝了一些簡(jiǎn)單的curd方法,可以直接調(diào)用,不必再重寫這些簡(jiǎn)單的sql語句,類似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ò)的提醒如下:

引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法

錯(cuò)誤的信息顯示的是 “無效的綁定語句“,報(bào)錯(cuò)的地方正是操作sql語句的方法,從網(wǎng)上查了一下答案,該錯(cuò)誤主要是數(shù)據(jù)源綁定的配置問題,于是我順騰摸瓜,從配置數(shù)據(jù)源的地方下手。

查找原因

因?yàn)轫?xiàng)目是做了多數(shù)據(jù)源的讀寫分離,所以我把數(shù)據(jù)源的動(dòng)態(tài)配置整合到了一個(gè)類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(); } /** * 主從動(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)容沒什么復(fù)雜的,主要是對(duì)主從庫的數(shù)據(jù)源配置映射,以及把數(shù)據(jù)源注入SqlSessionFactory對(duì)象中,如果對(duì)該部分代碼或者讀寫分離比較疑惑的話,可以看我之前的文章《讀寫分離很難嗎?springboot結(jié)合aop簡(jiǎn)單就實(shí)現(xiàn)了》

主從庫映射數(shù)據(jù)源沒什么異議,想來想去應(yīng)該是注入那一步有問題,然后就把目光放到了sessionFactory方法上,該方法主要是返回一個(gè)SqlSessionFactory對(duì)象,該對(duì)象是由通過新建一個(gè)SqlSessionFactoryBean對(duì)象并注入數(shù)據(jù)源后返回的,問題應(yīng)該是出在這個(gè)SqlSessionFactoryBean類上,后來,經(jīng)平哥(我旁邊的大佬)提醒后,這里應(yīng)該要換成mybatis-plus中另一個(gè)Bean工廠類,叫做MybatisSqlSessionFactoryBean,點(diǎn)開該類的源碼,才發(fā)現(xiàn)該類正是拷貝了SqlSessionFactoryBean,并且重寫了自己的自定義加載方法buildSqlSessionFactory,

引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法

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

引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法

改動(dòng)

也就是說,注入數(shù)據(jù)源的地方還需要配置mapper的掃描路徑,如此一來,改動(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(); }

這樣一來,再次啟動(dòng)項(xiàng)目就可以正常操作sql語句了。

總結(jié)

到此這篇關(guān)于引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法的文章就介紹到這了,更多相關(guān)Mybatis plus Invalid bound statement內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 成人www视频网站免费观看 | 成人毛片免费播放 | 国产欧美精品综合一区 | 久久精品视频在线观看 | 欧美国产日韩在线播放 | 无内丝袜透明在线播放 | 中文在线三级中文字幕 | 波多野结衣在线视频观看 | 免费一级特黄 欧美大片 | 欧美在线一级片 | 日本暖暖在线视频 | 亚洲日本一区二区三区在线 | 欧美日本在线一区二区三区 | 日韩欧美黄色 | 免费看又黄又爽又猛的网站 | 成人午夜在线观看国产 | 亚欧成人中文字幕一区 | 日本理论片免费高清影视在线观看 | 67194欧美成l人在线观看免费 | 欧美一级毛片日本 | 99re热这里只有精品视频 | 永久精品免费影院在线观看网站 | 欧美日韩一区二区三在线 | 日日撸夜夜操 | 国产成人精品区在线观看 | 亚洲第一区香蕉_国产a | 日本不卡免费高清一级视频 | 一级淫| 手机看片在线 | 琪琪午夜伦埋大全影院 | 成人精品久久 | 日本高清色视频www 日本高清在线精品一区二区三区 | 欧美69| 精品国产区一区二区三区在线观看 | 亚洲视频偷拍自拍 | 国产一区在线免费观看 | 午夜日韩 | selaoban在线视频免费精品 | 操你.com| 视频一区在线免费观看 | 午夜性刺激免费视频观看不卡专区 |