03.Mybatis SQL 映射的 XML 文件

MyBatis 真正的力量是在映射語句中,SQL 映射文件有以下幾個頂級元素.

  • cache - 配置給定命名空間的緩存
  • cache-ref – 從其他命名空間引用緩存配置
  • resultMap – 用來描述如何從數據庫結果集中來加載你的對象
  • sql – 可以重用的 SQL 塊,也可以被其他語句引用
  • insert – 映射插入語句
  • update – 映射更新語句
  • delete – 映射刪除語句
  • select – 映射查詢語句

<br/>

select

查詢語句是使用 MyBatis 時最常用的元素之一,對於每次插入,更新或刪除,那也會有很多的查詢。這是 MyBatis 的一個基本原則,也是將重心和努力放到查詢和結果映射的原因。對簡單類別的查詢元素是非常簡單的。

比如:

<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>

這個語句被稱作 selectPerson,使用一個 int(或 Integer)類型的參數,並返回一個 HashMap類型的對象,其中的鍵是列名,值是列對應的值。
<br/>
這就告訴 MyBatis 創建一個 PreparedStatement(預處理語句)參數。使用JDBC,這樣的一個參數在 SQL 中會由一個“?”來標識,並被傳遞到一個新的預處理語句中,就像這樣:

// 相似的JDBC代碼,不是MyBatis的
String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);

當然,這需要很多單獨的 JDBC 的代碼來提取結果並將它們映射到對象實例中,這就是MyBatis 節省你時間的地方。我們需要深入瞭解參數和結果映射.

select 元素有很多屬性允許你配置,來決定每條語句的作用細節。

<select
id=”selectPerson”
parameterType=”int”
resultType=”hashmap”
resultMap=”personResultMap”
flushCache=”false”
useCache=”true”
timeout=”10000”
fetchSize=”256”
statementType=”PREPARED”
resultSetType=”FORWARD_ONLY”
>

如下內容爲各個參數的介紹:

  • id [在命名空間中唯一的標識符,可以被用來引用SQL語句]
  • parameterType [傳入SQL語句的參數類的類型]
  • resultTyp [SQL語句中返回的期望類型的類的類型或者別名。對於集合來說,那應該是集合可以包含的類型,而不能是集合本身]
  • resultMap [命名引用外部的 resultMap]
   <!--設置domain類和數據庫中表的字段一一對應,注意數據庫字段和domain類中的字段名稱不致,此處一定要!-->
    <resultMap id="BaseResultMap" type="User">
        <id column="USER_ID" property="userId" jdbcType="INTEGER" />
        <result column="USER_NAME" property="userName" jdbcType="CHAR" />
        <result column="USER_PASSWORD" property="userPassword" jdbcType="CHAR" />
        <result column="USER_EMAIL" property="userEmail" jdbcType="CHAR" />
    </resultMap>
    <!-- 查詢單條記錄 -->
    <select id="selectUserById" parameterType="int" resultMap="BaseResultMap">
        SELECT * FROM t_user WHERE USER_ID = #{userId}
    </select>
  • flushCache [將其設置爲 true,無論語句什麼時候被調用,都會導致緩存被清
    空。默認值:false]
  • useCache [將其設置爲 true,將會導致本條語句的結果被緩存。默認值:true]
  • timeout [驅動程序等待數據庫返回請求結果,並拋出異常時間的
    最大等待值]
  • fetchSize [驅動程序每次批量返回的結果行數]
  • statementType [STATEMENT,PREPARED 或 CALLABLE 的一種,這會讓 MyBatis使用選擇使用 Statement,PreparedStatement 或 CallableStatement,
    默認值:PREPARED]
  • resultSetType [FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE
    中的一種。默認是不設置(驅動自行處理)]

insert

<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
useGeneratedKeys=""
timeout="20000">

對於插入操作,假如數據庫表結構中支持自動生成主鍵的字段,那麼你可以設置 useGeneratedKeys=”true”,而且設置 keyProperty 到你已經做好的目標屬性上.

例如:

<insert id="insertAuthor" parameterType="domain.blog.Author"
useGeneratedKeys=”true” keyProperty=”id”>
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>

update

<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">

例如:

<update id="updateAuthor" parameterType="domain.blog.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>

delete

<delete
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">

例如:

<delete id="deleteAuthor” parameterType="int">
delete from Author where id = #{id}
</delete>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章