mybatis使用學習(一)
mybatis使用學習(一)
1.MyBatis教程地址 https://mybatis.org/mybatis-3/zh/index.html
2.使用過程中幾個模糊不清得問題記錄:
(1)標籤中 parameterType 需不需要寫?
<select id="selectPerson" parameterType="int" parameterMap="deprecated" resultType="hashmap" resultMap="personResultMap" flushCache="false"
useCache="true" timeout="10" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
答案:可以不寫。
parameterType 將會傳入這條語句的引數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過型別處理器(TypeHandler)推斷出具體傳入語句的引數,預設值為未設定(unset)。
(2)條件查詢怎麼寫(Example)
//單條件:
MbAuthorityApplyDetailExample example = new MbAuthorityApplyDetailExample();
MbAuthorityApplyDetailExample.Criteria c = example.createCriteria();
c.andApplyIdEqualTo(id);
mbAuthorityApplyDetailMapper.selectByExample(example);
//多條件
MbAuthorityApplyDetailExample example = new MbAuthorityApplyDetailExample ();
MbAuthorityApplyDetailExample.Criteria c1 = example.createCriteria();
MbAuthorityApplyDetailExample.Criteria c2 = example.createCriteria();
c1.andApplyIdEqualTo(id);
c2.andDataTypeEqualTo("1");
mbAuthorityApplyDetailMapper.selectByExample(example);
(3)自定義sql 的 mapperXml檔案繼承
原始生成
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.inspur.crypto4j.lable.authorityApply.mapper.MbAuthorityApplyDetailMapper">
<resultMap id="BaseResultMap" type="com.inspur.crypto4j.lable.authorityApply.entity.MbAuthorityApplyDetail">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<result column="ID" jdbcType="VARCHAR" property="id" />
</resultMap>
</mapper>
繼承BaseResultMap的擴充套件sql檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.inspur.crypto4j.lable.authorityApply.mapper.MbAuthorityApplyDetailExtendMapper">
<resultMap extends="com.inspur.crypto4j.lable.authorityApply.mapper.MbAuthorityApplyDetailMapper.BaseResultMap" id="BaseResultMap" type="com.inspur.crypto4j.lable.authorityApply.entity.MbAuthorityApplyDetail">
</resultMap>
</mapper>
重點:
extends=“com.inspur.crypto4j.lable.authorityApply.mapper.MbAuthorityApplyDetailMapper.BaseResultMap”
(4)sql中batch方法的書寫
<insert id="batchInsert">
insert into MB_ACCESSDESCRIPTION
(ID)
values
<foreach collection="list" item="cdo" separator=",">
(#{cdo.id,jdbcType=VARCHAR})
</foreach>
</insert>
(5)字串替換書寫
字串替換
預設情況下,使用 #{} 引數語法時,MyBatis 會建立 PreparedStatement 引數佔位符,並通過佔位符安全地設定引數(就像使用 ? 一樣)。 這樣做更安全,更迅速,通常也是首選做法,不過有時你就是想直接在 SQL 語句中直接插入一個不轉義的字串。 比如 ORDER BY 子句,這時候你可以:
ORDER BY ${columnName}
這樣,MyBatis 就不會修改或轉義該字串了。
當 SQL 語句中的元資料(如表名或列名)是動態生成的時候,字串替換將會非常有用。 舉個例子,如果你想 select 一個表任意一列的資料時,不需要這樣寫:
@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);
@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);
@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);
// 其它的 “findByXxx” 方法
而是可以只寫這樣一個方法:
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
其中 ${column} 會被直接替換,而 #{value} 會使用 ? 預處理。 這樣,就能完成同樣的任務:
User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", "[email protected]");
這種方式也同樣適用於替換表名的情況。
提示 用這種方式接受使用者的輸入,並用作語句引數是不安全的,會導致潛在的 SQL 注入攻擊。因此,要麼不允許使用者輸入這些欄位,要麼自行轉義並檢驗這些引數。
(6)標籤替換 where 1 = 1
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
</where>
</select>
用於動態更新語句的類似解決方案叫做 set。set 元素可以用於動態包含需要更新的列,忽略其它不更新的列。比如:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
(7)foreach
動態 SQL 的另一個常見使用場景是對集合進行遍歷(尤其是在構建 IN 條件語句的時候)。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素的功能非常強大,它允許你指定一個集合,宣告可以在元素體內使用的集合項(item)和索引(index)變數。它也允許你指定開頭與結尾的字串以及集合項迭代之間的分隔符。這個元素也不會錯誤地新增多餘的分隔符,看它多智慧!
提示 你可以將任何可迭代物件(如 List、Set 等)、Map 物件或者陣列物件作為集合引數傳遞給 foreach。當使用可迭代物件或者陣列時,index 是當前迭代的序號,item 的值是本次迭代獲取到的元素。當使用 Map 物件(或者 Map.Entry 物件的集合)時,index 是鍵,item 是值。
(8) like 等 特殊處理(bind 元素的使用)
bind 元素允許你在 OGNL 表示式以外建立一個變數,並將其繫結到當前的上下文。比如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
如:
<if test="startTime != null">
<bind name="pattern" value="startTime+' 00:00:00'"/>
AND CREAT_TIME >= to_date(#{pattern},'yyyy-mm-dd hh24:mi:ss')
</if>
(9) 大於小於等於
第一種寫法(1):
原符號 < <= > >= & ' "
替換符號 < <= > >= & ' "
例如:sql如下:
create_date_time >= #{startTime} and create_date_time <= #{endTime}
第二種寫法(2):
大於等於
<![CDATA[ >= ]]>
小於等於
<![CDATA[ <= ]]>
例如:sql如下:
create_date_time <![CDATA[ >= ]]> #{startTime} and create_date_time <![CDATA[ <= ]]> #{endTime}