赞
踩
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了
foreach元素的属性主要有item,index,collection,open,separator,close:
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
总结:
所以,不管是多参数还是单参数的list,array类型,都可以封装为map进行传递。如果传递的是一个List,则mybatis会封装为一个list为key,list值为object的map,如果是array,则封装成一个array为key,array的值为object的map,如果自己封装呢,则colloection里放的是自己封装的map里的key值。
mapper接口中的方法:
//批量添加操作
public int batchInsertBook( List<Book> books);
//或者这种
public int batchInsertBook( @Param("list") List<Book> books);
sql映射语句:
<!--批量操作,最常用且效率高的方法-->
<!-- public int batchInsertBook(List<Book> books);-->
<insert id="batchInsertBook" parameterType="java.util.List">
insert into t_book (<include refid="BaseColumn"></include>)
values
<foreach collection="list" item="item" index="index" separator=",">
(null,#{item.bookName,jdbcType=VARCHAR},
#{item.bookAuthor,jdbcType=VARCHAR},
#{item.bookMoney,jdbcType=DOUBLE})
</foreach>
</insert>
注意:
MySQL下批量保存,可以用foreach遍历,且 mysql支持values(),(),()语法 ;
我们上述语句最后遍历完后会变成:
insert into t_book values(null,#{bookName},#{bookAuthor},#{bookMoney}) ,
(null,#{bookName},#{bookAuthor},#{bookMoney}), (null,#{bookName},#{bookAuthor},#{bookMoney})
controller:
//批量增加操作
@RequestMapping(value = "/batchInsertBook" ,method = RequestMethod.POST)
@ResponseBody//返回给前台是一个json字符串
public String batchInsertBook(@RequestBody/*从前台接收一个json字符串*/ List<Book> books){
int i = bookService.batchInsertBook(books);
if(i>=1){
return "新增了"+i+"条数据";
}else{
return "批量新增失败";
}
}
postman测试批量增加:
(1)
(2)
数据库数据查看:
mapper接口中的方法:
//批量删除操作
public int batchDeleteBook(List<Integer> ids);
sql映射语句:
<!--批量删除根据id: public int batchDeleteBook(List<Integer> ids);-->
<delete id="batchDeleteBook" parameterType="java.util.List">
delete from t_book where id in
(
<foreach collection="list" index="index" item="id" separator=",">
#{id}
</foreach>
)
</delete>
controller:
//批量删除操作
@RequestMapping(value = "/batchDeleteBook" ,method = RequestMethod.POST)
@ResponseBody//返回给前台是一个json字符串
public String batchDeleteBook(@RequestBody/*从前台接收一个json字符串*/ List<Integer> ids){
int i = bookService.batchDeleteBook(ids);
if(i>=1){
return "删除了"+i+"条数据";
}else{
return "批量删除失败";
}
}
postman测试:
(1)
(2)
mapper接口:
public int batchUpdateBook(@Param("list") List<Book> books);
sql映射文件:
<!--批量修改:public int batchUpdateBook(List<Book> books);--> <update id="batchUpdateBook" > <foreach collection="list" index="index" item="book"> update t_book <set> <if test="book.bookName!=null and book.bookName!='' ">book_name=#{book.bookName},</if> </set> <set> <if test="book.bookAuthor!=null and book.bookAuthor!='' ">book_author=#{book.bookAuthor},</if> </set> <set> <if test="book.bookMoney!=null and book.bookMoney!='' ">book_money=#{book.bookMoney}</if> </set> where id =#{book.id}; </foreach> </update>
在url后增加&allowMultiQueries=true
controller:
//批量修改操作
@RequestMapping(value = "/batchUpdateBook" ,method = RequestMethod.POST)
@ResponseBody//返回给前台是一个json字符串
public String batchUpdateBook(@RequestBody/*从前台接收一个json字符串*/ List<Book> books){
int i = bookService.batchUpdateBook(books);
if(i>=1){
return "更新了"+i+"条数据";
}else{
return "批量更新失败";
}
}
postman测试:
先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑
语句的作用,当插入已经存在的记录时,执行Update。
ON DUPLICATE KEY UPDATE:含义大概是,当有相同的主键key时,更新
注:需要给唯一主键添加唯一索引(即操作的表有唯一的主键),update才会生效:
<!-- 批量新增或更新--> <insert id="batchSaveOrUpdate" parameterType="java.util.List"> INSERT INTO t_book ( id, user_id, user_name, user_age, type, create_time, update_time ) VALUES <foreach collection="list" item="item" index="index" separator=","> ( #{item.id,jdbcType=BIGINT}, #{item.userId,jdbcType=VARCHAR}, #{item.userName,jdbcType=VARCHAR}, #{item.userAge,jdbcType=INTEGER}, #{item.type,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP} ) </foreach> ON DUPLICATE KEY UPDATE user_name = VALUES(user_name), user_age = VALUES(user_age), type = VALUES(type), update_time = VALUES(update_time) </insert>
自己的sql:
<!--public int batchSaveOrUpdate(@Param("list") List<Book> books);-->
<insert id="batchSaveOrUpdate" parameterType="list">
insert into t_book (<include refid="BaseColumn"></include>)
values
<foreach collection="list" item="book" index="index" separator=",">
(#{book.id},#{book.bookName,jdbcType=VARCHAR},
#{book.bookAuthor,jdbcType=VARCHAR},
#{book.bookMoney,jdbcType=DOUBLE})
</foreach>
ON DUPLICATE KEY UPDATE
id=VALUES(id),
book_name=VALUES(book_name),
book_author=VALUES(book_author),
book_money=VALUES(book_money)
</insert>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。