Mybatis 中执行 insert、update、delete,Dao 层返回 int 数据的意义

Mybatis 的过程中对执行 sql 的返回值的分析

结论

mybatis 执行 insert,update,delete 返回的都是实际操作影响的行数


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

 

示例

insert

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

   <!--对应的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>

 

测试

1、插入单条记录:

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

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

2、插入多条记录

    @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 执行出错,抛出异常,此时未成功插入记录。

3、更新语句

    @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。修改成表中有的值后,成功返回影响行数。

 

4、删除语句

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

 

作者:葬瞳飘血

出处:https://www.cnblogs.com/ZTPX/

  
    展开阅读全文