mybatis批量操作
目录一、mybatis之foreach用法:二、mybatis批量新增(foreach常用且效率高):二、mybatis批量删除(foreach常用且效率高):三、mybatis批量修改(foreach常用且效率高):一、mybatis之foreach用法:在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的
目录
一、mybatis之foreach用法:
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了
foreach元素的属性主要有item,index,collection,open,separator,close:
- item:集合中元素迭代时的别名,该参数为必选。
- index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
- open:foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选
- separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
- close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
- collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = “ids”.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”
在使用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值。
二、mybatis批量新增(foreach常用且效率高):

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)
数据库数据查看:
三、mybatis批量删除(foreach常用且效率高):

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)
四、mybatis批量修改方式一(效率不高):

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测试:
五、mybatis批量修改方式二(效率高):
先声明一点,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>
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)