一、背景描述
1、在有些場景中,需要根據之前插入的返回值如id(甚至是對象)來設置后續插入,如第一次參入的是父表,后續的是子表的情況。
2、如訴訟案件中,存在案件實體表(案件相關人信息,包括原告/被告的代理)entity以及表示代理人和原處理人關系的表relation,后者中要持有實體中代理的id和被代理人的id(parentId)
因為一個案件常包括很多實體,所以為了方便,實體插入后需要返回帶id的實體對象,然后遍歷構造代理關系記錄。
二、技術分析
1、mybatis單挑記錄插入返回id(在入參的id屬性中,直接返回的依然是影響的行數)
a、mybatis展示
1 <insert id="insertSelective" keyProperty="id" parameterType="DO" useGeneratedKeys="true"> 2 insert into fuji_base_entity(ID,*****) 3 values(#{id,jdbcType=INTEGER},****) 4 </insert>
b、keyProperty:獲取數據庫生成的id放到哪個屬性中
c、useGeneratedKeys:是否使用JDBC的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設置的領域模型屬性中
PS:
數據庫不支持自增的情況(如oracle)
a、mybatis展示
<insert id="add" parameterType="EStudent"> <selectKey keyProperty="id" resultType="_long" order="BEFORE"> select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1 </selectKey> insert into TStudent(id, name, age) values(#{id}, #{name}, #{age}) </insert
b、order必須是BEFORE,表示在insert執行前處理
c、keyProperty表示獲取的主鍵存放的屬性值
d、selectKey一般在oracle中表示獲取序列值
2、mybatis批量記錄插入返回id
a、mybatis展示
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id"> insert into Author (username, password, email, bio) values <foreach item="item" collection="list" separator=","> (#{item.username}, #{item.password}, #{item.email}, #{item.bio}) </foreach> </insert>
b、依然的userGeneratedKeys和keyProperty
c、入參必須是list,返回是也是回寫list中對象的id字段
d、升級Mybatis版本到3.3.1
3、mybatis批量記錄插入返回包含id的的對象
1、同上2
2、循環處理上1
三、其他方法返回
1、insert操作
a、默認返回的是插入的記錄數
2、update操作
a、底層執行中update操作分兩步:查詢匹配的記錄 和 更新這些結論。
b、默認情況下,mybatis的update方法返回的結果是匹配上的記錄數,針對同一條sql被執行了兩邊的情況下影響數為零情況無法判斷。
c、此時,若想update返回的值為受影響的記錄數據就需要在聲明數據鏈接是添加設置,如:jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
3、delete操作
a、刪除的記錄數
