mybatis 數據庫語句 標簽


一 . 更新,插入 返回 主鍵

這個其實是有好幾種問題的,先把網上那種先 生成key,再返回的到實體類中的
使用數據庫自定義函數nextval(‘student’) ,生成一個key,並把他設置到傳入的實體類中的studentId屬性上。在執行完此方法后,把該 key 賦值給 studentId屬性

    <insert id="createStudent" parameterType="data.model.StudentEntity" keyProperty="studentId">  
<selectKey keyProperty="studentId" resultType="String" order="BEFORE">
select nextval('student')
</selectKey>
INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_SEX, STUDENT_PHOTO)
VALUES (#{studentId}, #{studentSex},
#{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler})
</insert>

再是一種 ID 是自增長的
這里參數我傳入的是 map
設置 useGeneratedKeys=”true” 自增長
keyProperty=”ID” 這個ID 實際就是指的數據庫自增長的那個字段,在insert完成后會默認填充給他,執行完成后 在map里面取到對應的key獲取value就可以了

 <insert id="insertTaxiOrder" parameterType="map" useGeneratedKeys="true" keyProperty="ID" > 

INSERT INTO tb_TaxiOrderInfo ( UserID, DriverID, StartAddress)
VALUES (#{userID}, 0, #{StartAdd}})
</insert>

屬性 描述 取值
1.keyProperty selectKey 語句生成結果需要設置的屬性。

2.resultType 生成結果類型,MyBatis 允許使用基本的數據類型,包括String 、int, map類型。

3.order
3.1:BEFORE,會先選擇主鍵,然后設置keyProperty,再執行insert語句;
3.2:AFTER,就先運行insert 語句再運行selectKey 語句。

4.statementType MyBatis 支持STATEMENT,PREPARED和CALLABLE 的語句形式, 對應Statement ,PreparedStatement 和CallableStatement 響應

二 . if 的用法

2.1這個我傳入的參數是 map形式的,在mapper中的sql語句中可以用 if進行判斷 參數值是否為null,才會看是否執行if中的代碼塊,數字也是可以的

    <select id="registerCYUser" parameterType="map"  resultType="map">
SELECT WorkStaffID, ISNULL(PWD,'') AS PWD, WorkType
from tb_WorkStaff
WHERE

WorkType = #{WorkType}
<if test="CarNum != null">
AND
CarNum = #{CarNum}
<if test="CarNum == null">
AND
CarNum = #{CarNum}
</if>
</select>

2.2 如果參數傳入的是實體類,也可以這樣判斷

網上的就下面這樣拿過來,在if中進行判斷

<select id="StudentLis" resultMap="studentResult" parameterType="model.StudentEntity">  
SELECT ST.STUDENT_ID, ST.STUDENT_NAME,
FROM STUDENT_TBL ST
WHERE
<if test="studentSex != null and studentSex != '' ">
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</if>
<if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">
AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}
</if>
</select>

2.3 if 和 set 使用組合 更新 update

    <update id="updateZSInfo" parameterType="map">
UPDATE tb_OrdinaryUser
<set>
<if test="UserName != null">
UserName = #{UserName},
</if>
<if test="Phone != null">
Phone = #{Phone},
</if>
<if test="Email != null">
Email = #{Email},
</if>
</set>
WHERE userID = #{UserId}
</update>

三 . trim 關鍵字的使用

3.1 trim 替代 where

    <select id="if_trim" resultMap="studentEntity">  
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
FROM STUDENT_TBL ST
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="studentName !=null ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')
</if>
<if test="studentSex != null and studentSex != '' ">
AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}
</if>
<if test="studentBirthday != null ">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
</if>
</trim>
</select>

3.2 trim代替 set

  <update id="update_trim" parameterType="StudentEntity">  
UPDATE STUDENT_TBL
<trim prefix="SET" suffixOverrides=",">
<if test="studentName != null and studentName != '' ">
STUDENT_TBL.STUDENT_NAME = #{studentName},
</if>
<if test="studentSex != null and studentSex != '' ">
STUDENT_TBL.STUDENT_SEX = #{studentSex},
</if>
</trim>
WHERE STUDENT_TBL.STUDENT_ID = #{studentId}
</update>

四 . choose

4.1 choose 是集合 when 和 otherwise 使用的

<!-- 6 choose(判斷參數) - 按順序 將判斷成功進入第一個進入 when執行的語句 作為where條件 

如果when 都沒有進入 ,就會進入 otherwise 中執行-->

<select id="choose" resultMap="studentEntity" parameterType="StudentEntity">
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
FROM STUDENT_TBL ST
<where>
<choose>
<when test="studentName !=null ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')
</when >
<when test="studentBirthday != null ">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}
</when >
<otherwise>


</otherwise>
</choose>
</where>
</select>

五 . foreach

這個比自己在外部for循環執行,效率會快很多。

foreach一共有三種類型,分別為List,,Map三種

item :
循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。
具體說明:在list和數組中是其中的對象,在map中是value。
該參數為必選。

collection:
要做foreach的對象,作為入參時,
1.List 對象默認用list代替作為鍵
2. 數組對象有array代替作為鍵
3. Map對象有map默認的鍵。

當然在作為入參時可以使用@Param(“keyName”)來設置鍵,設置keyName后,list,array將會失效。 除了入參這種情況外,還有一種作為參數對象的某個字段的時候。
舉個例子:
1.如果User有屬性List ids。入參是User對象,那么這個collection = “ids”
2.如果User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那么collection = “ids.id”上面只是舉例,具體collection等於什么,就看你想對那個元素做循環。該參數為必選。

3.separator: 元素之間的分隔符,例如在in()的時候,separator=”,”會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該參數可選。open: foreach代碼的開始符號,一般是(和close=”)”合用。常用在in(),values()時。該參數可選。

4.close: foreach代碼的關閉符號,一般是)和open=”(“合用。常用在in(),values()時。該參數可選。

5.index: 在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選。

5.1 傳入 數組
實質就是循環 aa 實體類中的 list,中的一個list

  <select id="foreach_array" resultMap="bb" parameterType="aa">  
SELECT xx._ID,
xx._NAME,

FROM XXXX xx
WHERE xx._ID

IN
<foreach collection="array" item="classId" open="(" separator="," close=")">
#{classId}
</foreach>
</select>

5.2 配合 in 使用 參數傳入一個list

<select id="countByUserList" resultType="_int" parameterType="list">  
select count(*) from users
<where>
id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreach>
</where>
</select>

5.3 批量插入
方式1

     insert into aa ( depart1, depart2 ) values
<foreach collection="list" item="item" index="index"
separator=",">
( #{item.depart1}, #{item.depart2} )
</foreach>

方式2

    insert into table(aa,bb)
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.hkgs,aa=VARCHAR}, #{item.bb,jdbcType=VARCHAR},
} from dual
</foreach>

5.4 批量刪除

  <delete id="dd" parameterType="list">
DELETE FROM LD_USER WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>

5.5 批量修改

      <update id="update" parameterType="list">
update table set age = '0' where no in
<foreach collection="list" item="nos" open="(" separator="," close=")">
#{nos}
</foreach>
</update>

5.6 批量條件查詢

<select id="sel" resultType="int">  
select count(*) from aa where
<foreach item="item" index="key" collection="map"
open="" separator="AND" close="">
${key} = #{item}</foreach>
</select>

$ {} 是原樣輸出, #{} 是取值


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com