mybatis 批量插入「建议收藏」

开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网上查询资料,历经千万bug,终于搞定,这里指提供mybatis中的配置,至于dao层的调用mybatis就自己上网查询下资料吧1根据网上搜了一下资料,在sql-mapper.xml文件中写了如下配

大家好,又见面了,我是你们的朋友全栈君。

开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网上查询资料,历经千万bug,终于搞定,这里指提供mybatis中的配置,至于dao层的调用mybatis就自己上网查询下资料吧

1根据网上搜了一下资料,在sql-mapper.xml文件中写了如下配置可进行批量操作

<
insert
id
=”insertBatch” parameterType=”List”
>

    insert into REAL_DATA_HW(

M_LINE_NO,M_TIME,HW_NUM,
VOL_A,VOL_B,VOL_C
)
    values

    <
foreach
collection
=”list”
item
=”item”
index
=”index”
separator
=”,”>

       (

#{obj.M_LINE_NO},to_date(#{obj.M_TIME},’yyyy-MM-dd hh24:mi:ss’),#{obj.HW_NUM},
       #{obj.VOL_A},#{obj.VOL_B},#{obj.VOL_C}
)


    </
foreach
>


</
insert
>

然后启动,调用这个操作的时候报错
Error setting null parameter. Most JDBC driversrequire that the JdbcType must be specified for all nullable parameters. Cause:java.sql.SQLException: 无效的列类型
上网继续查询说加上 <![CDATA[    ]]> 即可,好吧配置变成了

<
insert
id
=”insertBatch”
parameterType=”List”
>

<![CDATA[
    insert into REAL_DATA_HW(

M_LINE_NO,M_TIME,HW_NUM,
VOL_A,VOL_B,VOL_C
)
    values
]]>

    <
foreach
collection
=”list”
item
=”item”
index
=”index”
separator
=”,”>

       (

#{obj.M_LINE_NO},to_date(#{obj.M_TIME},’yyyy-MM-dd hh24:mi:ss’),#{obj.HW_NUM},
       #{obj.VOL_A},#{obj.VOL_B},#{obj.VOL_C}
)


    </
foreach
>


</
insert
>

然后依然报同样的错,查来查去,发现一句坑爹的话这个只是支持mySQL,去年买了个表。。。
继续找方法吧,又被我找到一种在ORACLE中可以用的方法,参考网上的步骤,有了如下的配置

<
insert
id
=”insertBatch” parameterType=”List”
>

    insert into REAL_DATA_HW(

M_LINE_NO,M_TIME,HW_NUM,
VOL_A,VOL_B,VOL_C
)
    <
foreach
collection
=”list”
item
=”item”
index
=”index”
separator
=”union all”>

     select   

#{obj.M_LINE_NO},to_date(#{obj.M_TIME},’yyyy-MM-dd hh24:mi:ss’),#{obj.HW_NUM},
       #{obj.VOL_A},#{obj.VOL_B},#{obj.VOL_C} from dual


    </
foreach
>


</
insert
>

这个的原理应该是参考的insert into  tableName select 。。。 from tableName1 这个方式
重新启动,然后继续报错,奔溃

org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters…哎 ,找原因,mybaties对null缺乏处理,需要在字段后加上jdbcType=类型,于是添加类型吧,顺带去网上查询了mybatis的类型
iBatis官方的说法是, 只要是JDBC提供的JdbcType类中所定义的常量字符串,jdbcType这个属性就可以取这个值,虽然有一些类型iBatis尚且不能支持(例如blobs等)。而JdbcType类则由不同的JDBC Driver提供,可能由于Driver(不同类型的数据库有不同的Driver)的不同会存在差异,不过大同小异。一般都支持如下类型(大小写不敏感):
Array, BigInt, Binary, Bit, Blob, Boolean, Char, Clob, Datalink, Date, Decimal,
Double, Float, Integer, LongVarBinary, LongVarChar, Numeric, Real, Ref, SmallInt, Struct, Time, Timestamp, TinyInt, VarBinary, VarChar.
大小写不敏感,,配置如下

<
insert
id
=”insertBatch” parameterType=”List”
>

    insert into REAL_DATA_HW(

M_LINE_NO,M_TIME,HW_NUM,
VOL_A,VOL_B,VOL_C
)
    <
foreach
collection
=”list”
item
=”item”
index
=”index”
separator
=”union all”>

     select   

#{obj.M_LINE_NO,jdbcType=
VarChar
},to_date(#{obj.M_TIME
,jdbcType=
VarChar
},’yyyy-MM-dd hh24:mi:ss’),#{obj.HW_NUM
,
jdbcType=Double
},
       #{obj.VOL_A
,jdbcType=
Double
},#{obj.VOL_B
,jdbcType=
Double
},#{obj.VOL_C
,jdbcType=
Double
} from dual
    </
foreach
>


</
insert
>

调用的时候继续报错,有一个是
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType. Cause: java.lang.IllegalArgumentException: No enum const class org.apache.ibatis.type.JdbcType.Double
亲,不敏感你妹!!!!!!!!!
于是慢慢替换了下Double,终于在Double写成DOUBLE的时候不在报这个错误了,此时配置如下

<
insert
id
=”insertBatch” parameterType=”List”
>

    insert into REAL_DATA_HW(

M_LINE_NO,M_TIME,HW_NUM,
VOL_A,VOL_B,VOL_C
)
    <
foreach
collection
=”list”
item
=”item”
index
=”index”
separator
=”union all”>

     select   

#{obj.M_LINE_NO,jdbcType=
VARCHAR
},to_date(#{obj.M_TIME
,jdbcType=
VARCHAR
},’yyyy-MM-dd hh24:mi:ss’),#{obj.HW_NUM
,
jdbcType=DOUBLE
},
       #{obj.VOL_A
,jdbcType=
DOUBLE
},#{obj.VOL_B
,jdbcType=
DOUBLE
},#{obj.VOL_C
,jdbcType=
DOUBLE
} from dual
    </
foreach
>


</
insert
>

启动,调用这个方法的依然报错。。。

org.springframework.jdbc.BadSqlGrammarException:
### Error updating database.  Cause: java.sql.SQLException: ORA-01790: 表达式必须具有与对应表达式相同的数据类型

然后调试,发现
VOL_A虽然是数字样子,但是我放入到map的是字符串。。。相当的无语,改成Double类型的放入到map中,然后重新调用到这个方法的时候。

看着屏幕上刷的数据,一种幸福感,满满的。。。

然后看下效率,比原来单条插入快了6倍!!!

最后想了下mybatis操作的时候#是会根据列的类型来判断是否需要添加引号,$不会加,然后将
jdbcType=
DOUBLE
的字段换成了$,结果运行的时候没有报错。。但是数据库中相应字段没有数据啊!!!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127090.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 前言 本项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 – 基础框…

    2021年6月23日
  • 基于 vue 实现的电商后台管理系统

    基于 vue 实现的电商后台管理系统源码地址:https://github.com/Hero601/vue_shop后端接口:https://goal.lanzous.com/b01c5hhsb密码:5ees免费的小星星点一个吧~

    2022年5月6日
  • 补码运算中的溢出_二进制补码运算溢出判断

    补码运算中的溢出_二进制补码运算溢出判断当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位,是不是就说明运算结果没有溢出?但不进位最终将导致两个负数相加成了正数,显然是错误的,这该怎么解释?如果两个以补码表示的负数的数值部分之和向符号位进位,会使运算结果依然为负数,那么这个运算结果是正确的吗?下面我们分析一下这个问题:

    2022年9月22日
  • 使用adb命令安装apk到手机

    使用adb命令安装apk到手机第一步让真机与电脑相连,cmd打开dos命令窗口(打开cmd的快捷键是Windows+R).第二步输入adbdevices查看手机与电脑是否连接成功,能看到设备信息就代表设备已经连接成功了.第三步紧接着就可以安装apk了.首次要知道自己的apk放在哪个盘符的文件里了.比如我的apk放在E:\data里.进入apk文件所在的目录:输入…

    2022年6月7日
  • 变异系数(测算数据离散程度相对指标)

    变异系数(测算数据离散程度相对指标)变异系数/差异系数(coefficientofvariation):是一种相对差异量数(不带测量单位),因而适用于测量单位不同或测量单位相同但集中量数相差较大的数据变异情况的比较M:平均数(下方r)S(StandardDeviation):标准差,用σ表示σ反映了一个数据集的离散程度,但其运算结果与测量单位有关联,如需要比较两组不同测量单位的σ,需要使用CV…

    2022年5月6日
  • Python基础 知识点总结[通俗易懂]

    Python基础 知识点总结[通俗易懂]python入门、基础知识

    2022年10月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号