通用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层示例代码:

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>{ }

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

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); } }

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

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

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

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 ,是不是也要把批量添加的接口也要添加到接口扫描配置里面。

通用接口扫描代码:

    @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;
}

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

总结:通用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. linux网络编程框架

    OSI七层模型与TCP四层模型 OSI七层模型与TCP四层模型 BS和CS服务器架构 (1)CS架构介绍(client server,客户端服务器架构)(2)BS架构介绍(broswer server ...

  2. 科学计算三维可视化---TVTK管线与数据加载(用IVTK根据观察管线)

    一:用IVTK根据观察管线 (一)引入该工具 from tvtk.tools import ivtk 可能需要安装pygments pip3 install pygments (二)使用ivtk显示立 ...

  3. TV 开发相关

    1.设置全屏,隐藏虚拟按键 1.activity oncreate中 @Override 2 protected void onCreate (Bundle savedInstanceState) { ...

  4. 第一回 java~简介

    Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...

  5. 回溯算法——解决n皇后问题

    所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...

  6. golang sql.DB

    数据库 sql.DB连接池需知: sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用sql.Open()时传入的dsn来构造. sql.DBClose时只会关闭连接池中的连接,未归还 ...

  7. Shader 学习工具篇 可视化公式工具ZGrapher

    大家好,我是怒风,本篇介绍公式可视化公式工具ZGrapher,尝试通过可视化的方式分析一下Shader中应用的公式,以求帮助初学者快速理解Shader编程中的一些常用公式 本篇的目的两个, 第一,介绍 ...

  8. 学号20155308 2016-2017-2 《Java程序设计》第6周学习总结

    学号20155308 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入与输出 目的:文件的读写:网络上传数据的基础:同样要掌握父类中方法. 10. ...

  9. Python练习-猜年龄的LowB游戏

    Alex大神今天让我做一个猜年龄的游戏: 第一个游戏是你只能猜三次:真的很LowB啊~ # 编辑者:闫龙 #猜年龄游戏,3次后程序自动退出! ages = 29; #for循环3次 for i in ...

  10. C# 图片和Base64之间的转换

    public static Bitmap GetImageFromBase64String(string strBase) { try { MemoryStream stream = new Memo ...