SQL映射文件詳解


SQL 映射文件只有很少的幾個頂級元素(按照應被定義的順序列出):

  • cache – 該命名空間的緩存配置。

  • cache-ref – 引用其它命名空間的緩存配置。

  • resultMap – 描述如何從數據庫結果集中加載對象,是最復雜也是最強大的元素。

  • sql – 可被其它語句引用的可重用語句塊。

  • insert – 映射插入語句。

  • update – 映射更新語句。

  • delete – 映射刪除語句。

  • select – 映射查詢語句。

select

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

select元素的屬性詳解:

屬性 描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數,默認值為未設置(unset)。
resultType 期望從這條語句中返回結果的類全限定名或別名。 如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。
resultMap 對外部 resultMap 的命名引用。 resultType 和 resultMap 之間只能同時使用一個。
flushCache 將其設置為 true 后,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:false。
useCache 將其設置為 true 后,將會導致本條語句的結果被二級緩存緩存起來,默認值:對 select 元素為 true。
timeout 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴數據庫驅動)。
fetchSize 這是一個給驅動的建議值,嘗試讓驅動程序每次批量返回的結果行數等於這個設置值。 默認值為未設置(unset)(依賴驅動)。
statementType 可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價於 unset) 中的一個,默認值為 unset (依賴數據庫驅動)。
resultOrdered 這個設置僅針對嵌套結果 select 語句:如果為 true,將會假設包含了嵌套結果集或是分組,當返回一個主結果行時,就不會產生對前面結果集的引用。 這就使得在獲取嵌套結果集的時候不至於內存不夠用。默認值:false
resultSets 這個設置僅適用於多結果集的情況。它將列出語句執行后返回的結果集並賦予每個結果集一個名稱,多個名稱之間以逗號分隔。

insert, update 和 delete

數據變更語句 insert,update 和 delete 的實現非常接近:

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20"><update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20"><delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

Insert, Update, Delete 元素的屬性詳解:

屬性 描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數的類全限定名或別名。
flushCache 將其設置為 true 后,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:(對 insert、update 和 delete 語句)true。
timeout 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴數據庫驅動)。
statementType 可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
useGeneratedKeys (僅適用於 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關系型數據庫管理系統的自動遞增字段),默認值:false。
keyProperty (僅適用於 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設置它的值,默認值:未設置(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
keyColumn (僅適用於 insert 和 update)設置生成鍵值在表中的列名,在某些數據庫(像 PostgreSQL)中,當主鍵列不是表中的第一列的時候,是必須設置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。

主鍵返回<selectKey>

插入一條新數據時,有兩種方法確定最新的主鍵值:

  • UUID(非自增主鍵返回)

在執行插入語句前獲取最新的主鍵值

    <!-- mysql的uuid生成主鍵 -->
<mapper namespace="mybatis_test.ManMapper">
    <insert id="insertUser" parameterType="mybatis_test.Man">
        <selectKey keyProperty="id" order="BEFORE" resultType="string">
            <!--去除'-'和空格-->
            select replace(uuid(), '-', '') 
        </selectKey>
        insert into man(id,name) value(#{id},#{name})
    </insert>
</mapper>
  • LAST_INSERT_ID()(自增主鍵返回)

通過LAST_INSERT_ID()獲取剛插入記錄的自增主鍵值,在insert語句執行后,執行select LAST_INSERT_ID()就可以獲取自增主鍵

SQL執行語句返回的是影響的行數,為1或者0,主鍵id已經存到了man對象的“id”字段中,所以應該從對象中獲取

    <insert id="insertUser" parameterType="mybatis_test.Man">
        insert into man(name) value(#{name})
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>

代碼

            //這里返回的是影像的行數,為1或者0
            manMapper.insertUser(man);
            sqlSession.commit();
            //主鍵id已經存到了man對象的“id”字段中,所以應該從對象中獲取
            System.out.println(man.getId());

selectKey 標簽屬性

屬性 描述
keyProperty selectKey 語句結果應該被設置的目標屬性。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn 匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
resultType 結果的類型。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串。如果希望作用於多個生成的列,則可以使用一個包含期望屬性的 Object 或一個 Map。
order 可選值BEFORE和AFTER,設置為BEFORE會先執行selectKey語句,再執行insert語句;設置為AFTER會先執行insert語句再執行selectKey語句

SQL片段

用來定義可重用的 SQL 代碼片段,以便在其它語句中使用。 參數可以靜態地(在加載的時候)確定下來,並且可以在不同的 include 元素中定義不同的參數值。

定義

<sql id="userColumns"> ... </sql>

在增刪查改的語句中使用 include標簽 使用SQL片段

參數(占位符)

傳入簡單參數,如 int ,String等,不用寫參數類型(parameterType),如果傳入的是對象,就需要寫

在Mybatis中,有兩種占位符

  • #{} 解析傳遞進來的參數數據

  • ${} 對傳遞進來的參數原樣拼接在SQL中

結果映射<resultMap>

簡單映射

  • 顯示配置resultMap

<resultMap type="mybatis_test.Student" id="citiesMap">...</resultMap>
<select id="findById" parameterType="int" resultMap="citiesMap">...</select>

select標簽的resultMap屬性=顯示配置的resultMap標簽的id屬性

  • 不配置 resultMap

    • resultType屬性為類的全限定名(需要保證表字段和類屬性相同,如果不同,可以在select語句中設置別名select user_city as usercity from... 或者顯示配置resultMap做字段和屬性的對應關系)

    <select id="findById" parameterType="int" resultType="mybatis_test.Student">...</select>
    • resultType屬性為類的別名

<!-- mybatis.xml 中 -->
<typeAlias type="mybatis_test.Studentr" alias="Studentr"/><!-- SQL 映射 XML 中 -->
<select id="selectUsers" resultType="Studentr">...</select>

高級結果映射

需要顯示配置 resultMap

resultMap的屬性

屬性 描述
id 當前命名空間中的一個唯一標識,用於標識一個結果映射。
type 類的完全限定名, 或者一個類型別名。
autoMapping 如果設置這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射。 這個屬性會覆蓋全局的屬性 autoMappingBehavior。默認值:未設置(unset)。

resultMap的子標簽

  • constructor - 用於在實例化類時,注入結果到構造方法中

    • idArg - ID 參數;標記出作為 ID 的結果可以幫助提高整體性能

    • arg - 將被注入到構造方法的一個普通結果

  • id – 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能

  • result – 注入到字段或 JavaBean 屬性的普通結果

  • association – 一個復雜類型的關聯;許多結果將包裝成這種類型

    • 嵌套結果映射 – 關聯可以是 resultMap 元素,或是對其它結果映射的引用

  • collection – 一個復雜類型的集合

    • 嵌套結果映射 – 集合可以是 resultMap 元素,或是對其它結果映射的引用

  • discriminator – 使用結果值來決定使用哪個 resultMap

    • case – 基於某些值的結果映射

      • 嵌套結果映射 – case 也是一個結果映射,因此具有相同的結構和元素;或者引用其它的結果映射

id和result的屬性

屬性 描述
property 映射到列結果的字段或屬性。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的字段(field)。 無論是哪一種情形,你都可以使用常見的點式分隔形式進行復雜屬性導航。 比如,你可以這樣映射一些簡單的東西:“username”,或者映射到一些復雜的東西上:“address.street.number”。
column 數據庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數一樣。
javaType 一個 Java 類的全限定名,或一個類型別名(關於內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。
jdbcType JDBC 類型,所支持的 JDBC 類型參見這個表格之后的“支持的 JDBC 類型”。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。
typeHandler 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的類型處理器。 這個屬性值是一個類型處理器實現類的全限定名,或者是類型別名。

constructor 的屬性

屬性 描述
column 數據庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數一樣。
javaType 一個 Java 類的完全限定名,或一個類型別名(關於內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。
jdbcType JDBC 類型,所支持的 JDBC 類型參見這個表格之前的“支持的 JDBC 類型”。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可能存在空值的列指定這個類型。
typeHandler 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的類型處理器。 這個屬性值是一個類型處理器實現類的完全限定名,或者是類型別名。
select 用於加載復雜類型屬性的映射語句的 ID,它會從 column 屬性中指定的列檢索數據,作為參數傳遞給此 select 語句。具體請參考關聯元素。
resultMap 結果映射的 ID,可以將嵌套的結果集映射到一個合適的對象樹中。 它可以作為使用額外 select 語句的替代方案。它可以將多表連接操作的結果映射成一個單一的 ResultSet。這樣的 ResultSet 將會將包含重復或部分數據重復的結果集。為了將結果集正確地映射到嵌套的對象樹中,MyBatis 允許你 “串聯”結果映射,以便解決嵌套結果集的問題。想了解更多內容,請參考下面的關聯元素。
name 構造方法形參的名字。從 3.4.3 版本開始,通過指定具體的參數名,你可以以任意順序寫入 arg 元素。參看上面的解釋。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM