原文地址: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