Mybatis經過註解方式實現批量插入數據庫

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

MyBatis中經過xml文件配置數據庫批量操做的文章不少,好比這篇http://www.cnblogs.com/xcch/articles/2042298.html,但探討如何經過註解配置實現一樣效果的文章卻不多,官方文檔上也沒找到相關的用法,其中的難點在於如何處理List或者Map類型的參數。不過這種方法終於被我試出來而且測試經過,現以批量插入爲例,來演示一下怎樣經過註解來實現數據庫的批量操做:java

/*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語句大體爲:mysql

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是對應的。sql

相關文章
相關標籤/搜索