溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MyBatis中XML映射配置文件的示例分析

發(fā)布時間:2021-09-17 11:51:26 來源:億速云 閱讀:189 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)MyBatis中XML映射配置文件的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

<span style="font-size:14px;">  My Batis 支持SQL查詢,是一些高級映射在持久層的完美展示。他更多的使用簡單的XML或注解用于配置和原始映射,<span style="color: rgb(54, 54, 54); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 24px; ">摒除了大量的JDBC代碼、手工設(shè)置參數(shù)和結(jié)果集封裝,提高了開發(fā)效率。</span></span>

MyBatis的XML配置文件包含了影響MyBatis行為甚深的設(shè)置和屬性信息。XML文檔的高層級結(jié)構(gòu)如下:

configuration配置

environment環(huán)境變量

transactionManager事務(wù)管理器

dataSource數(shù)據(jù)源

properties屬性

settings設(shè)置

typeAliases類型命名

typeHandlers類型處理器

objectFactory對象工廠

plugins插件

environments環(huán)境

映射器

下面就對各個屬性配置做出詳細介紹

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

例如:

[html] view plain copy
<properties resource="jdbc_mysql.properties" />  
[html] view plain copy
<dataSource type="POOLED">  
[html] view plain copy
<property name="driver" value="${driver}"/>  
[html] view plain copy
<property name="url" value="${url}"/>  
[html] view plain copy
<property name="username" value="${username}"/>  
[html] view plain copy
<property name="password" value="${password}"/>  
[html] view plain copy
</dataSource>

這個例子中的username和password將會由properties元素中設(shè)置的值來替換。driver和url屬性將會從包含進來的jdbc_mysql.properties文件中的值來替換。

Settings
      這些是極其重要的調(diào)整,它們會修改MyBatis在運行時的行為方式。下面這個表格描述了設(shè)置信息,它們的含義和默認值。

設(shè)置參數(shù)                                               描述

cacheEnabled       這個配置使全局的映射器啟用或禁用緩存。

lazyLoadingEnabled  全局啟用或禁用延遲加載。當禁用時,所有關(guān)聯(lián)對象都會即時加載。

aggressiveLazyLoading     當啟用時,有延遲加載屬性的對象在被調(diào)用時將會完全加載任意屬性。否則,每種屬性將會按需要加載。

multipleResultSetsEnabled       允許或不允許多種結(jié)果集從一個單獨的語句中返回(需要適合的驅(qū)動)。

useColumnLabel      使用列標簽代替列名。不同的驅(qū)動在這方便表現(xiàn)不同。參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動。

useGeneratedKeys     允許JDBC支持生成的鍵。需要適合的驅(qū)動。如果設(shè)置為true則這個設(shè)置強制生成的鍵被使用,盡管一些驅(qū)動拒絕兼容但仍然有效(比如Derby)。

autoMappingBehavior       指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結(jié)果。FULL會自動映射任意復雜的結(jié)果(嵌套的或其他情況)。

defaultExecutorType   配置默認的執(zhí)行器。SIMPLE執(zhí)行器沒有什么特別之處。REUSE執(zhí)行器重用預處理語句。BATCH執(zhí)行器重用語句和批量更新

defaultStatementTimeout   設(shè)置超時時間,它決定驅(qū)動等待一個數(shù)據(jù)庫響應(yīng)的時間。

一個設(shè)置信息元素的示例,完全的配置如下所示:

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>

typeAliases

類型別名是為Java類型命名一個短的名字。它只和XML配置有關(guān),只用來減少類完全限定名的多余部分。例如:

[html] view plain copy
<typeAliases>  
[html] view plain copy
<typeAlias alias="Author" type="domain.blog.Author"/>  
[html] view plain copy
<typeAlias alias="Blog" type="domain.blog.Blog"/>  
[html] view plain copy
<typeAlias alias="Comment" type="domain.blog.Comment"/>  
[html] view plain copy
<typeAlias alias="Post" type="domain.blog.Post"/>  
[html] view plain copy
<typeAlias alias="Section" type="domain.blog.Section"/>  
[html] view plain copy
<typeAlias alias="Tag" type="domain.blog.Tag"/>  
[html] view plain copy
</typeAliases>

使用這個配置,“Blog”可以任意用來替代“domain.blog.Blog”所使用的地方。

typeHandlers
          無論是MyBatis在預處理語句中設(shè)置一個參數(shù),還是從結(jié)果集中取出一個值時,類型處理器被用來將獲取的值以合適的方式轉(zhuǎn)換成Java類型。下面這個列表描述了默認的類型處理器。 依次是  類型處理器 Java類型 JDBC類型

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

ByteTypeHandler                  Byte,byte           任何兼容的數(shù)字或字節(jié)類型

ShortTypeHandler                 Short,short           任何兼容的數(shù)字或短整型

IntegerTypeHandler             Integer,int           任何兼容的數(shù)字和整型

LongTypeHandler                Long,long            任何兼容的數(shù)字或長整型

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

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

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

StringTypeHandler               String             CHAR和VARCHAR類型

ClobTypeHandler                String               CLOB和LONGVARCHAR類型

NStringTypeHandler           String        NVARCHAR和NCHAR類型

NClobTypeHandler              String          NCLOB類型

ByteArrayTypeHandler        byte[]          任何兼容的字節(jié)流類型

BlobTypeHandler                byte[]          BLOB和LONGVARBINARY類型

DateTypeHandler                Date(java.util)     TIMESTAMP類型

DateOnlyTypeHandler       Date(java.util)        DATE類型

TimeOnlyTypeHandler      Date(java.util)       TIME類型

SqlTimestampTypeHandler   Timestamp(java.sql)  TIMESTAMP類型

SqlDateTypeHandler         Date(java.sql)      DATE類型

SqlTimeTypeHandler        Time(java.sql)    TIME類型

ObjectTypeHandler          Any             其他或未指定類型

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

objectFactory
MyBatis每次創(chuàng)建結(jié)果對象新的實例時,它使用一個ObjectFactory實例來完成。如果參數(shù)映射存在,默認的ObjectFactory不比使用默認構(gòu)造方法或帶參數(shù)的構(gòu)造方法實例化目標類做的工作多。

plugins
MyBatis允許你在某一點攔截已映射語句執(zhí)行的調(diào)用。默認情況下,MyBatis允許使用插件來攔截方法調(diào)用:

Executor
            (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
 ParameterHandler
            (getParameterObject, setParameters)
 ResultSetHandler
          (handleResultSets, handleOutputParameters)
 StatementHandler

(prepare, parameterize, batch, update, query)
            這些類中方法的詳情可以通過查看每個方法的簽名來發(fā)現(xiàn),而且它們的源代碼在MyBatis的發(fā)行包中有。你應(yīng)該理解你覆蓋方法的行為,假設(shè)你所做的要比監(jiān)視調(diào)用要多。如果你嘗試修改或覆蓋一個給定的方法,你可能會打破MyBatis的核心。這是低層次的類和方法,要謹慎使用插件。

使用插件是它們提供的非常簡單的力量。簡單實現(xiàn)攔截器接口,要確定你想攔截的指定簽名。

java代碼:

[javascript] view plain copy
@Intercepts({@Signature(type= Executor.class,method = "update",  
[javascript] view plain copy
args = {MappedStatement.class,Object.class})})  
[javascript] view plain copy
public class ExamplePlugin implements Interceptor {  
[javascript] view plain copy
public Object intercept(Invocation invocation) throws Throwable  
[javascript] view plain copy
{  
[javascript] view plain copy
return invocation.proceed();  
[javascript] view plain copy
}  
[javascript] view plain copy
public Object plugin(Object target) {  
[javascript] view plain copy
return Plugin.wrap(target, this);  
[javascript] view plain copy
}  
[javascript] view plain copy
public void setProperties(Properties properties) {  
[javascript] view plain copy
}  
[html] view plain copy
MapperConfig.xml  
[html] view plain copy
<plugins>  
[html] view plain copy
<plugin interceptor="org.mybatis.example.ExamplePlugin">  
[html] view plain copy
<property name="someProperty" value="100"/>  
[html] view plain copy
</plugin>  
[html] view plain copy
</plugins>  
[html] view plain copy

上面的插件將會攔截在Executor實例中所有的“update”方法調(diào)用,它也是負責低層次映射語句執(zhí)行的內(nèi)部對象。

environments

[html] view plain copy
<environments default="development">  
        <environment id="development">  
            <transactionManager type="JDBC" />  
            <dataSource type="POOLED">  
                <property name="driver" value="${jdbc.driver}" />  
                <property name="url" value="${jdbc.url}"/>  
                <property name="username" value="${jdbc.user}" />  
                <property name="password" value="${jdbc.password}" />  
                                <property name="poolPingEnabled" value="true"/>  
                <property name="poolPingQuery" value="SELECT * FROM app_setup_setting WHERE name='allow_setup_unknown_app'" />  
                        <property name="poolPingConnectionsNotUsedFor" value="7200000"/>   
            </dataSource>  
        </environment>  
    </environments>  
dataSsource

dataSource元素使用基本的JDBC數(shù)據(jù)源接口來配置JDBC連接對象的資源。見上
transactionManager

在MyBatis中有兩種事務(wù)管理器類型(也就是type=”[JDBC|MANAGED]”):
1.JDBC – 這個配置直接簡單使用了JDBC的提交和回滾設(shè)置。它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。
2.MANAGED – 這個配置幾乎沒做什么。它從來不提交或回滾一個連接。而它會讓容器來管理事務(wù)的整個生命周期(比如Spring或JEE應(yīng)用服務(wù)器的上下文)。默認情況下它會關(guān)閉連接。然而一些容器并不希望這樣,因此如果你需要從連接中停止它,將closeConnection屬性設(shè)置為false。例如:

[html] view plain copy
<transactionManager type="MANAGED">  
<property name="closeConnection" value="false"/>  
</transactionManager>

這兩種事務(wù)管理器都不需要任何屬性。然而它們都是類型別名,要替換使用它們,你需要放置將你自己的類的完全限定名或類型別名,它們引用了你對TransacFactory接口的實現(xiàn)類。
public interface TransactionFactory {
void setProperties(Properties props);
Transaction newTransaction(Connection conn, boolean autoCommit);
}
任何在XML中配置的屬性在實例化之后將會被傳遞給setProperties()方法。你的實現(xiàn)類需要創(chuàng)建一個事務(wù)接口的實現(xiàn),這個接口也很簡單:

[html] view plain copy
public interface Transaction {  
Connection getConnection();  
void commit() throws SQLException;  
void rollback() throws SQLException;  
void close() throws SQLException;  
}

使用這兩個接口,你可以完全自定義MyBatis對事務(wù)的處理。

mappers

既然MyBatis的行為已經(jīng)由上述元素配置完了,我們現(xiàn)在就要定義SQL映射語句了。但是,首先我們需要告訴MyBatis到哪里去找到這些語句。Java在這方面沒有提供一個很好的方法,所以最佳的方式是告訴MyBatis到哪里去找映射文件。你可以使用相對于類路徑的資源引用,或者字符表示,或url引用的完全限定名(包括file:///URLs)。例如:

[html] view plain copy
// Using classpath relative resources(首選)  
<mappers>  
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>  
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>  
<mapper resource="org/mybatis/builder/PostMapper.xml"/>  
</mappers>  
// Using url fully qualified paths  
<mappers>  
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>  
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>  
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>  
</mappers>

感謝各位的閱讀!關(guān)于“MyBatis中XML映射配置文件的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI