1. 程式人生 > 其它 >mybatis使用學習(一)

mybatis使用學習(一)

技術標籤:mybatismybatis

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 &gt;= to_date(#{pattern},'yyyy-mm-dd hh24:mi:ss')
</if>

(9) 大於小於等於

第一種寫法(1):
原符號       <        <=      >       >=       &        '        "
替換符號    &lt;    &lt;=   &gt;    &gt;=   &amp;   &apos;  &quot;
例如:sql如下:
create_date_time &gt;= #{startTime} and  create_date_time &lt;= #{endTime}

第二種寫法(2):

大於等於
<![CDATA[ >= ]]>
小於等於
<![CDATA[ <= ]]>
例如:sql如下:
create_date_time <![CDATA[ >= ]]> #{startTime} and  create_date_time <![CDATA[ <= ]]> #{endTime}