mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程
使用InsertProvider注解報(bào)錯(cuò)解決
目前項(xiàng)目在使用mybatis,并且是使用注解的方式。
在使用InsertProvider注解的時(shí)候報(bào)了一下的錯(cuò)誤:
org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation. Cause: org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method........
注解是如下這個(gè)樣子的
思路是要寫一個(gè)通用的插入一個(gè)集合的方法,但是在執(zhí)行的時(shí)候就報(bào)了上面的錯(cuò)誤。
在網(wǎng)上查資料未果。
于是只能自己動(dòng)手,豐衣足食了。
一步步跟斷點(diǎn),跟到mybatis了報(bào)錯(cuò)的方法中,發(fā)現(xiàn)了如下的代碼
try {
? ? ? this.sqlSourceParser = new SqlSourceBuilder(config);
? ? ? this.providerType = (Class<?>) provider.getClass().getMethod("type").invoke(provider);
? ? ? providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider);
? ? ? for (Method m : this.providerType.getMethods()) {
? ? ? ? if (providerMethodName.equals(m.getName())) {
? ? ? ? ? if (m.getParameterTypes().length < 2
? ? ? ? ? ? ? && m.getReturnType() == String.class) {
? ? ? ? ? ? this.providerMethod = m;
? ? ? ? ? ? this.providerTakesParameterObject = m.getParameterTypes().length == 1;
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? } catch (Exception e) {
? ? ? throw new BuilderException("Error creating SqlSource for SqlProvider. ?Cause: " + e, e);
? ? }注意標(biāo)黃的位置,終于發(fā)現(xiàn)導(dǎo)致錯(cuò)誤的罪魁禍?zhǔn)琢?,原來是這里限制了參數(shù)的個(gè)數(shù),不能操作兩個(gè)參數(shù)的啊。
于是將方法以及注解改為如下形式
@InsertProvider(method = "insert",type=SqlProvider.class)
?public int insert(SqlContext sqlContext);
在SqlProvider中對(duì)應(yīng)的方法為
public String insert(SqlContext sqlContext){
? ? ? ........
}至此問題解決
mybatis注解開發(fā)@InsertProvider
插入一條user的數(shù)據(jù),可以直接根據(jù)username和password插入
//insert into user(username,password) values(?,?)
@Insert("insert into user(username,password) values(#{username},#{password})")
void save(User user);但是如果有一個(gè)需求,要求傳入username和password能正常輸入,傳入username、password、id也能夠正常插入,這個(gè)時(shí)候就可以使用Provider注解。
這個(gè)的用法就是可以創(chuàng)建一個(gè)方法類,在類里面做判斷,讓mapper里面的查詢方法根據(jù)寫的方法來選擇需要的sql語句。
Userprovider類
import com.sikiedu.springbootssm.entity.User;
public class Userprovider {?? ?
?? ?public String saveUser(User user)
?? ?{
?? ??? ?if(user.getId()==null)
?? ??? ?{
?? ??? ??? ?return "insert into user(username,password) values(#{username},#{password}) ";
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?return "insert into user values(#{id},#{username},#{password})";
?? ??? ?}
?? ?}?? ?
}在這個(gè)類里面我們做判斷,選擇需要的sql語句。
mapper的書寫
@InsertProvider(type = Userprovider.class,method="saveUser") void save (User user);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA中Tomcat日志亂碼問題的解決指南
在使用IntelliJ IDEA進(jìn)行Java開發(fā)時(shí),Tomcat作為常用的服務(wù)器,往往被集成在開發(fā)環(huán)境中,許多開發(fā)者可能會(huì)遇到這樣一個(gè)問題:啟動(dòng) Tomcat 服務(wù)器時(shí),控制臺(tái)的日志輸出出現(xiàn)了亂碼,本文將詳細(xì)介紹如何通過修改IntelliJ IDEA和Tomcat的相關(guān)配置,徹底解決日志輸出亂碼的問題2024-10-10
java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法
今天小編就為大家分享一篇java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決
這篇文章主要介紹了SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)開發(fā)醫(yī)院科室及排班的接口
這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)開發(fā)醫(yī)院科室及排班的接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-04-04
spring中的注解@@Transactional失效的場景代碼演示
這篇文章主要介紹了spring中的注解@@Transactional失效的場景代碼演示,@Transactional注解是Spring框架提供的用于聲明事務(wù)的注解,作用于類和方法上,需要的朋友可以參考下2024-01-01
基于Java的度分秒坐標(biāo)轉(zhuǎn)純經(jīng)緯度坐標(biāo)的漂亮國基地信息管理的方法
本文以java語言為例,詳細(xì)介紹如何管理漂亮國的基地信息,為下一步全球的空間可視化打下堅(jiān)實(shí)的基礎(chǔ),首先介紹如何對(duì)數(shù)據(jù)進(jìn)行去重處理,然后介紹在java當(dāng)中如何進(jìn)行度分秒位置的轉(zhuǎn)換,最后結(jié)合實(shí)現(xiàn)原型進(jìn)行詳細(xì)的說明,感興趣的朋友跟隨小編一起看看吧2024-06-06
SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能
本文介紹SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預(yù)覽時(shí)會(huì)在同級(jí)目錄下創(chuàng)建一個(gè)相同文件名后綴為pdf的文件,每次預(yù)覽會(huì)先查找文件是否存在,存在則直接預(yù)覽,不存在則會(huì)走上面的處理,需要的朋友可以參考下2022-02-02
Java實(shí)現(xiàn)簡單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
idea復(fù)制module(項(xiàng)目)并在一個(gè)窗口展示的教程詳解
這篇文章主要介紹了idea復(fù)制module(項(xiàng)目)并在一個(gè)窗口展示的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

