设为首页 收藏本站
查看: 855|回复: 0

[经验分享] Mybatis的批量新增

[复制链接]

尚未签到

发表于 2016-11-25 10:04:37 | 显示全部楼层 |阅读模式
  开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入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的字段换成了$,结果运行的时候没有报错。。但是数据库中相应字段没有数据啊!!!!








 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305366-1-1.html 上篇帖子: MyBatis 之枚举映射 下篇帖子: mybatis-spring整合总结03_Transactions
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表