欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis通过注解方式实现批量插入数据库

程序员文章站 2022-05-10 19:59:32
...

原文地址:http://f0rb.iteye.com/blog/1207384

MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcch/articles/2042298.html,但探讨如何通过注解配置实现同样效果的文章却很少,官方文档上也没找到相关的用法,其中的难点在于如何处理List或者Map类型的参数。不过这种方法终于被我试出来并且测试通过,现以批量插入为例,来演示一下怎样通过注解来实现数据库的批量操作:

/*User.java*/

public class User {  
    private Integer id;  
    private String name;  

    public Integer getId() {  

        return id;  
    }  

    public void setId(Integer id) {  
        this.id = id;  
    }  


    public String getName() {  
        return name;  
    }  

    public void setName(String name) {  
        this.name = name;  
    }  
}  


/*UserDAO.java*/
public interface UserDAO {  
    @InsertProvider(type = UserDAOProvider.class, method = "insertAll")  
    void insertAll(@Param("list") List<User> users);  
}  


/*UserDAOProvider.java*/
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("(id, name) ");  
        sb.append("VALUES ");  
        MessageFormat mf = new MessageFormat("(null, #'{'list[{0}].name})");  
        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 (null, #{list[0].name}), (null, #{list[1].name})[,(null, #{list[i].name})]  

 

其中#{list[0].name}就表示从List参数的取第0个元素的name的值了, “list”跟key是对应的。