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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python+pycharm+pyqt5安装教程「建议收藏」

    python+pycharm+pyqt5安装教程「建议收藏」本文描述Windows系统下如何安装Python+PyCharm+PyQt5,并通过PyQt5采用两种方式设计GUI界面:1.直接使用代码设计界面2.先使用QtDesigner进行可视化设计,然后将生成的.ui文件转换成.py文件安装Python+PyCharm+PyQt51、安装Python访问官网https://www.python.org/,下载并安装你的目标Python版本。2、安装PyQt51)进入cmd界面。执行命令pipinstallpyqt5pyq

    2022年8月25日
    8
  • python做微信回复机器人_微信自动回复机器人免费版

    python做微信回复机器人_微信自动回复机器人免费版还记得“人人”火的时候,有个小黄鸡很有名,可以不知疲倦地和你聊上一整天,而且各种搞怪金句频出,让人欲罢不能。如今人人已经成为“人人直播-高颜值品质直播平台”了(往事不堪回首啊),微信却火地一塌糊涂,那么如何在微信上做一个有趣的小黄鸡功能呢?还好我们有Python。Lifeisshort,sousepython.不得不承认Python真的是一种神奇的语言,常常带给人很多惊喜。不到30行代码便可

    2022年10月1日
    2
  • ubuntu-cuda卸载[通俗易懂]

    ubuntu-cuda卸载[通俗易懂]不小心用sudoaptuninstallnvidia-cuda-toolkit安装了cuda,安装的是7.5发现,卸载sudoapt-getremove–auto-removenvidia-cuda-toolkit

    2025年9月17日
    6
  • k8sV1.18.0版本一键部署脚本(全部代码在下方)

    k8sV1.18.0版本一键部署脚本(全部代码在下方)

    2021年5月30日
    120
  • 联想笔记本电脑键盘亮了屏幕不亮_联想笔记本电脑键盘为什么不亮

    联想笔记本电脑键盘亮了屏幕不亮_联想笔记本电脑键盘为什么不亮现在不管是工作还是学习,已经离不开电脑了,它的出现带给我们极大的方便,笔记本以它小巧灵活的体积更是受到了很多学生和商务人士的喜欢,可是市面上有那么多品牌的笔记本,应该怎么正确做出选择呢?下面小编就为大家带来联想笔记本电脑开机键亮但是黑屏,联想笔记本键盘没反应?联想笔记本电脑开机键亮但是黑屏1、若遇到联想笔记本电脑开机键亮但是黑屏的情况,可以拆卸掉笔记本背面的电池,只用电源适配器连接电脑,尝试开机一…

    2022年9月20日
    1
  • vue删除数组中某一元素_数组索引超出范围

    vue删除数组中某一元素_数组索引超出范围在前端开发中,我们经常需要对数组进行操作,增删改是经常的事情,那我们js中该如何删除指定的下标元素呢????我们用splice来操作1.定义和用法splice()方法用于添加或删除数组中的元素。注意:这种方法会改变原始数组。数组中添加新元素:varfruits=[“Banana”,”Orange”,”Apple”,”Mango”];fruits.splice(2,0,”Lemon”,”Kiwi”);fruits输出结果:Banana,Orange,Le.

    2022年8月10日
    76

发表回复

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

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