zoukankan      html  css  js  c++  java
  • 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条记录。

  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/cxy2020/p/13520150.html
Copyright © 2011-2022 走看看