本文共 2856 字,大约阅读时间需要 9 分钟。
原文地址:
MyBatis中通过xml文件配置批量操作的文章很多,比如这篇,但探讨如何通过注解配置实现同样效果的文章却很少,官方文档上也没找到相关的用法,其中的难点在于如何处理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") Listusers); }
/*UserDAOProvider.java*/public class UserDAOProvider { public String insertAll(Map map) { Listusers = (List ) 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是对应的。
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