当前位置:   article > 正文

mybatis批量操作_mybatis 批量登录

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种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .

  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .

  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个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);
  • 1
  • 2
  • 3
  • 4

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意
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 "批量新增失败";
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

postman测试批量增加:
(1)
在这里插入图片描述
(2)
在这里插入图片描述

数据库数据查看
在这里插入图片描述

三、mybatis批量删除(foreach常用且效率高):

在这里插入图片描述

mapper接口中的方法:

//批量删除操作
public int batchDeleteBook(List<Integer> ids);
  • 1
  • 2

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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 "批量删除失败";
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

postman测试

(1)
在这里插入图片描述

(2)
在这里插入图片描述

四、mybatis批量修改方式一(效率不高):

在这里插入图片描述

mapper接口:

public int batchUpdateBook(@Param("list") List<Book> books);
  • 1

在这里插入图片描述

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

在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 "批量更新失败";
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

自己的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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/158301
推荐阅读
相关标签
  

闽ICP备14008679号