使⽤mybatis 进⾏批量处理sql 语句
1. 使⽤注解:
以此注解为例@UpdateProvider:
注解参数:@UpdateProvider(type = SqlProvider.class, method = “update”)
type: SqlProvider 对应的sql提供者java类;
method : 此⽅法对应 sql提供者类中的专门给此⽅法提供sql的⽅法;
做法:⾸先在你的dao层接⼝⽅法上添加这个注解,然后method中使⽤可以直接进⾏sql的拼接,拼成你要批量更新的即可。
2. 使⽤xml配置⽂件形式完成(第⼀种)
同样已更新为例:
sql语句:
mybatis的xml配置形式完成:
参数解释: collection=“list” list 即为 传过来的参数集合;item=“item” 代表每次循环到的集合中的记录(或者说是参数/实体); separator=","每次循环拼接时的分割符号。
3. 使⽤xml配置⽂件形式完成(第⼆种)
还是以更新为例:
sql语句:update table_name set name='⼩强', sex = '男' where id in(1,2,3,4)
1<update id="batchUpdate" parameterType="java.util.List">    update table_name set name='⼩强', sex='男' where id in  <foreach collection="list" item="item" separator="," open="(" close=")">            #{item.id}        </foreach></update>
1
2
3
4
5
6UPDATE table_name  SET name = CASE WHEN id = 1 THEN '⼩强'WHEN id = 2 THEN '露露'END,sex = CASE WHEN id = 1 THEN '男'WHEN id = 2 THEN '⼥'END where  id in (1,2,3,4)
1
2
3
4
5
6
7
8
9
批量更新sql语句
10
11
12 mybatis 的xml 配置形式完成: 假设参数List 集合中存放的是对象
1
2<update id="batchUpdate" parameterType="java.util.List">    UPDATE        table_name    <trim prefix="set" suffixOverrides=",">        <trim prefix="name =case" suffix="end,">            <foreach collection="list" item="xx">                WHEN id = #{xx.id} THEN #{xx.name}            </foreach>        </trim>        <trim prefix="sex =case" suffix="end,">            <foreach collection="list" item="xx">                WHEN id = #{xx.id} THEN #{xx.sex}
1
2
3
4
5
6
7
8
9
10
11
12
13
参数解释:
trim标记是⼀个格式化的标记 ;
prefix=“set” 是前缀为set ;
suffix=“end,” 后缀为end, ;
suffixOverrides="," :
举例说明,例如 a,b,c, :
去除这个字符串最后⾯那个‘,‘, 使字符串变成 a,b,c;
如果是字符串是 a,b,c:
则不会有任何改变
open="(": 开始时添加 ( ;
close=")" 结束时添加 ) ;
注意⚠ :当数据量过多时,慎⽤foreach,当表的列数较多(20+),以及⼀次性插⼊的⾏数较多(5000+)时,整个插⼊的耗时⼗分漫长;
循环后⽣成的批量插⼊语句如下:
因为MyBatis对于含有的语句,⽆法采⽤缓存,那么在每次调⽤⽅法时,都会重新解析sql语句。所以当数据量特别⼤,且字段很多时,PreparedStatement会特别长,包含了很多占位符,对于占位符和参数的映射尤其耗时;单次最好在20-50左右。                WHEN id = #{xx.id} THEN #{xx.sex}            </foreach>        </trim>    </trim>    WHERE id IN    <foreach collection="list" item="xx" separator="," open="(" close=")">        #{xx.id}    </foreach></update>
13
14
15
16
17
18
19
20
21INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),                                                ("data1", "data2"),                                                ("data1", "data2");
1
2
3SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);    try {        SimpleTableMapper mapper = Mapper(SimpleTableMapper.class);        List<SimpleTableRecord> records = getRecordsToInsert(); // not shown        BatchInsert<SimpleTableRecord> batchInsert = insert(records)                .into(simpleTable)                .map(id).toProperty("id")                .map(firstName).toProperty("firstName")                .map(lastName).toProperty("lastName")                .map(birthDate).toProperty("birthDate")                .map(employed).toProperty("employed")                .map(occupation).toProperty("occupation")                .build()                .render(RenderingStrategy.MYBATIS3);        batchInsert.insertStatements().stream().forEach(mapper::insert);        sessionmit();    } finally {        session.close();    }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。