通用Mapper是一款针对mybatis进行扩展的轻量级组件,使用起来非常方便。当调用其针对mysql进行批量添加数据的方法时,发现报错,仔细研究了一番,发现是在使用通用Mapper上出现了问题。下面贴出本文使用的通用的Mapper github 地址及其版本。

通用Mapper github主页:https://github.com/abel533/Mapper/   本文示例使用的版本是3.5.4-SNAPSHOT 该分支的链接:  https://github.com/abel533/Mapper/tree/3.5.x


继承通用Mapper的DAO层示例代码:

  1. package com.github.torlight.sbex;
  2.  
  3. import tk.mybatis.mapper.common.Mapper;
  4. import tk.mybatis.mapper.common.MySqlMapper;
  5.  
  6. public interface TEntityDAO extends Mapper<TEntityDO>,MySqlMapper<TEntityDO>{
  7.  
  8. }

批量添加数据的示例代码:

  1. package com.github.torlight.sbex;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.springframework.boot.SpringApplication;
  7. import org.springframework.boot.autoconfigure.SpringBootApplication;
  8. import org.springframework.context.ApplicationContext;
  9.  
  10. @SpringBootApplication
  11. public class Example3Main {
  12.  
  13. public static void main(String[] args) {
  14.  
  15. ApplicationContext ctx=SpringApplication.run(Example3Main.class, args);
  16.  
  17. System.out.println("Example3Main running...");
  18.  
  19. List<TEntityDO> tEntityDOList=new ArrayList<TEntityDO>(10);
  20. tEntityDOList.add(new TEntityDO("1"));
  21. tEntityDOList.add(new TEntityDO("2"));
  22. tEntityDOList.add(new TEntityDO("3"));
  23. tEntityDOList.add(new TEntityDO("4"));
  24. tEntityDOList.add(new TEntityDO("5"));
  25. tEntityDOList.add(new TEntityDO("6"));
  26. tEntityDOList.add(new TEntityDO("7"));
  27. tEntityDOList.add(new TEntityDO("8"));
  28. tEntityDOList.add(new TEntityDO("9"));
  29. tEntityDOList.add(new TEntityDO("10"));
  30.  
  31. TEntityDAO tEntityDAO=ctx.getBean(TEntityDAO.class);
  32. tEntityDAO.insertList(tEntityDOList);
  33.  
  34. }
  35.  
  36. }

运行程序后,出现如下错误:

  1. 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
  2. at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
  3. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
  4. at com.sun.proxy.$Proxy62.insert(Unknown Source)
  5. at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
  6. at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
  7. at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
  8. at com.sun.proxy.$Proxy63.insertList(Unknown Source)
  9. at com.github.torlight.sbex.Example3Main.main(Example3Main.java:33)
  10. 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
  11. at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:103)
  12. at org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:73)
  13. at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
  14. at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
  15. at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:40)
  16. at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
  17. at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:545)
  18. at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
  19. at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
  20. at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
  21. at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
  22. at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
  23. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  24. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  25. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  26. at java.lang.reflect.Method.invoke(Method.java:606)
  27. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
  28. ... 6 more
  29. Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.SpecialProvider
  30. at java.lang.Class.newInstance(Class.java:364)
  31. at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:85)
  32. ... 22 more

当出现该错误之后,随手在网上搜索了一把,看看别人是怎么解决的。找到如下一篇文章(文章的链接如下文),非常遗憾该文章也没有给出更加实际的解决办法。

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


  我把目光停留在了用于访问数据库的DAO层 TEntityDAO 类上面,该接口继承了Mapper和MySqlMapper 两个接口,这两个接口有啥区别呢? 带着这个疑问,我进入到这两个接口。细看了两个接口之后,发现Mapper只是提供普通的CRUD,而批量添加数据接口在后者。两者区别在这儿。下面贴出这两个接口的截图。

                    通用Mapper接口

                  批量添加接口


看到这两个接口的区别,回想到通用Mpper配置,配置扫描时时只添加了通用Mapper接口,tk.mybatis.mapper.common.Mapper ,是不是也要把批量添加的接口也要添加到接口扫描配置里面。

通用接口扫描代码:

  1. @Bean
  2. public MapperScannerConfigurer mapperScannerConfigurer(){
  3.  
  4. Properties properties=new Properties();
  5. properties.put("mappers","tk.mybatis.mapper.common.Mapper");
  6.  
  7. MapperScannerConfigurer msc=new MapperScannerConfigurer();
  8. msc.getMapperHelper().setProperties(properties);
  9. msc.setBasePackage(DataSourceConfig.PACKAGE);
  10. msc.setSqlSessionFactoryBeanName(DataSourceConfig.SESSION_FACTORY_BEAN_NAME);
  11.  
  12. return msc;
  13. }

修改后的通用接口扫描代码:

  1. @Bean
  2. public MapperScannerConfigurer mapperScannerConfigurer(){
  3.  
  4. Properties properties=new Properties();
  5. properties.put("mappers","tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper");
  6.  
  7. MapperScannerConfigurer msc=new MapperScannerConfigurer();
  8. msc.getMapperHelper().setProperties(properties);
  9. msc.setBasePackage(DataSourceConfig.PACKAGE);
  10. msc.setSqlSessionFactoryBeanName(DataSourceConfig.SESSION_FACTORY_BEAN_NAME);
  11.  
  12. return msc;
  13. }

重新运行程序后,还真是这儿的原因。

总结:通用Mapper基本的CRUD方法和批量操作数据库的方法不是放在一起,需要由程序按需加载。

示例代码已经上传到github,代码中没有数据库相关的配置,运行代码之前,需要把数据库相关的配置补上。

完整的代码见:https://github.com/gittorlight/springboot-example/tree/master/example3

spring boot之使用通用Mapper批量添加数据的更多相关文章

  1. spring boot集成MyBatis 通用Mapper 使用总结

    spring boot集成MyBatis 通用Mapper 使用总结 2019年 参考资料: Spring boot集成 MyBatis 通用Mapper SpringBoot框架之通用mapper插 ...

  2. Spring boot集成 MyBatis 通用Mapper

    配置 POM文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  3. Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合

    文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...

  4. Spring Boot 2.X(二):集成 MyBatis 数据层开发

    MyBatis 简介 概述 MyBatis 是一款优秀的持久层框架,支持定制化 SQL.存储过程以及高级映射.它采用面向对象编程的方式对数据库进行 CRUD 的操作,使程序中对关系数据库的操作更方便简 ...

  5. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache

    文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...

  6. Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门

    文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Mav ...

  7. Spring Boot 揭秘与实战(二) 数据存储篇 - ElasticSearch

    文章目录 1. 版本须知 2. 环境依赖 3. 数据源 3.1. 方案一 使用 Spring Boot 默认配置 3.2. 方案二 手动创建 4. 业务操作5. 总结 4.1. 实体对象 4.2. D ...

  8. Spring Boot 揭秘与实战(二) 数据存储篇 - MongoDB

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用mongoTemplate操作4. 总结 3.1. 实体对象 3 ...

  9. Spring Boot 揭秘与实战(二) 数据存储篇 - Redis

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用 redisTemplate 操作4. 总结 3.1. 工具类 ...

随机推荐

  1. vue 混入的理解

  2. 转:EasyJSWebView

    EasyJSWebView 是类似 Android  javascriptInterface 的 uiwebview js 调用原生代码框架 示例代码: 先建一个MyJSInterface接口 @in ...

  3. 穷竭搜索:POJ 3187 Backward Digit Sums

    题目:http://poj.org/problem?id=3187 题意: 像这样,输入N : 表示层数,输入over表示最后一层的数字,然后这是一个杨辉三角,根据这个公式,由最后一层的数,推出第一行 ...

  4. Http 学习笔记(一)

    介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议.. ...

  5. python 压缩每周生成的数据文件

    为了便于整理部分业务数据,以及存储管理, 写了此脚本.后期如果有需求,再改一下. #!/usr/bin/env python #coding:utf8 import os,sys,time,comma ...

  6. ArcGis数据分类(ClassBreaksDefinition)

    文章转载自:Arcgis数据分类那些事儿 数据分类.地图分级(Classification)通常用于Choropleth Map(面量图)的制作中,是专题制图中最初,也是最基本的一个步骤.没有进行过分 ...

  7. bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)

    [题意] 你可以产生一个回文串,也可以将两个串合并成一个串,问产生目标串需要的最少合并次数. [思路] 显然我们要先产生目标串中包含的极大回文字符串. Manacher求出每个位置可以向两边延伸的最长 ...

  8. 在嵌入式Linux系统(OK6410)中移植Boa 服务器

    OK6410的Boa服务器移植: <一> Boa的编译 1. 从 www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz. 2. 解压:tar xzf ...

  9. 16、DecimalFormat类

    DecimalFormat类概述 在一些金融或者银行的业务里面,会出现这样千分位格式的数字,¥123,456.00,表示人民币壹拾贰万叁仟肆佰伍拾陆元整,java.text包下提供了一个Decimal ...

  10. macOS 安装 pcl 1.8.0

    Mac 上的 pcl 一直有问题. 找不到 pcl_viewer 查看 pcd 文件.写个程序用 pcl::visualization::CloudViewer 查看点云,遇到 Runtime Exc ...