• Mybatis执行sql(insert、update、delete)返回值问题


    数据库:Mysql

    在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下。

    结论:

    insert:   插入n条记录,返回影响行数n。(n>=1,n为0时实际为插入失败)

    update:更新n条记录,返回影响行数n。(n>=0)

    delete: 删除n条记录,返回影响行数n。(n>=0)

    验证:

    插入多条数据,mysql中可以使用如下sql:

    insert into bill (TX_TYP,REMARK,NO) VALUES (?,?,?) , (?,?,?) , (?,?,?) ;

    而对oracle的操作略有不同(两种方式 以及对应的mapper配置):

    INSERT INTO BILL(NO,TX_TYP,REMARK) (SELECT ?,?,? FROM dual) UNION ALL (SELECT ?,?,? FROM dual);
    --或者
    INSERT ALL INTO bill(NO,TX_TYP,REMARK) values ( ?,?,? ) INTO bill(NO,TX_TYP,REMARK) values ( ?,?,? ) SELECT 1 FROM dual;
    复制代码
       <!--对应的mapper 此处必须设置useGeneratedKeys=false才能批量插入成功-->
       <insert id="mulAddOracle" parameterType="java.util.ArrayList" useGeneratedKeys="false">
          insert into bill (TX_TYP,REMARK,NO)
          <foreach collection="list" item="bill"  separator="UNION ALL">
             (SELECT #{bill.txTyp},#{bill.remark},#{bill.no} from dual)
          </foreach>
       </insert>
       <!-- 第二种-->
       <insert id="mulAddOracle2" parameterType="java.util.ArrayList" useGeneratedKeys="false">
          insert ALL
          <foreach collection="list" item="bill" >
             into bill (TX_TYP,REMARK,NO) values
             (#{bill.txTyp},#{bill.remark},#{bill.no})
          </foreach>
          select 1 from dual
       </insert>
    复制代码

    为了更直观的查看sql运行情况,在mybatis-config.xml中配置加一个setting配置,将执行的sql打印到控制台。

    <setting name="logImpl" value="STDOUT_LOGGING" />

    定义实体类Bill,属性no,txTyp,remark,其中no为mysql数据库表bill自增主键。

    Mapper接口

    复制代码
        //单条插入
        int add(Bill bill);
        //多条插入
        int mulAdd(List list);
        //更新
        int upt(Bill bill);
        //删除
        int del(Bill bill);
    复制代码

    Mapper.xml

    复制代码
       <!-- 插入单条记录-->
       <insert id="add" parameterType="com.demo.bill1.domain.Bill"  >
          insert into bill(TX_TYP,REMARK) values(#{txTyp},#{remark})
       </insert>
       <!--一次插入多条记录  将所有信息插入bill表里面,传入参数为list,通过<foreach>来遍历list-->
       <insert id="mulAdd" parameterType="java.util.ArrayList">
          insert into bill (TX_TYP,REMARK,NO) VALUES
          <foreach collection="list" item="bill"  separator=",">
             (#{bill.txTyp},#{bill.remark},#{bill.no})
          </foreach>
       </insert>
    
       <!-- 更新记录-->
       <update id="upt" parameterType="com.demo.bill1.domain.Bill">
          update bill set REMARK=#{remark} where NO=#{no}
       </update>
    
       <!-- 删除记录-->
       <delete id="del" parameterType="com.demo.bill1.domain.Bill">
          delete from bill where TX_TYP=#{txTyp}
       </delete>
    复制代码

    开始测试:

    ①插入单条记录:

    复制代码
        @Test
        public void add(){
            Bill bill=new Bill();
            bill.setTxTyp("1");
            bill.setRemark("试试影响行数");
            System.out.println(billMapper.add(bill));
        }
    复制代码

    sql执行结果与返回值:成功插入一条数据,返回影响行数:1。

    ②插入多条记录

    复制代码
        @Test //测试一次性插入多条记录
        public void mulAdd(){
            List list =new ArrayList<Bill>();
            Bill bill1=new Bill();
            bill1.setTxTyp("1");
            bill1.setRemark("bill1");
            Bill bill2=new Bill();
            bill2.setTxTyp("1");
            bill2.setRemark("bill2");
            Bill bill3=new Bill();
            bill3.setTxTyp("1");
            bill3.setRemark("bill3");
            list.add(bill1);
            list.add(bill2);
            list.add(bill3);
            System.out.println(billMapper.mulAdd(list));
        }
    复制代码

    sql执行结果与返回值:成功插入三条数据,返回影响行数:3。

    插入多条记录时,如果有记录主键冲突,则sql执行出错,抛出异常,此时未成功插入记录。

    ③更新语句

    复制代码
        @Test //根据no进行更新
        public void upt(){
            Bill bill=new Bill();
            bill.setTxTyp("1");
            bill.setRemark("修改一下");
            bill.setNo(1);
            System.out.println(billMapper.upt(bill));
        }
    复制代码

    sql执行结果与返回值:根据NO字段进行更新,数据库表中没有NO=1的行,返回影响行数:0。修改成表中有的值后,成功返回影响行数。

     

    ④删除语句

        @Test //根据txTyp进行删除
        public void del(){
            Bill bill=new Bill();
            bill.setTxTyp("1");
            System.out.println(billMapper.del(bill));
        }

    sql执行结果与返回值:先将txTyp设置成数据库中没有的值txTyp=a,执行后返回影响行数为0;设置为有4条记录的txTyp=1,执行后返回影响结果为4,成功删除4条记录。

  • 相关阅读:
    CORS实践
    xunsearch使用记录
    apk的php解析
    MYSQLI_USE_RESULT or MYSQLI_STORE_RESULT
    企业图谱
    《软件需求工程》阅读笔记03
    2020年下半年学习进度12
    《软件需求工程》阅读笔记02
    2020年下半年学习进度11
    《软件需求工程》阅读笔记01
  • 原文地址:https://www.cnblogs.com/cxy2020/p/13199951.html
Copyright © 2020-2023  润新知