1. 程式人生 > 實用技巧 >Mybatis執行sql(insert、update、delete)返回值問題

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條記錄。