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条记录。

    参考:Mybatis执行sql(insert、update、delete)返回值问题

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/aspirant/p/12213428.html
Copyright © 2011-2022 走看看