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条记录。
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/12213428.html