mybatis映射器文件配置

所謂的映射器可以理解爲前面配置的mapper.xml文件,在這個文件中我們通過namespace將配置和指定的Dao層接口關聯起來,準確的來說是爲每個Dao層接口中的方法配置具體的sql語句;另外mapper文件中還可以爲查詢語句靈活的配置返回結果對象(javaBean),根據需要構建動態sql等功能。在映射器中可以定義的元素有select insert delete update等代表具體sql操作類型的元素,另外還有sql(預定義好的一部分sql語句,可以在其它地方引用),resultMap(用來實現從數據庫查詢結果集到Java對象的映射,是最複雜和強大的元素),cache(給定命名空間的緩存配置),cache-ref(其它命名空間緩存配置)。下面來看下這些元素的具體配置。
1.select元素
select元素可以說是最強大也是最常用的sql元素,基本的過程是在執行查詢之前需要指定參數的類型,這個類型可以是簡單的int float,也可以是複雜的JavaBean,Map等元素
在執行查詢之後,可以通過ResultMap將查詢結果映射爲指定的Java Bean。具體的可配置參數如下,

元素 說明 備註
id 和mapper元素的namespace組合起來唯一對應到一個方法,提供給mybatis調用 如通過命名空間和id組合起來不唯一,MyBatis將拋出異常
parameterType 指定傳入參數的類型,多用於單參數情況,可以是基本類型,也可以是JavaBean全名或別名 可以選擇JavaBean或Map等複雜的參數類型傳遞給SQL
resultType 配置返回值類型,可以是int、double等基本類型,也可以配置JavaBean(全路徑或別名),如果JavaBean的字段名和數據庫返回字段名一致,可以實現自動映射。不能和resltMap同用 最常用的元素之一,比如我們統計總條數就將其置爲int
resultMap 結果映射Map,可以在其中自定義映射規則 它是MyBatis最複雜的元素,可以配置映射規則、級聯、typeHandler等
flushCache 它的作用是在調用SQL後是否要求Mybatis清空之前查詢的本地緩存和二級緩存 取值爲布爾類型,默認爲false
useCache 啓動二級緩存的開關,是否要求MyBatis將此次結果緩存 取值爲布爾型,默認爲true
timeout 設置超時參數,等超時的時候將拋出異常,單位爲秒 默認是底層JDBC驅動設置的秒數
fetchSize 獲取記錄的總條數設定 默認是JDBC所設置的條數
statementType 設置Mybatis使用的Statement,可以選擇的有STATEMENT(statement)、PREPARED(PreparedStatement)、CallableStatement 默認使用的是PREPARED

parameterType:用於指定從接口傳入參數的類型,參數可能是基本類型也有可能是Java Bean或其它集合類型.對於單個參數,可以直接用參數名引用,對於多個參數(無論是多個java Bean還是多個普通類型的參數,其實都是以Map形式傳入的,如果使用了@param註解,那麼Map的key就是註解中的參數名,如果只有一個參數,則可以直接通過名字引用否則就只能通過下標形式進行引用),傳入Collections集合的處理(比如傳入一個基本類型的list,或傳入一個Java Bean類型的list)。
一個簡單例子:統計名稱中包含指定關鍵詞的商品數目。

         <select id="countProductByName" parameterType="string" resultType="int">
        select count(1) as total from product where product_name like concat('%',#{productName},'%')
    </select>

這裏通過id來標識這條sql對應的方法,parameterType定義參數類型,resultType定義返回值類型。
自動映射:如果只要返回的數據庫字段和javaBean的屬性一致,Mybatis就會幫助我們回填這些字段,而無需額外的配置。autoMappingBehavior屬性可以用來指定是否需要開啓這種自動映射,有三個可選項:NONE(取消自動映射) PARTIAL(只會自動映射,沒有定義嵌套結果集映射的結果集) FULL(會自動映射任意複雜的結果集,包括嵌套結果集情況)。默認的是PARTIAL,只會映射當前對象,使用FULL嵌套映射,性能可能會下降。如果數據庫是下劃線命名方式而JavaBean是駝峯式,那麼可以在setting中配置mapUndersorceToCamelCase爲true,實現下劃線轉駝峯.自動映射的JavaBean是通過resultType屬性指定的。
多參數傳遞:少量參數使用@Param方式註解,在mapper.xml文件中可以直接通過@Param指定的名字進行引用;大量參數可以封裝成JavaBean傳入,通過ParameterType指定參數類型之後,在mapper.xml文件中,可以通過JavaBean的屬性名稱進行引用。對於單個參數,可以直接傳遞,直接通過名字引用。當參數數目比較少的時候,可以通過@Param方式傳入,如果參數
數目過多,可以封裝成Java Bean的形式傳入,如果傳入的參數中既有基本類型又有JavaBean類型,則還是需要通過@Param參數進行區分。

2.insert元素
insert元素比select元素簡單很多,mybatis會在插入之後返回一個整數,表示插入的條數;對於insert元素來說,和select一樣,首先都需要關注參數的
傳遞.可以配置的屬性一些和select元素是相同的,另外一些是特有的,主要看下特有的屬性。

參數 說明
flushCache 作用是執行sql之後是否需要情況mybatis的本地查詢緩存和二級緩存,默認是false
keyProperty 表示以哪個列作爲屬性的主鍵,不能與keyColumn同時使用.如果是聯合主鍵,以逗號分隔開
keyColumn 指定第幾列是主鍵,只接受整型參數,不能與keyProperty同時使用,如果是聯合主鍵,以逗號隔開
useGeneralKeys 會讓mybatis使用jdbc的getGeneralKeys方法來取出數據庫內部生成的主鍵,比如mysql的自動遞增id,必須和keyProperty或keyColumn配合使用,默認爲false。使用這個屬性可以實現主鍵值的回填,注意,這個屬性設置爲true的時候,返回結果映射的POJO對象中必須有一個字段和主鍵值完全同名,否則在回填結果的時候會報錯

insert中的主鍵回填:
如果在數據庫中定義了自增主鍵,那麼在有些情況下在插入數據之後希望能獲得生成的主鍵以便進行另外的操作。在mybatis中設置了keyProperty和keyColumn之後,再把useGeneralKeys設爲true,則可以實現主鍵的回填。
使用SelectKey實現自定義主鍵:
如果數據庫不支持自動生成主鍵或者數據庫默認生成主鍵的規則不能滿足我們的要求,那麼可以通過這個元素來進行主鍵的生成,可以配置的屬性:
keyProperty:需要被selectKey語句設置的目標屬性列名
resultType:結果類型,一般mybatis可以默認計算出
order:可以被設置爲 BEFORE 或 AFTER。如果設置爲 BEFORE,那麼它會首先選擇主鍵,設置 keyProperty 然後執行插入語句。如果設置爲 AFTER,那麼先執行插入語句,然後是 selectKey 元素 - 這和像 Oracle 的數據庫相似,在插入語句內部可能有嵌入索引調用。
其實在selectKey中只是給propertyKey指定的屬性賦了一個值,這個值甚至可以是完全隨機的,也可以是根據mybatis現有主鍵值進行生成的。

3.update和delete元素
這兩個元素和insert元素類似,都是返回操作影響的行數,主要需要關注的是參數的傳遞。總的來說,映射文件中配置的select insert update和delete幾個sql元素,對應的就是sql中的幾個語句.對於這些元素來說,都需要關心的是參數的傳遞,sql語句的組織(動態sql),另外對於select元素來說還需要關心查詢結果的映射。對於參數的傳遞,可以配置的屬性是parameterType 對於結果集的映射主要通過resultMap元素來進行配置。這兩個屬性在上面都已經涉及到,至於動態sql的拼裝,會在後面進行學習。

4.sql元素
sql元素的作用在於預先定義好一個sql的片段,然後在其它地方就可以直接引用。最簡單的示例如下:

<sql id="columns">
        branch_id,name,city,state,zip
    </sql>
    <select id="test" resultType="branch">
        select
        <include refid="columns"/>
        from branch where branch_id=#{branchId}
    </select>

更復雜一點,還可以往sql中傳入動態的屬性,注意這裏的變量不能用#定義而要用$定義,如下:

<sql id="columns">
        ${prefix}.branch_id,${prefix}.name,${prefix}.city,${prefix}.state,${prefix}.zip
    </sql>
    <select id="test" resultType="branch">
        select
        <include refid="columns">
            <property name="prefix" value="branch"/>
        </include>

        from branch where branch_id=#{branchId}
    </select>

5.resultMap屬性
前面在select元素已經提到了resultMap元素,這裏進行更詳細的瞭解。目前來說,resultMap的主要作用是實現結果集的映射以及配置類型轉換器。
首先來看下resultMap元素的構成,前面用到的主要是id和result兩個元素,但是除此之外還有很多其它元素,所有可配置的屬性如下:

<resultMap>
    <constructor>
    <idArg/>
    <arg/>
    </constructor>
    <id/>
    <result/>
    <association/>
    <collection/>
    <discriminator>
        <case/>
    </discriminator>
</resultMap>

constructor元素用來配置構造器,適用於有些JavaBean沒有提供無參構造器的情況,比如Branch對象只有一個 public Branch(int branch_id, String name)形式的構造器,那麼就需要配置如下的constructor元素,這樣mybatis才知道需要那個構造器來構造POJO對象。

<constructor>
     <idArg column="branch_id" javaType="int"/>
     <arg column="name" javaType="string"/>
 </constructor>

這裏的int 和string都是mybatis默認定義的系統別名,分別對應Integer和String類型。
id元素用來指明那個列是表的主鍵,如果有是聯合主鍵,則可以配置多個id元素,result用來定義數據庫列名到POJO屬性的映射。
id和result元素都有以下屬性可以進行配置:

 property //POJO中屬性名
 columns  //數據庫中列名
 javaType //屬性的Java類型
 jdbcType //列對應的數據庫類型
 typeHandler //數據庫類型向Java類型轉換的轉換器

此外的association collection discriminator都是和級聯相關的幾個字段,暫時不做介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章