MyBatis(五) insert、update、delete 、主鍵回填、返回matched行數和affected行數、引數配置#{},${}

z1340954953發表於2018-07-05

insert元素

<insert id="insertStudent" parameterType="student">
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

屬性和select元素的基本一樣,比較特殊是下面屬性

useGeneratedKeys

使用JDBC的getGeneratedKeys取出資料庫內部生成的主鍵,要使

用必須給keyProperty或者keyColumn賦值

true/false,預設是false
keyProperty表示pojo的那個屬性的作為主鍵如果是聯合主鍵逗號隔開。
keyColumn指明第幾列是主鍵,不能和keyProperty同時使用,只接受整型引數(1,2,3等等)

如果是聯合主鍵的是逗號隔開

如1,2

自增主鍵獲取

加上 useGeneratedKey = "true" , keyProperty = "javaBean的主鍵欄位",在insert 物件後,直接呼叫物件的主鍵欄位的

get方法獲取主鍵

 <insert id="insertStudent" parameterType="student" keyProperty="stuId" 
  useGeneratedKeys="true"
  >
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

其他規則主鍵生成(比如說序列生成)

藉助seletkey元素:  

keyProperty表示主鍵欄位,resultType是返回的主鍵型別

order 屬性可選 (before,after) 預設是before,表示insert前或者insert後獲取key

之後也是通過呼叫物件的get主鍵方法獲取主鍵值。

<selectKey keyProperty="stuId" resultType="int" order="BEFORE">
   select if(max(stu_id) is null,1,max(stu_id)+2) from student_info	
  </selectKey>

如果是序列只要將上面的sql片段替換   select 序列.nextval from dual

完整使用

<insert id="insertStudent" parameterType="student" 
  >
  <selectKey keyProperty="stuId" resultType="int" order="BEFORE">
   select if(max(stu_id) is null,1,max(stu_id)+2) from student_info	
  </selectKey>
   insert into student_info (stu_age,stu_sex,stu_name) values 
   (#{stuAge},#{stuSex},#{stuName})
  </insert>

update 和delete元素

Mybatis執行完update和delete也會返回影響的行數。存在返回行數的值有問題的,檢查defaultExecutorType的引數設定,可以進行設為simple,simple就是預設值。

<update id="updateStudentInfo" parameterType="student">
  	update student_info 
  	set stu_name = #{stuName} where stu_id = #{stuId}
  </update>
  <delete id="deleteStudentbyId" parameterType="int">
  	delete from student_info where stu_id = #{id}
  </delete>

獲取matched行數

預設情況下,返回的就是matched 行數。也就是查詢條件匹配的行數。

defaultExecutorType有三個執行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作快取SQL以提高效能,但是有個缺陷就是無法獲取update、delete返回的行數。defaultExecutorType的預設執行器是SIMPLE。

int count = mapper.insertStudent(stu);

如果有SQL片段,update student_info set sex = '1' where id =1; 資料庫裡面執行會影響一條記錄

當mybatis第一次執行的時候返回的1

當mybatis第二次執行的時候返回的也是1,其實我們想要獲取的是更改的記錄數。也就是Affected rows.

如何獲取Affected rows

因為mybatis返回的預設是匹配的行數,而不是受影響的行數,如何設定返回的是受影響的行數,

加上useAffectedRows引數為true

jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true

Mybatis的入參配置

入參的時候可以指定下面這些引數。

javaType是可選的,如果不指定,會自動檢測.

#{age,jdbcType=TINYINT,javaType=Integer,typeHandler=...}

#{}: 入參,mybatis會做預編譯處理,比較安全,適合傳入的形參,sql語句具體需要的引數值

${} : mybatis不會做預編譯處理,不安全,適合傳入SQL語句本省的內容。

<sql id="studentColumns">
  	${prefix}.stu_id,${prefix}.stu_Age,${prefix}.stu_Sex,${prefix}.stu_Name 
  </sql>
 <include refid="studentColumns">
    	<property name="prefix" value="m"/>
    </include>

參考部落格:https://www.jianshu.com/p/daccc3ad6867


相關文章