Mybatis执行sql(insertupdatedelete)返回值问题

Posted Code2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis执行sql(insertupdatedelete)返回值问题相关的知识,希望对你有一定的参考价值。

数据库: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(insertupdatedelete)返回值问题的主要内容,如果未能解决你的问题,请参考以下文章

使用insertupdate和delete报错注入

DocumentListener 没有调用 insertUpdate 方法

使用 laravel moltin 购物车时的 LaravelSession::insertUpdate() 问题

MyBatis测试mybatis执行sql语句步骤

Mybatis源码解析MyBatis执行Sql的流程分析

Mybatis插件-查看执行SQL