mybatis执行一条update语句时为什么会返回

发布网友 发布时间:2022-04-22 09:53

我来回答

3个回答

懂视网 时间:2022-05-03 15:12

 <!--对应的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)返回值问题

标签:控制台   记录   com   rom   map   mysq   img   for   删除   

热心网友 时间:2022-05-03 12:20

你可以把defaultExecutorType值改了。
有三个值:
SIMPLE 普通返回。
REUSE 重复。
BATCH 批量更新。
MyBatis发现更新和插入返回值一直为"-21474826"的错误是由defaultExecutorType设置引起的,如果设置为batch,更新返回值就会丢失。mybatis官方的讨论列表,这句很关键:“If the batch
executor is in use, the update counts are being lost. ”
defaultExecutorType是默认执行类型。

热心网友 时间:2022-05-03 13:38

执行insert update delete的时候 返回值是一个int 表示受影响行数如果行数大于0 就说明成功了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com