批量更新批量update

一:Oracle数据库

1:批量插入

<insert id="insertBatch" parameterType="Java.util.List" >
    insert into RECIPEDETAIL (RDID, ROID, TYPE, 
      NAME, MEDIWEIGHT, MEDINUM, 
      MONEY, OPERATETIME, CHARGENUMBER, 
      REMARK, INSTRUCTION, AMOUNTEVERY, 
      MEDIUNIT, STATUS)
      <!--序列Oracle自增 -->
    select SEQ_recipeDetail.NEXTVAL,A.* from(
    <foreach collection="list" item="item" index="index" separator="union all">
      select #{item.roid,jdbcType=DECIMAL}, #{item.type,jdbcType=DECIMAL}, 
      #{item.name,jdbcType=NVARCHAR}, #{item.mediweight,jdbcType=DECIMAL}, #{item.medinum,jdbcType=DECIMAL}, 
      #{item.money,jdbcType=DECIMAL}, #{item.operatetime,jdbcType=TIMESTAMP}, #{item.chargenumber,jdbcType=NVARCHAR}, 
      #{item.remark,jdbcType=NVARCHAR}, #{item.instruction,jdbcType=NVARCHAR}, #{item.amountevery,jdbcType=DECIMAL}, 
      #{item.mediunit,jdbcType=NVARCHAR}, #{item.status,jdbcType=DECIMAL}
       FROM DUAL
    </foreach>
    ) A
  </insert>

2:批量更新

<update id="updateBatch" parameterType="java.util.List" >  
  <foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
      update RECIPEDETAIL set
      ROID = #{item.roid,jdbcType=DECIMAL},
      TYPE = #{item.type,jdbcType=DECIMAL},
      NAME = #{item.name,jdbcType=NVARCHAR},
      MEDIWEIGHT = #{item.mediweight,jdbcType=DECIMAL},
      MEDINUM = #{item.medinum,jdbcType=DECIMAL},
      MONEY = #{item.money,jdbcType=DECIMAL},
      OPERATETIME = #{item.operatetime,jdbcType=TIMESTAMP},
      CHARGENUMBER = #{item.chargenumber,jdbcType=NVARCHAR},
      REMARK = #{item.remark,jdbcType=NVARCHAR},
      INSTRUCTION = #{item.instruction,jdbcType=NVARCHAR},
      AMOUNTEVERY = #{item.amountevery,jdbcType=DECIMAL},
      MEDIUNIT = #{item.mediunit,jdbcType=NVARCHAR},
      STATUS = #{item.status,jdbcType=DECIMAL}
      where RDID = #{item.rdid,jdbcType=DECIMAL}   
    </foreach>
  </update>

二:MySQL数据库 
批量操作主要使用的是Mybatis的foreach,遍历参数列表执行相应的操作,所以批量插入/更新/删除的写法是类似的,只是SQL略有区别而已。MySql批量操作需要数据库连接配置allowMultiQueries=true才可以。 
(1)批量插入

<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true">
        <foreach close="" collection="list" index="index" item="item" open="" separator=";">
            insert into user (name, age,dept_code) values
            (#{item.name,jdbcType=VARCHAR},
            #{item.age,jdbcType=INTEGER},
             #{item.deptCode,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>  

上面演示的是MySql的写法(表主键自增的写法),因为MySql支持主键自增,所以直接设置useGeneratedKeys=true,即可在插入数据时自动实现主键自增;不需要自增时就不需要设置useGeneratedKeys,而且插入SQL包含所有字段即可。实际Mysql还有另外一种写法,就是拼接values的写法,这种方法我测试过比多条insert语句执行的效率会高些。不过需要注意一次批量操作的数量做一定的限制。具体写法如下:

<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true">
        insert into user (name, age,dept_code) values
        <foreach collection="list" index="index" item="item" open="" close="" separator=",">
            (#{item.name,jdbcType=VARCHAR},
            #{item.age,jdbcType=INTEGER},
             #{item.deptCode,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>  

对于Oracle不支持主键自增,需要序列替换,所以在SQL写法上略有不同,需要在insert语句前加个 <selectKey>...</selectKey>告知Mybatis主键如何生成(selectKey中间的内容有省略,实际是生成主键的SQL)。

(2)批量更新

<update id="batchUpdate" parameterType="java.util.List">
        <foreach close="" collection="list" index="index" item="item" open="" separator=";">
            update user set name=#{item.name,jdbcType=VARCHAR},age=#{item.age,jdbcType=INTEGER}
            where id=#{item.id,jdbcType=INTEGER}
        </foreach>
    </update>  

(3)批量删除

<delete id="batchDelete" parameterType="java.util.List">
        <foreach close="" collection="list" index="index" item="item" open="" separator=";">
            delete from user
            where id=#{item.id,jdbcType=INTEGER}
        </foreach>
    </delete>  

二、模糊查询

<select id="selectLikeName" parameterType="java.lang.String" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
        where name like CONCAT(‘%‘,#{name},‘%‘ )
    </select>  

上面的模糊查询语句是Mysql数据库的写法示例,用到了Mysql的字符串拼接函数CONCAT,其它数据库使用相应的函数即可。

三、多条件查询

多条件查询常用到Mybatis的if判断,这样只有条件满足时,才生成对应的SQL。

<select id="selectUser" parameterType="map" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
        <where>
            <if test="name != null">
                name = #{name,jdbcType=VARCHAR}
            </if>
            <if test="age != null">
                and age = #{age,jdbcType=INTEGER}
            </if>
        </where>
    </select>  

四、联表查询 
联表查询在返回结果集为多张表的数据时,可以通过继承resultMap,简化写法。例如下面的示例,结果集在User表字段的基础上添加了Dept的部门名称

<resultMap id="ExtResultMap" type="com.research.mybatis.generator.model.UserExt" extends="BaseResultMap">
     <result column="name" jdbcType="VARCHAR" property="deptName" />
  </resultMap>  

    <select id="selectUserExt" parameterType="map" resultMap="ExtResultMap">
        select
            u.*, d.name
        from user u inner join dept d on u.dept_code = d.code
        <where>
            <if test="name != null">
                u.name = #{name,jdbcType=VARCHAR}
            </if>
            <if test="age != null">
                and u.age = #{age,jdbcType=INTEGER}
            </if>
        </where>
    </select>  
时间: 2024-10-08 18:01:58

批量更新批量update的相关文章

mybatis执行批量更新batch update 的方法

1.数据库连接必须配置:&allowMultiQueries=true 我的配置如下:jdbc:mysql://10.20.13.16:3306/CALENDAR?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 2.批量修改并加判断条件(修改字段可选) <!-- 批量更新赛程 --> <update id="updateMatchs" parameterType=&q

MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在项目中,还是实现了这种批量的操作,并且已经通过测试,下面公开一下源代码 public void Insert(IEnumerable<TEntity> item) { var list = new List<WriteModel<TEntity>>(); foreach (

Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)

今天乍一看,园子里居然没有关于这个类库的文章,实在是意外毕竟已经有很多介绍EF使用的文章了. E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended 也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),所以跟我一样有隔离癖好的就可以大胆使用了.下面介绍如何批量删除.更新.查询. 批量删除 本来我们需要这样删除 ? //

170829、mybatis使用oracle和mybatis中批量更新

1.数据库连接必须配置:&allowMultiQueries=true(切记一定要加上这个属性,否则会有问题,切记!切记!切记!) 我的配置如下:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 2.批量修改并加判断条件(修改字段可选) <!-- 批量更新 --> <update id="updateMatchs&

mybatis批量插入和批量更新

在工作中遇到这一块,也是百度解决了烦恼.在此整理了一下. /** * <p> * 数据展示内容配置明细 Mapper 接口 * </p> * * @author dsh123 * @since 2018-05-23 */ public interface AdminDataContentDetailMapper extends BaseMapper<AdminDataContentDetail> { public void insertBatch(@Param(valu

mybatis+mysql批量插入和批量更新

一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.xml的代码如下: <!-- 批量插入数据 --> <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true"> <sel

Mybaits的批量操作包括批量删除 批量增加和批量更新

学前小课堂: <!-- 引入sql片段 refid :被引入sql片段的id--> <include refid="condition_sql_by_trim"/> <!-- 动态SQL语句trim标签 perfix : 动态sql语句的前缀 (WHERE,SET)              prefixOverrides : 自动截取掉或者替换条(WHERE 多余后面 关键字 :AND-OR) --> <!-- 动态sql语句 foreach

update关联其他表批量更新数据

批量更新表时,update一个表的列时,需要依赖另外的表,这种依赖可以是where条件子句,也可以要update的field的值依赖另外的表 通常有两种做法   1.使用存储过程   2.在程序代码里逐条循环执行这里给出一种更高效.简洁的做法,批量更新SQL ,一句SQL就可以替代麻烦的循环过程,有MS SQLServer.Oracle.DB2下的写法--关键点:t4和t1是同一个table,primary key肯定也是同一个,--并以它进行关联,这样在 select语句里即可引用到要upda

python中使用excutemany执行update语句,批量更新

python中使用excutemany执行update语句,批量更新 # coding:utf8 import pymysql import logging connection = pymysql.connect(host=HOST, port=3306, user=USER, password=PASSWORD, db=DATABASE,charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor) cursor = connection.