Mybatis积累(5):注解实现批量插入

目录

1. 批量插入

1.1 @Insert批量插入

1.2 @InsertProvider批量插入


1. 批量插入

1.1 @Insert批量插入

@Repository
public interface UserMapper {
     public String tableName = "user";
     public String column = "username, password";
      
  @Insert("<script> " +
            "insert into " + tableName +
            "(" + column + ") " +
            "values " +
            "<foreach collection=\"items\" index=\"index\" item=\"item\" separator=\",\"> "
            +
            "(#{item.username},#{item.password})"
            +
            "</foreach> " +
            "</script>")
    int batchSave(@Param("items") List<User> items);
        
}

1.2 @InsertProvider批量插入


public interface UserDAO {  
    @InsertProvider(type = UserDAOProvider.class, method = "insertAll")  
    void insertAll(@Param("list") List<User> list);  
}  
public class UserDAOProvider {  
    public String insertAll(Map map) {  
        List<User> users = (List<User>) map.get("list");  
        StringBuilder sb = new StringBuilder();  
        sb.append("INSERT INTO User ");  
        sb.append("(name, age) ");  
        sb.append("VALUES ");  
    MessageFormat mf = new MessageFormat(#'{'list[{0}].name},#'{'list[{0}].age})");  
        for (int i = 0; i < users.size(); i++) {  
            sb.append(mf.format(new Object[]{i}));  
            if (i < users.size() - 1) {  
                sb.append(",");  
            }  
        }  
        return sb.toString();  
    }  
} 

MyBatis会把UserDAO的insertAll方法中的List类型的参数存入一个Map中, 默认的key是”list”, 可以用@Param注解自定义名称, MyBatis在调用@InsertProvide指定的方法时将此map作为参数传入, 所有代码中使用List users = (List) map.get(“list”);获取list参数. 可以从代码中看出生成的SQL语句大致为:

INSERT INTO User (id, name) VALUES (#{list[0].age, #{list[0].name}), (#{list[1].age, #{list[1].name})[,(#{list[i].age #{list[i].name})]  

1.3 使用xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.AttachmentTableMapper">
    <insert id="insertByBatch" parameterType="java.util.List">
        insert into attachment_table (name, logID,url)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.name,jdbcType=VARCHAR}, #{item.logid,jdbcType=INTEGER},#{item.url,jdbcType=LONGVARCHAR})
        </foreach>
    </insert>
</mapper>

2. 批量更新Mapper编写(注解形式)

 @Insert("<script> " +
            "insert into " + tableName +
            "(" + column+ ") " +
            "values " +
            "<foreach collection=\"items\" index=\"index\" item=\"item\" separator=\",\"> " +
            "(#{item.id},#{item.watchCount},#{item.collectCount},#{item.activityId})" +
            "</foreach> " +
            "ON DUPLICATE KEY UPDATE " +
            "id = VALUES(id)," +
            "watch_count = VALUES(watch_count), " +
            "collect_count = VALUES(collect_count), " +
            "activity_id = VALUES(activity_id) " +
            "</script>")
    Integer batchUpdate(@Param("items") List<ActivityStatistics> items);

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值