數據庫: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條記錄。



