开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入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的字段换成了$,结果运行的时候没有报错。。但是数据库中相应字段没有数据啊!!!!!

[置顶] mybatis的批量新增的更多相关文章

  1. mybatis,批量新增、修改,删除

    转载自:http://blog.csdn.net/sanyuesan0000/article/details/19998727 最近需要用到Mybatis批量新增oracle数据库,刚开始在网上找到的 ...

  2. mybatis oracle 批量新增

    假定场景:批量导入用户信息 一般批量新增使用 SELECT … INSERT INTO 和 INSERT INTO … SELECT 我们这次使用第二种 一.先建一张用户信息表模拟批量导入用户信息 c ...

  3. [置顶] mybatis批量新增系列之有主键的表的批量新增

    前面介绍了无主键的表的批量插入,文章地址:http://blog.csdn.net/zhouxiaoyun0228/article/details/9980181 但是在开发中往往许多的表是需要主键的 ...

  4. mybatis 学习笔记(4) —— 批量新增数据

    1.业务是从前台传入List<T> ,在controller层接受参数,并进行批量新增操作. 2.需要处理的细节 a) mybatis可以支持批量新增,注意数据表需要将主键设置成自增列. ...

  5. mybatis学习之路----mysql批量新增数据

    原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...

  6. MyBatis基础入门《十三》批量新增数据

    MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...

  7. Discuz常见小问题-如何批量加精,置顶帖子

    批量选中帖子,然后置顶和精华都可以勾选 完成之后的效果

  8. MyBatis批量新增和更新

    之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢.使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升. 博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新 ...

  9. mybatis 注解形式设置批量新增、批量更新数据

    1. 批量更新: @Update({"<script>" + "<foreach collection=\"smsConfigTemplate ...

随机推荐

  1. C++程序设计之结构体,共用体,枚举和typedef

    [1]结构体的基本功 注意结构体里面可以有很多东西,可以结构体里面包含结构体 #include<iostream> using namespace std; struct Date { i ...

  2. 【九度OJ】题目1201-二叉排序树

    题目 建树过程是递归,"递归的思路不是很复杂",经过题目1078的训练,直接开始编码.提交及修改的过程告诉自己,这是一个错觉,对递归的理解还应该再进一步. 自己的实现 #inclu ...

  3. cannot conform to protocol 的一点事

    学习UITableView过程中,回想视频打一遍代码,发现卡在了第一步.一直显示无法继承协议,而且还多了一个错误:definition conflicts with previous value.百度 ...

  4. Nonlinear Transform

    前文中,我们已经学习了linear classification,linear regression,logistic regression三种线性方法. 如何解决这种问题呢? 其实很好解决,只需要加 ...

  5. sudo source /etc/profile 提示找不到source命令

    今天修改了/etc/profile,需要用source一下,于是写入命令 sudo source /etc/profile 提示找不到source命令 改成    sudo . /etc/profil ...

  6. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  7. 【bzoj3233】【ahoi2013】找硬币

    题意: 求确定n种货币面额x1..xn满足 x1=1 且xi为xj的整数倍(i>j) 给定n个物品价格ai 求使用上面货币最少需要硬币数(不能找零) 题解: 动态规划 听说网上的题解都是搜索的做 ...

  8. java动态代理与老式AOP实现

    JAVA的动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 ...

  9. 【转】Maven实战(九)---模块聚合和继承

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47001831   感谢! 类之间有聚合和继承关系,Maven也具备这样的设计原 ...

  10. Web Service学习之二:Web Service(for JAVA)的几种框架

    在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...