ibatis使用iterate实现批量插入insert正确写法

7 篇文章 0 订阅
1 篇文章 0 订阅

由于想批量入库提升效率,最近实现了ibatis的批量插入,结果一直报错 :StringIndexOutOfBoundsException ,原来是value中的格式不正确。

本人邮箱:techqu@163.com,欢迎讨论

正确写法示例:

RecieveDataRecordsDao

    public long iterate_insert(List<RecieveDataRecordsDB> db) {
        Object obj = getSqlMapClientTemplate().insert("iterate_insert", db);
        if (obj == null) { return 0; }

        return (Long) obj;
    }

mapper.xml

<insert  id ="iterate_insert"   parameterClass ="java.util.List">
<![CDATA[
insert into recieve_data_records (trader_serial_id,phone_num,data_volume,timestamp,lasttime,errorcount,errordesc,errorchannel,type,operator,provinceId,appid) values       ]]>
      <iterate  conjunction =","  >
           <![CDATA[
            (#db[].trader_serial_id:VARCHAR#,#db[].phone_num:BIGINT#,#db[].data_volume:BIGINT#,#db[].timestamp:BIGINT#,#db[].lasttime:BIGINT#,#db[].errorcount:INTEGER#,#db[].errordesc:VARCHAR#,#db[].errorchannel:INTEGER#,#db[].type:INTEGER#,#db[].operator:INTEGER#,#db[].provinceid:VARCHAR#,#db[].appid:VARCHAR#)          ]]>
      </iterate>
    </insert>

注意事项:
1. value内的值,必须按照 #传入参数名[].属性名:类型 这个格式写。否则会报 StringIndexOutOfBoundsException 异常。方括号将参数标记为List,否则解析器会简单的将List输出成String。我检查半天才发现原来是格式不正确引起的
2. 如果传入的参数类型是List,则不需要在iterate上写property属性

如果在iBatis使用iterate进行批量插入处理,而且表名不确定,需要通过参数传递进SQL语句中,可以使用动态SQL语句和参数映射来实现。 具体步骤如下: 1. 在iBatis的SQL语句中,使用动态SQL语句来拼接表名。可以使用if标签判断表名是否为空,如果为空,则使用默认表名;如果不为空,则拼接传递进来的表名。 ``` <insert id="batchInsert"> INSERT INTO <if test="tableName != null and tableName != ''"> ${tableName} </if> <if test="tableName == null or tableName == ''"> default_table_name </if> (column1, column2, column3) VALUES <iterate property="list" open="(" close=")" conjunction=","> #{item.column1},#{item.column2},#{item.column3} </iterate> </insert> ``` 2. 在iBatis的SqlMapClientTemplate中,将表名作为参数传递进insert方法中,并将参数映射到SQL语句中。 ``` public void batchInsert(String tableName, List<Entity> list) { Map<String, Object> paramMap = new HashMap<>(); paramMap.put("tableName", tableName); paramMap.put("list", list); sqlSessionTemplate.insert("batchInsert", paramMap); } ``` 在这个示例代码中,tableName是需要动态拼接的表名,list是需要插入的数据列表。在batchInsert方法中,将tableName和list封装成Map类型的参数,然后将参数传递进insert方法中,最终参数会被映射到SQL语句中,实现动态拼接表名的功能。 注意,在动态拼接表名时,需要使用${}来引用表名变量,而不是#{}。因为#{}会将表名参数作为字符串进行转义,而${}则不会进行转义,所以可以正确拼接表名。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值