mybatis批量操作(Oracle)

核心

foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

foreach元素的属性主要有item,index,collection,open,separator,close。**

(1)item:集合中元素迭代时的别名,该参数为必选。

(2)index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

(3)open:foreach代码的开始符号,一般是 “(” ,它和 close=")" 合用。常用在in(),values()时。该参数可选。

(4)separator:元素之间的分隔符,例如在in()的时候,separator=",“会自动在元素中间用”,"隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

(5)close: foreach代码的关闭符号,一般是 “)” ,它和 open="(" 合用。常用在in(),values()时。该参数可选。

(6)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”

<!--    批量删除-->
    <delete id="deleteSomeEmpno" >
        delete from emp where empno in
        <foreach collection="list" open="(" item="item" separator="," close=")">
            #{item}
        </foreach>
    </delete>
<!--    批量插入-->
    <insert id="insertSome"  parameterType="list" >
        insert into emp
        <foreach collection="list"  item="item" index="index"   separator="UNION ALL">
            select     #{item.empno} empno,#{item.ename} ename,#{item.job} job,#{item.mgr} mgr,#{item.hiredate} hiredate,#{item.sal} sal,#{item.comm} comm,#{item.deptno} deptno
            from dual </foreach>

    </insert>

oracle批量操作

批量删除

从这句sql语句开始用foreach拼接传入参数作为集合

delete from emp where empno in(集合);

mapper映射文件


<!--    批量删除-->
    <delete id="deleteSomeEmpno" >
        delete from emp where empno in
        <foreach collection="list" open="(" item="item" separator="," close=")">
            #{item}
        </foreach>
    </delete>

批量插入

利用foreach 的item拼接出 select #{item.row1},#{item.row2}… from dual
再用union 作为分隔符

insert into emp select  列... from 表1  union   select  列... from 表2 

mapper映射文件:

<!--    批量插入-->
    <insert id="insertSome"  parameterType="list" >
        insert into emp 
        <foreach collection="list"  item="item" index="index"   separator="UNION ALL">
            select     #{item.empno} empno,#{item.ename} ename,#{item.job} job,#{item.mgr} mgr,#{item.hiredate} hiredate,#{item.sal} sal,#{item.comm} comm,#{item.deptno} deptno
            from dual </foreach>

    </insert>

批量查询(类似于删除)

从这句sql语句开始用foreach拼接传入参数作为集合

select * from emp where empno in(集合);

mapper映射文件


<!--    参数为数组 collection="array"-->
    <select id="queryArray" resultType="Emp">
        select * from emp where empno in
        <foreach collection="array" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>
<!--    参数为list collection="list"-->
    <select id="queryList" resultType="Emp">
        select * from emp where empno in
        <foreach collection="list" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>
<!--    查询结果输出为map-->
    <select id="queryByidToMap" parameterType="integer" resultType="map">
        select * from emp where empno=#{no}
    </select>


批量更新

基于sql语句:

begin
update 表名 set 字段1=值1,字段2=值2,字段3=值3.... where 字段n=值n;
update 表名 set 字段1=值1,字段2=值2,字段3=值3.... where 字段n=值n;
update 表名 set 字段1=值1,字段2=值2,字段3=值3.... where 字段n=值n;
end;

begin
需要foreach拼接部分
update 表名 set 字段1=值1,字段2=值2,字段3=值3… where 字段n=值n;
update 表名 set 字段1=值1,字段2=值2,字段3=值3… where 字段n=值n;
update 表名 set 字段1=值1,字段2=值2,字段3=值3… where 字段n=值n
拼接到此为止
;end;

mapper映射文件

 <update id="updateSome" parameterType="list">
        begin
        <foreach collection="list" item="i" separator=";">
            update emp set ENAME=#{i.ename} where empno=#{i.empno}
        </foreach>
        ;end;
    </update>

最后贴完整Mapper.xml内容水一下字数

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mybatis.Mapper.EmpMapper">
<!--    输出pojo类-->
   <select id="queryByDept" parameterType="Integer"  resultType="Emp" >
       select * from EMP where DEPTNO=#{deptno}
   </select>
    <select id="query" resultType="Emp">
        select * from EMP
    </select>
<!--    参数为数组 collection="array"-->
    <select id="queryArray" resultType="Emp">
        select * from emp where empno in
        <foreach collection="array" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>
<!--    参数为list collection="list"-->
    <select id="queryList" resultType="Emp">
        select * from emp where empno in
        <foreach collection="list" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>
<!--    查询结果输出为map-->
    <select id="queryByidToMap" parameterType="integer" resultType="map">
        select * from emp where empno=#{no}
    </select>
    <select id="queryBydeptToMap" resultType="map">
        select * from emp where deptno=#{deptno}
    </select>
<!--    参数绑定-->
<!--    一个参数一般参数名相同(或不同)-->
<!--    pojo类属性名相同自动绑定-->
<!--    二参数-->
    <select id="queryByMgrDept" resultType="emp">
        select * from emp where mgr=#{arg0} and deptno=#{arg1}
    </select>
<!--    三参数-->
    <select id="queryByMgrDeptComm" resultType="emp">
        select * from emp where mgr=#{arg0} and deptno=#{arg1} and comm>=#{arg2}
    </select>
<!--    批量删除-->
    <delete id="deleteSomeEmpno" >
        delete from emp where empno in
        <foreach collection="list" open="(" item="item" separator="," close=")">
            #{item}
        </foreach>
    </delete>
<!--    批量插入-->
    <insert id="insertSome"  parameterType="list" >
        insert into emp
        <foreach collection="list"  item="item" index="index"   separator="UNION ALL">
            select     #{item.empno} empno,#{item.ename} ename,#{item.job} job,#{item.mgr} mgr,#{item.hiredate} hiredate,#{item.sal} sal,#{item.comm} comm,#{item.deptno} deptno
            from dual </foreach>

    </insert>
    <update id="updateSome" parameterType="list">
        begin
        <foreach collection="list" item="i" separator=";">
            update emp set ENAME=#{i.ename} where empno=#{i.empno}
        </foreach>
        ;end;
    </update>
</mapper>
全部评论

相关推荐

昨天 13:29
已编辑
湖南铁道职业技术学院 后端
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务