mybatis批量修改,新增和删除及新增主键类型问题

批量更新:

一条sql语句来批量更新所有数据,下面直接看一下在mybatis中通常是怎么写的(去掉mybatis语法就是原生的sql语句了,所有就没单独说sql是怎么写的)


    update mydata_table 
    set  status=
    
        when #{item.id} then #{item.status}
    
    where id in
    
        #{item.id,jdbcType=BIGINT}
    
 

其中when...then...sql中的"switch" 语法。这里借助mybatis语法来拼凑成了批量更新的sql,上面的意思就是批量更新idupdateBatch参数所传递List中的数据的status字段。还可以使用实现同样的功能,代码如下:


        update mydata_table
        
            
                
                     when id=#{item.id} then #{item.status}
                
            
        
        where id in
        
            #{item.id,jdbcType=BIGINT}
        
    

属性说明 
1.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容 
2.如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。 
3.如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。

上述代码转化成sql如下:

    update mydata_table 
    set status = 
    case
        when id = #{item.id} then #{item.status}//此处应该是展开值
        ...
    end
    where id in (...);

当然这是最简单的批量更新实现,有时候可能需要更新多个字段,那就需要将


     
          when id=#{item.id} then #{item.status}
     

复制拷贝多次,更改prefixwhen...then...的内容即可.而如果当需要为某个字段设置默认值的时候可以使用else


     
          when id=#{item.id} then #{item.status}
     

     else default_value

还有更常见的情况就是需要对要更新的数据进行判断,只有符合条件的数据才能进行更新,这种情况可以这么做:


     
         
             when id=#{item.id} then #{item.status}
         

     

这样的话只有要更新的liststatus != null && status != -1的数据才能进行status更新.其他的将使用默认值更新,而不会保持原数据不变.如果要保持原数据不变呢?即满足条件的更新,不满足条件的保持原数据不变,简单的来做就是再加一个,因为mybatis中没有if...else...语法,但可以通过多个实现同样的效果,如下:


     
         
             when id=#{item.id} then #{item.status}
         

         
             when id=#{item.id} then mydata_table.status      //这里就是原数据
         

     

整体批量更新的写法如下:


        update mydata_table
        
            
                 
                     
                         when id=#{item.id} then #{item.status}
                     
                     
                         when id=#{item.id} then mydata_table.status//原数据
                     
                 
            
        
        where id in
        
            #{item.id,jdbcType=BIGINT}
        
    

批量新增

    
        insert into attachment_table (name, logID,url)
        values
        
            (#{item.name,jdbcType=VARCHAR}, #{item.logid,jdbcType=INTEGER},#{item.url,jdbcType=LONGVARCHAR})
        
    

这里支持主键为自增类型,

如果主键是使用uuid,写法如下:

parameterType="java.util.List">

        insert into t_admin_role (id,role_id,admin_id)

values

        ((SELECT REPLACE(UUID(), '-', '') AS id),#{item.roleId},#{item.adminId})

       

批量删除


        delete from emp where empno in
                     separator="," close=")">
            #{arr}
        

属性 描述
item 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。
具体说明:在list和数组中是其中的对象,在map中是value。
该参数为必选。
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"
上面只是举例,具体collection等于什么,就看你想对那个元素做循环。
该参数为必选。

separator 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
open foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。
close foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
index 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

你可能感兴趣的:(Mybatis)