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


相关推荐

  • 用GVIM/VIM写Verilog——VIM配置分享「建议收藏」

    用GVIM/VIM写Verilog——VIM配置分享「建议收藏」使用VIM或GVIM最基本的配置,不包含任何插件相关的设置,VIM用于写verilog,非常欢迎大家在评论区分享讨论。本文不进行插件的配置,不进行基本使用方式与使用技巧的说明,仅作为基本配置的分享交流用GVIM/VIM写Verilog——VIM配置分享基本配置几点说明1,禁用方向键,使用jk代替ESC2,自动补全命令配置3,进行版权声明的设置4,一些其他映射基本配置setnocompatible”不兼容visyntaxon”语法高亮度显示setnoerrorbells”.

    2022年9月30日
    3
  • Spring Boot MyBatis注解:@MapperScan和@Mapper

    Spring Boot MyBatis注解:@MapperScan和@Mapper需求缘起:在之前的文章中,我们定义DemoMapper类,但是并没有在该类上定义类似@Service或者@Controller之类的注解,那么为什么可以被Spring管理呢?(1)方式一:使用@Mapper注解为了让DemoMapper能够让别的类进行引用,我们可以在DemMapper类上添加@Mapper注解:Java代码@Mapper…

    2022年6月12日
    38
  • StageFright框架流程解读

    StageFright框架流程解读

    2021年11月23日
    35
  • Maven打包时引入本地jar包

    Maven打包时引入本地jar包背景开发的时用到的jar包可能在私服中找不到,需在下载到本地,然后在编译器Eclipse或者IDEA中引入本地jar包,这样在本地开发是OK的,但是linux服务器通过Maven打包的时候会提示异常找不到对应的类。这是需要在我们的pom.xml文件添加点配置了。落地开发支付宝沙箱支付时,需要引入本地jar包,我把jar存放的项目中的/src/main/resources/lib下1.打…

    2022年5月27日
    121
  • Android sdk_安卓sdk工具下载

    Android sdk_安卓sdk工具下载1在官网上获得软件压缩包imx-android-10.0.0_2.5.0.tar.gz下载地址2获取源码拷贝imx-android-10.0.0_2.5.0.tar.gz到一个文件夹里并解压,进入:2.1获取repogitclonehttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo修改repo里的内容为下面REPO_URL=’https://mirrors.bfsu.edu.cn/git/git-repo’然后添

    2022年8月30日
    1
  • Lamp架构_lamp服务器

    Lamp架构_lamp服务器LAMP架构搭建1.LAMP架构简介所谓lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。LAMP指的是Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建

    2022年10月17日
    3

发表回复

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

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