原文地址: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; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
/*UserDAO.java*/ public interface UserDAO { @InsertProvider(type = UserDAOProvider.class, method = "insertAll") void insertAll(@Param("list") List<User> users); }
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
/*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(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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是對應的。
http://blog.csdn.net/del_zhu/article/details/52711678
Mybatis常見配置錯誤總結
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations">
<list>
<value>classpath:com.axxxxxy/**/dao/mapper/*.xml</value>
</list>
</property>
<property name="dataSource" ref="dbcp2dataSource" />
<property name="configLocation" value="classpath:resources/mybatis/mybatis-config.xml"/>
</bean>
spring中的Mybatis的配置
1.classpath是針對src的,classpath后面跟的是路徑名稱而不是包名。
例如上面,com.axxxxy/**/dao/mapper/*.xml ,com后面應該是‘/’而不是'.',這個錯誤找了一天才找到。如果你classpath寫了classpath*:,那么Mybatis會自動搜索查找子包
2.可以免Mapper接口實現類的,如果不用讀寫分離,dao接口對象可以直接被注入到Service,可以直接調用對應的Mapper ID
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.axxxxxy" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- <property name="annotationClass" value="org.springframework.stereotype.Repository"/> -->
</bean>
3.Mapper的DAO類的名稱和對應XML的mapper文件文件名稱應該一致(沒試過)
4.最常見的錯誤有mapper XML文件的namespace,一定要確保數據表的Model路徑配置正確了
5.DaoMapper接口中的方法 與 Mapper中的id不匹配,錯別字或者 缺失,都是問題。
http://blog.csdn.net/cor_twi/article/details/51228516