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)mysql中delete语句
<foreach collection="list" item="bill"  separator="UNION ALL">
(SELECT #{Typ},#{ark},#{} 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
(#{Typ},#{ark},#{})
</foreach>
select 1 from dual
</insert>
为了更直观的查看sql运⾏情况,在l中配置加⼀个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);
<!-- 插⼊单条记录-->
<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=",">
(#{Typ},#{ark},#{})
</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条记录。
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。