spring 使用通用Mapper批量添加數(shù)據(jù) java.lang.InstantiationException: tk.mybatis.mapper.provide.SpecialProvider

轉(zhuǎn)載:https://www.cnblogs.com/yql1986/p/9459478.html

通用Mapper是一款針對(duì)mybatis進(jìn)行擴(kuò)展的輕量級(jí)組件,使用起來(lái)非常方便蔬将。當(dāng)調(diào)用其針對(duì)mysql進(jìn)行批量添加數(shù)據(jù)的方法時(shí)谴仙,發(fā)現(xiàn)報(bào)錯(cuò),仔細(xì)研究了一番默伍,發(fā)現(xiàn)是在使用通用Mapper上出現(xiàn)了問(wèn)題欢嘿。下面貼出本文使用的通用的Mapper github 地址及其版本授霸。

通用Mapper github主頁(yè):https://github.com/abel533/Mapper/ 本文示例使用的版本是3.5.4-SNAPSHOT 該分支的鏈接: https://github.com/abel533/Mapper/tree/3.5.x

繼承通用Mapper的DAO層示例代碼:

package com.github.torlight.sbex;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

public interface TEntityDAO extends Mapper<TEntityDO>,MySqlMapper<TEntityDO>{
    
}

批量添加數(shù)據(jù)的示例代碼:

package com.github.torlight.sbex;

import java.util.ArrayList;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Example3Main {

    public static void main(String[] args) {
        
        ApplicationContext ctx=SpringApplication.run(Example3Main.class, args);
        
        System.out.println("Example3Main running...");
        
        List<TEntityDO> tEntityDOList=new ArrayList<TEntityDO>(10);
        tEntityDOList.add(new TEntityDO("1"));
        tEntityDOList.add(new TEntityDO("2"));
        tEntityDOList.add(new TEntityDO("3"));
        tEntityDOList.add(new TEntityDO("4"));
        tEntityDOList.add(new TEntityDO("5"));
        tEntityDOList.add(new TEntityDO("6"));
        tEntityDOList.add(new TEntityDO("7"));
        tEntityDOList.add(new TEntityDO("8"));
        tEntityDOList.add(new TEntityDO("9"));
        tEntityDOList.add(new TEntityDO("10"));
        
        TEntityDAO tEntityDAO=ctx.getBean(TEntityDAO.class);
        tEntityDAO.insertList(tEntityDOList);
            
    }

}

運(yùn)行程序后,出現(xiàn)如下錯(cuò)誤:

Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvider.dynamicSQL).  Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.SpecialProvider
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy62.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
    at com.sun.proxy.$Proxy63.insertList(Unknown Source)
    at com.github.torlight.sbex.Example3Main.main(Example3Main.java:33)
Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvider.dynamicSQL).  Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.SpecialProvider
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:103)
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:73)
    at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
    at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:40)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
    at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:545)
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    ... 6 more
Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.SpecialProvider
    at java.lang.Class.newInstance(Class.java:364)
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:85)
    ... 22 more

當(dāng)出現(xiàn)該錯(cuò)誤之后际插,隨手在網(wǎng)上搜索了一把碘耳,看看別人是怎么解決的。找到如下一篇文章(文章的鏈接如下文)框弛,非常遺憾該文章也沒(méi)有給出更加實(shí)際的解決辦法辛辨。

tk.mybatis.mapper.provider.SpecialProvider.<init>() 原文鏈接地址:https://www.cnblogs.com/softidea/p/6624766.html

我把目光停留在了用于訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的DAO層 TEntityDAO 類(lèi)上面蹂窖,該接口繼承了Mapper和MySqlMapper 兩個(gè)接口乾蛤,這兩個(gè)接口有啥區(qū)別呢? 帶著這個(gè)疑問(wèn)叶眉,我進(jìn)入到這兩個(gè)接口慷妙。細(xì)看了兩個(gè)接口之后僻焚,發(fā)現(xiàn)Mapper只是提供普通的CRUD,而批量添加數(shù)據(jù)接口在后者膝擂。兩者區(qū)別在這兒虑啤。下面貼出這兩個(gè)接口的截圖。


通用Mapper接口

批量添加接口

看到這兩個(gè)接口的區(qū)別架馋,回想到通用Mpper配置狞山,配置掃描時(shí)時(shí)只添加了通用Mapper接口,tk.mybatis.mapper.common.Mapper 叉寂,是不是也要把批量添加的接口也要添加到接口掃描配置里面萍启。

通用接口掃描代碼:

@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
    
    Properties properties=new Properties();
    properties.put("mappers","tk.mybatis.mapper.common.Mapper");

    MapperScannerConfigurer msc=new MapperScannerConfigurer();      
    msc.getMapperHelper().setProperties(properties);
    msc.setBasePackage(DataSourceConfig.PACKAGE);
    msc.setSqlSessionFactoryBeanName(DataSourceConfig.SESSION_FACTORY_BEAN_NAME);
    
    return msc;
}

修改后的通用接口掃描代碼:

@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
    
    Properties properties=new Properties();
    properties.put("mappers","tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper");

    MapperScannerConfigurer msc=new MapperScannerConfigurer();      
    msc.getMapperHelper().setProperties(properties);
    msc.setBasePackage(DataSourceConfig.PACKAGE);
    msc.setSqlSessionFactoryBeanName(DataSourceConfig.SESSION_FACTORY_BEAN_NAME);
    
    return msc;
}

重新運(yùn)行程序后,還真是這兒的原因屏鳍。

總結(jié):通用Mapper基本的CRUD方法和批量操作數(shù)據(jù)庫(kù)的方法不是放在一起勘纯,需要由程序按需加載。
示例代碼已經(jīng)上傳到github钓瞭,代碼中沒(méi)有數(shù)據(jù)庫(kù)相關(guān)的配置驳遵,運(yùn)行代碼之前,需要把數(shù)據(jù)庫(kù)相關(guān)的配置補(bǔ)上降淮。
完整的代碼見(jiàn):https://github.com/gittorlight/springboot-example/tree/master/example3

以上是該博主解決springboot中整合mybatis的解決方法超埋,再springmvc中使用xml配置的,如下

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.sf.argus.web.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

再M(fèi)apperScannerConfigurer中有這樣的代碼

this.mapperHelper.ifEmptyRegisterDefaultInterface();

再點(diǎn)進(jìn)去是這樣的

/**
 * 如果當(dāng)前注冊(cè)的接口為空佳鳖,自動(dòng)注冊(cè)默認(rèn)接口
 */
public void ifEmptyRegisterDefaultInterface() {
    if (registerClass.size() == 0) {
        registerMapper("tk.mybatis.mapper.common.Mapper");
    }
}

確實(shí)只注冊(cè)了一個(gè)

所以霍殴,我們要自己指定注冊(cè)的mapper,改下xml加入屬性系吩,如下

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.sf.argus.web.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="properties">
        <value>
            mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper
        </value>
    </property>
</bean>

再試試就ok了@赐ァ!穿挨!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末月弛,一起剝皮案震驚了整個(gè)濱河市肴盏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帽衙,老刑警劉巖菜皂,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厉萝,居然都是意外死亡恍飘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)谴垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)章母,“玉大人,你說(shuō)我怎么就攤上這事翩剪∪樵酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵前弯,是天一觀(guān)的道長(zhǎng)蚪缀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)博杖,這世上最難降的妖魔是什么椿胯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮剃根,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘前方。我一直安慰自己狈醉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布惠险。 她就那樣靜靜地躺著苗傅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪班巩。 梳的紋絲不亂的頭發(fā)上渣慕,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音抱慌,去河邊找鬼逊桦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抑进,可吹牛的內(nèi)容都是我干的强经。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寺渗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匿情!你這毒婦竟也來(lái)了兰迫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炬称,失蹤者是張志新(化名)和其女友劉穎汁果,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體玲躯,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡据德,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了府蔗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晋控。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姓赤,靈堂內(nèi)的尸體忽然破棺而出赡译,到底是詐尸還是另有隱情,我是刑警寧澤不铆,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布蝌焚,位于F島的核電站,受9級(jí)特大地震影響誓斥,放射性物質(zhì)發(fā)生泄漏只洒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一劳坑、第九天 我趴在偏房一處隱蔽的房頂上張望毕谴。 院中可真熱鬧,春花似錦距芬、人聲如沸涝开。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舀武。三九已至,卻和暖如春离斩,著一層夾襖步出監(jiān)牢的瞬間银舱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工跛梗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寻馏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓茄袖,卻偏偏與公主長(zhǎng)得像操软,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宪祥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354