Mybatis XML映射配置文件

一、XML 文檔的高層級結構以下:        html

                  configuration 配置java

                      properties 屬性git

                      settings 設置github

                      typeAliases 類型命名sql

                      typeHandlers 類型處理器數據庫

                      objectFactory 對象工廠緩存

                      plugins 插件安全

                      environments 環境session

                      environment 環境變量mybatis

                      transactionManager 事務管理器

                      dataSource 數據源

                      映射器

這裏配置時必定要注意順序配置。

properties 屬性(PS:爲何均可以配置到XML中,還要配置到properties 中呢?

        外部化的, 可替代的屬性, 這些屬性也能夠配置在典型的 Java 屬性配置文件中,或者經過 properties 元素的子元素來傳遞。

Mybatis 加載屬性順序:

        若是在這些地方,屬性多於一個的話,MyBatis 按照以下的順序加載它們:

              在 properties 元素體內指定的屬性首先被讀取。

              從類路徑下資源或 properties 元素的 url 屬性中加載的屬性第二被讀取,它會 覆蓋已經存在的徹底同樣的屬性。

              做爲方法參數傳遞的屬性最後被讀取, 它也會覆蓋任一已經存在的徹底同樣的屬性,這些屬性多是從 properties 元素體內和資源/url 屬性中加載的。

            例子:SqlSessionFactory factory =sqlSessionFactoryBuilder.build(reader, environment, props);

settings 設置:

                     

        關注:cacheEnabled 、lazyLoadingEnabled  、useGeneratedKeys、defaultExecutorType、defaultStatementTimeout


typeAliases屬性:

        類型別名是爲 Java 類型命名一個短的名字。 它只和 XML 配置有關, 只用來減小類徹底

        限定名的多餘部分。例如:

                <typeAliases>

                <typeAlias alias="Author" type="domain.blog.Author"/>

                <typeAlias alias="Blog" type="domain.blog.Blog"/>

                <typeAlias alias="Comment" type="domain.blog.Comment"/>

                <typeAlias alias="Post" type="domain.blog.Post"/>

                <typeAlias alias="Section" type="domain.blog.Section"/>

                <typeAlias alias="Tag" type="domain.blog.Tag"/>

                </typeAliases>

        使用這個配置, 「Blog」能夠任意用來替代「domain.blog.Blog」所使用的地方。對於普通的 Java 類型,有許多內建的類型別名。它們都是大小寫不敏感的,因爲重載的名字,要注意原生類型的特殊處理。                  

類型別名必須遵循MyBatis命名規範。

        具體參見:http://mybatis.github.io/mybatis-3/zh/configuration.html#typeAliases


typeHandlers:

        不管是 MyBatis 在預處理語句中設置一個參數, 仍是從結果集中取出一個值時, 類型處理器被用來將獲取的值以合適的方式轉換成 Java 類型。下面這個表格描述了默認的類型處理器。

                        類型處理器                                      Java  類型                                  JDBC  類型

                        BooleanTypeHandler                     Boolean,boolean                    任何兼容的布爾值

                        ByteTypeHandler                           Byte,byte                                  任何兼容的數字或字節類型

                        ShortTypeHandler                          Short,short                              任何兼容的數字或短整型

                        IntegerTypeHandler                       Integer,int                               任何兼容的數字和整型

                        LongTypeHandler                          Long,long                                任何兼容的數字或長整型

                        FloatTypeHandler                          Float,float                                 任何兼容的數字或單精度浮點型

                        DoubleTypeHandler                      Double,double                          任何兼容的數字或雙精度浮點型

                        BigDecimalTypeHandler                BigDecimal                                  任何兼容的數字或十進制小數類型

                        StringTypeHandler                         String                                          CHAR 和 VARCHAR 類型

                        ClobTypeHandler                           String                                          CLOB和 LONGVARCHAR 類型

                        NStringTypeHandler                      String                                          NVARCHAR 和 NCHAR 類型

                        NClobTypeHandler                        String                                          NCLOB類型

                        ByteArrayTypeHandler                  byte[]                                          任何兼容的字節流類型

                        BlobTypeHandler                          byte[]                                           BLOB和 LONGVARBINARY 類型

                        DateTypeHandler                          Date(java.util)                          TIMESTAMP 類型

                        DateOnlyTypeHandler                  Date(java.util)                          DA TE 類型

                        TimeOnlyTypeHandler                  Date(java.util)                          TIME 類型

                        SqlTimestampTypeHandler          Timestamp(java.sql)                  TIMESTAMP 類型

                        SqlDateTypeHandler                     Date(java.sql)                           DA TE 類型

                        SqlTimeTypeHandler                     Time(java.sql)                          TIME 類型

                        ObjectTypeHandler                       Any                                               其餘或未指定類型

                        EnumTypeHandler                       Enumeration 類型                           VARCHAR-任何兼容的字符串類型,做爲代碼存儲(而不是索引) 。


             你能夠重寫類型處理器或建立你本身的類型處理器來處理不支持的或非標準的類型。簡單實現 TypeHandler 接口(org.mybatis.type) ,而後映射新的類型處理器類到Java 類型,還有可選的一個 JDBC 類型。

BoundSql 中有屬性:

private List<ParameterMapping> parameterMappings;

ParameterMapping中屬性:

 private TypeHandler<?> typeHandler;



二、SQL  映射的 XML  文件:


SQL 映射文件有不多的幾個頂級元素(按照它們應該被定義的順序) :

                  cache - 配置給定命名空間的緩存。

                  cache-ref – 從其餘命名空間引用緩存配置。

                  resultMap – 最複雜,也是最有力量的元素,用來描述如何從數據庫結果集中來加載你的對象。

                  parameterMap – 已經被廢棄了!老式風格的參數映射。內聯參數是首選,這個元素可能在未來被移除。這裏不會記錄。

                  sql – 能夠重用的 SQL 塊,也能夠被其餘語句引用。

                  insert – 映射插入語句

                  update – 映射更新語句

                  delete – 映射刪除語句

                  select – 映射查詢語句


Select :

        查詢語句是使用 MyBatis 時最經常使用的元素之一。 直到你從數據庫取出數據時纔會發現將數據存在數據庫中是多麼的有價值, 因此許多應用程序查詢要比更改數據多的多。 對於每次插入,更新或刪除,那也會有不少的查詢。這是 MyBatis 的一個基本原則,也是將重心和努力放到查詢和結果映射的緣由。對簡單類別的查詢元素是很是簡單的。好比:

        <select id=」selectPerson」 parameterType=」int」 resultType=」hashmap」>

        SELECT * FROM PERSON WHERE ID = #{id}

        </select>

    這個語句被稱做 selectPerson, 使用一個 int (或 Integer) 類型的參數, 並返回一個 HashMap類型的對象,其中的鍵是列名,值是列對應的值。注意參數註釋:

                #{id}

    這就告訴 MyBatis 建立一個預處理語句參數。 使用 JDBC, 這樣的一個參數在 SQL 中會由一個「?」來標識,並被傳遞到一個新的預處理語句中,就像這樣:

                    // Similar JDBC code, NOT 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」

                parameterMap=」deprecated」

                resultType=」hashmap」

                resultMap=」personResultMap」

                flushCache=」false」

                useCache=」true」

                timeout=」10000」

                fetchSize=」256」

                statementType=」PREPARED」

                resultSetType=」FORWARD_ONLY」

                >

insert ,update ,delete:

數據變動語句 insert,update 和 delete 在它們的實現中很是類似:

首先,若是你的數據庫支持自動生成主鍵的字段(好比 MySQL 和 SQL Server) ,那麼你能夠設置 useGeneratedKeys=」true」,並且設置 keyProperty 到你已經作好的目標屬性上。

        例如,若是上面的 Author 表已經對 id 使用了自動生成的列類型,那麼語句能夠修改成:

        <insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys=」true」 keyProperty=」id」>

                insert into Author (username,password,email,bio)

                values (#{username},#{password},#{email},#{bio})

        </insert>

不支持自動生成主鍵的數據庫怎麼辦?mybatis用了最傻的辦法,生成隨機ID

            <insert id="insertAuthor" parameterType="domain.blog.Author">

                    <selectKey keyProperty="id" resultType="int" order="BEFORE">

                        select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1

                    </selectKey>

                            insert into Author

                        (id, username, password, email,bio, favourite_section)

                        values

                        (#{id}, #{username}, #{password}, #{email}, #{bio},

                        #{favouriteSection,jdbcType=VARCHAR}

                        )

            </insert>

   

sql

        這個元素能夠被用來定義可重用的 SQL 代碼段,能夠包含在其餘語句中。好比:

        <sql id=」userColumns」> id,username,password </sql>    

探究 已映射的 SQL  語句

      這裏你也許想知道經過 SqlSession 和 Mapper 對象到底執行了什麼操做。已映射的 SQL語句是一個很大的主題, 並且這個主題會貫穿本文檔的大部份內容。 爲了給出一個宏觀的概念,這裏有一些示例。上面提到的任何一個示例,語句是經過 XML 或註解定義的。咱們先來看看 XML。使用基於 XML 的映射語言,在過去的幾年中使得 MyBatis 很是流行,他爲 MyBatis 提供全部的特性設置。若是你之前用過 MyBatis,這個概念應該很熟悉了,可是 XML 映射文件也有不少的改進,後面咱們會詳細來講。這裏給出一個基於 XML 映射語句的示例,這些語句應

該能夠知足上述示例中 SqlSession 對象的調用。

        <?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="org.mybatis.example.BlogMapper">

            <select id="selectBlog" parameterType="int" resultType="Blog">

            select * from Blog where id = #{id}

            </select>

        </mapper>

      這個簡單的例子中看起來有不少額外的東西, 可是也至關簡潔了。 你能夠在一個單獨的XML 映射文件中定義不少的映射語句,除 XML 頭部和文檔類型聲明以外,你能夠獲得很多 方 便 之 處 。 在 文 件 的 剩 餘 部 分 是 很 好 的 自 我 解 釋 。 在 命 名 空 間「com.mybatis.example.BlogMapper」中,它定義了一個名爲「selectBlog」的映射語句,這樣它容許你使用徹底限定名 「org.mybatis.example.BlogMapper.selectBlog」 來調用映射語句,咱們下面示例中全部的寫法也是這樣的。

        Blog blog = (Blog) session.selectOne(

        "org.mybatis.example.BlogMapper.selectBlog", 101);

    要注意這個使用徹底限定名調用 Java 對象的方法是類似的,這樣作是有緣由的。這個命名能夠直接給相同命名空間下的的映射類, 使用一個名稱, 參數和返回值和已映射的查詢語句都同樣的方法便可。 這就容許你很是容易地調用映射器接口中的方法, 這和你前面看到的是同樣的,下面這個示例中它又出現了。

        BlogMapper mapper = session.getMapper(BlogMapper.class);

        Blog blog = mapper.selectBlog(101);

    第二種方式有不少有點,首先它不是基於文字的,那就更安全了。第二,若是你的 IDE有代碼補全功能,那麼你能夠利用它來操縱已映射的 SQL 語句。第三,不須要強制類型轉換,同時 BlogMapper 接口能夠保持簡潔,返回值類型很安全(參數類型也很安全) 。

相關文章
相關標籤/搜索