MySQL中,批量插入数据到表,会在一定程度提高效率。
insert into table (column1, column2)values(value1, value2), (value1, value2)
对于List<Map<String, Object>>类型的参数,使用mybatis实现上面语句需要用到动态SQL–foreach。
<insert id="batchInsert"">
insert into ${table_name} (
id, name)
values
<foreach collection="LIST" item="item" index="index" open="(" separator="," close=")">
#{item.id, jdbcType=VARCHAR},
#{item.name, jdbcType=VARCHAR}
</foreach>
</insert>
上面的语句对于MySQL执行起来没有问题,但对Oracle数据库则会报如题错误:SQL命令未正确结束。
经过一系列的测试实验,找到了用Oracle虚拟表来解决这个问题,首先将数据foreach作为一张虚拟表,然后全量插入到新表中。
INSERT INTO TEMP_20200210 (DMC)
SELECT CD.* FROM
SELECT 1234567 FROM DUAL UNION
SELECT 1234568 FROM DUAL UNION
SELECT 1234568 FROM DUAL
上面语句,有博客中测试150万条数据182秒插入完成。本文的场景每次最多插入1000条,秒级肯定能完成,因为笔者场景是异步插入数据,对性能要求不高。
由此,改造mybatis语句如下
<insert id="batchInsert">
insert into ${table_name} (
id, name)
SELECT A.* FROM (
<foreach collection="LIST" item="item" index="index" separator="UNION ALL">
select
#{item.id, jdbcType=VARCHAR} id,
#{item.name, jdbcType=VARCHAR} name
FROM DUAL
</foreach>
</insert>
肯定有同学对语句中的$有疑问,有SQL注入风险。因此业务场景完全没有对外接口,可以放心使用。
我将1000条数据按照月份分成了多个Map作为插入参数,大致格式如下。
"table_name": "user_4",
"LIST": [
"id": "1",
"name": "bee"
"id": "2",
"name": "stack"
Mybatis 批量插入报ORA-00933: SQL 命令未正确结束错误出现的场景是这样的,将多个月份的1000条数据分别插入到各月份表中。MySQL中,批量插入数据到表,会在一定程度提高效率。insert into table (column1, column2)values(value1, value2), (value1, value2)对于List<Map<String, Object>>类型的参数,使用mybatis实现上面语句需要用到动态SQL–forea
Mybatis批量插入需要foreach元素。foreach元素有以下主要属性:
(1)item:集合中每一个元素进行迭代时的别名。
(2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置。
(3)collection:根据传入的参数值确定。
(4)open:表示该语句以什么开始。
(5)separator:表示在每次进行迭代之间以什么符号作为分隔 符。
(6)close:表示以什么结束。
首先,错误的xml配置文件如下:
insert into "sys_user_role"
mybatis-generator-gui-plus
mybatis-generator-gui-plus是基于
扩展的工具,区别在于功能上的扩展了批量操作的方法,其他几乎没有差别。
增加的方法说明:
batchUpdate
批量可选更新
batchUpdateSelective
batchInsert
条件查询返回一个
selectFirstByExample
按照界面步骤轻松生成代码,省去XML繁琐的学习与配置过程
保存数据库连接与Generator配置,每次代码生成轻松搞定
内置常用插件,比如分页插件
支持OverSSH
方式,通过SSH隧道连接至公司内网访问数据库
把数据库中表列的注释生成为Java实体的注释,生成的实体清晰明了
可选的去除掉对版本管理不友好的注释,这样新增或删除字段重新生成的文件比较过来清楚
目前已经支持Mysql、Mysql8、Oracle、PostgreSQL与SQL
Server,暂不对其他非主流数据库提供支持。(MySQL支持的比较好,其他数据库有什么问题可以在issue中反馈)
本工具由于
@Insert("<script>
Insert ALL into table(字段1,字段2)
values<foreach collection=\"list\" item=\"item\" index=\"index\" separator=\"into table VALUES\">"
(#{item},#{...
mybatis版本:mybatis-3.4.5.jar
Oracle版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
二、报ORA-00933
java实体类
public class Eenty implements Serializable{
private String sdate;
private String rs;
private String gro...
oracle 不支持
insert into 表名 (column1,column2,column3)values (value1,value2,value3),((value1,value2,value3))该种格式的
批量插入 my
sql 支持
oracle 写法 如下
<
insert id="
insertDataList" parameterType="java.util.List">
insert into authen_batch_verify_data(
oracle在mybatis中批量插入数据报错java.sql.SQLException: ORA-00933: SQL 命令未正确结束现象最常见的解决方案不常见解决方案原因解决方案
在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常
最常见的解决方案
网络上说的最多的解决方案大致都是说由于SQL语法造成的原因,例如这样:
Error updating databas
3.4.1
代码生成器,又被叫做逆向工程,
MyBatis官方为了推广,自己也写了一个,我之前也使用这个,功能也是非常强大,强大以为支持自定义配置,那么问题来了,我该怎么配置才合理呢,所以,有人把所有的配置项都弄成中文的,还有人开发了生成插件,这些在我以往的博文中都看看到。
MyBatis-Plus的代码生成器到底怎么样,这我就不评判了,我就这样说,用用看吧。
功能列表:
自动生成model类
自动生成dao接口
自动生成xml文件
自动生成service接口
自动生成service实现类
model支持Builder模式
支持swagger2
支持生成数据库字段常量
支持生成Kotlin代码
……more……
├── README.md
├── pom.xml
└── src
赠送jar包:
mybatis-paginator-1.2.15.jar;
赠送原API文档:
mybatis-paginator-1.2.15-javadoc.jar;
赠送源代码:
mybatis-paginator-1.2.15-sources.jar;
赠送Maven依赖信息文件:
mybatis-paginator-1.2.15.pom;
包含翻译后的API文档:
mybatis-paginator-1.2.15-javadoc-API文档-中文(简体)版.zip;
Maven坐标:com.github.miemiedev:
mybatis-paginator:1.2.15;
标签:github、miemiedev、
mybatis、paginator、中文文档、jar包、java;
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
mybatis加上发电机的用户界面
提供一致的Web UI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等,可以自定义模板以及各种输出参数,也可以通过SQL查询语句直接生成代码。
♡maven的相关依赖,注意范围只需要写test就可以了
< dependency>
< groupId>com.github.davidfantasy</ groupId>
< artifactId>mybatis-plus-generator-ui</ artifactId>
< version>1.4.2</ version>
< scope>test</ scope>
</ dependency>
在项目的test目录新建一个启动类,代码示例
(如果确认没有错误,可以拿到
sql development中去用
sql工具试试)
2.检查使用连接数据库的方法。
executeQuery、execute、executeUpdate是否存在使用错误,或者换个试试
3.我把
sql语句中的‘;‘去掉了,然后
sql语句运行正常,没有
报错,原因
未知。
关于mybatis的 insert into select 命令未结束问题,最后以为是sql写错了,但是,在plsql执行又没问题。最后还是解决问题,
是设置问题。
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
原先的配置:
修改了以后,加了 useGeneratedKeys="false"
【Redis】a bean of type ‘org.springframework.data.redis.core.RedisTemplate‘ that could not be found