Mybatis執行sql(insert、update、delete)返回值問題
阿新 • • 發佈:2020-08-17
資料庫: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條記錄。