Mybatis配置文件如何進(jìn)行配置呢?

# Mybatis配置文件如何進(jìn)行配置呢?

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-As1L3kZG-1602464876198)(https://imgkr.cn-bj.ufileos.com/768074eb-5e03-4ad1-81ee-5432b6614e4a.jpg)]

## Mybatis配置文件配置的方式

- properties

- settings

- typeAliases

- typeHandlers

- objectFactory

- plugins

- environments

- transactionManager

- dataSource

- mappers

## 案例實(shí)操

### 1. properties

這些屬性都是可外部配置且可動態(tài)替換的,既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來傳遞。例如:

~~~ xml

<property name="driver" value="com.mysql.jdbc.Driver" />? ? ? ? ? ?

<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />? ? ? ? ? ?

<property name="username" value="root" />? ? ? ? ? ?

<property name="password" value="root" />

~~~

其中的屬性就可以在整個配置文件中使用來替換需要動態(tài)配置的屬性值。比如:

~~~ xml

<property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${username}"/>

<property name="password" value="${password}"/>

~~~

如何配?

在config.xml 文件中\(zhòng)<configuration>引入子標(biāo)簽

~~~ xml

<properties resource="jdbc.properties"></properties>

~~~

并修改原有數(shù)據(jù)源連接相關(guān)配置如下:

~~~ xml

<environments default="development">? ?

? ? <environment id="development">?

? ? ? ? <transactionManager type="JDBC" />? ?

? ? ? ? <dataSource type="POOLED">? ? ? ?

? ? ? ? ? ? <property name="driver" value="${driver}" />? ?

? ? ? ? ? ? <property name="url" value="${url}" />? ? ?

? ? ? ? ? ? <property name="username" value="${username}" />?

? ? ? ? ? ? <property name="password" value="${password}" />?

? ? ? ? </dataSource>?

? ? </environment>

</environments>

~~~

即可完成。

### **2.** **settings**(了解)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-3Onyfk3D-1602464876203)(https://imgkr.cn-bj.ufileos.com/d0372a13-d467-4f73-a99b-45dfa35973b2.png)]

這是MyBatis 修改操作運(yùn)行過程細(xì)節(jié)的重要的步驟。下方這個表格描述了這些設(shè)置項、含義和默認(rèn)值。一般我們用默認(rèn)即可(詳細(xì)解釋見官網(wǎng)文檔)

對應(yīng)xml配置如下(開發(fā)中一般采用默認(rèn)配置即可):

~~~ xml

<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="autoMappingBehavior" value="PARTIAL"/>

? ? <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>

? ? <setting name="defaultExecutorType" value="SIMPLE"/>?

? ? <setting name="defaultStatementTimeout" value="25"/>

? ? <setting name="defaultFetchSize" value="100"/>

? ? <setting name="safeRowBoundsEnabled" value="false"/>

? ? <setting name="mapUnderscoreToCamelCase" value="false"/>

? ? <setting name="localCacheScope" value="SESSION"/>?

? ? <setting name="jdbcTypeForNull" value="OTHER"/>

? ? <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>

</settings>

~~~

###? **3.**typeAliases

類型別名是為 Java 類型設(shè)置一個短的名字。它只和 XML 配置有關(guān),存在的意義僅在于用來減少類完全限定名的冗余。例如:

Configuration 標(biāo)簽下添加

~~~ xml

<typeAliases>?

? ? <typeAlias alias="customer" type="com.xxx.pojo.Customer" />

</typeAliases>

~~~

修改CustomerMapper.xml 文件

~~~ xml

<!-- 查詢客戶-->

<select id="queryCustomerById" parameterType="int" resultType="customer">

? ? SELECT id,user_name 'userName' FROM? yg_customer WHERE? id=#{id}

</select>

~~~

也可以指定一個包名(**大家最喜歡的方式**),MyBatis 會在包名下面搜索需要的 Java Bean,比如:

~~~ xml

<typeAliases>? ?

? ? <!-- <typeAlias alias="customer" type="com.xxx.pojo" /> -->? ?

? ? <package name="com.xxx.pojo"/>

</typeAliases>

~~~

每一個在包**com.xxx.pojo** 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。 比如com.xxx.pojo.Customer 的別名為customer ;

若有注解,則別名為其注解值。? 注解名@Alias(value=“user”)

同樣mybatis已經(jīng)為我們構(gòu)建了相應(yīng)的類型別名,它們都是大小寫不敏感的,需要注意的是由基本類型名稱重復(fù)導(dǎo)致的特殊處理。

| **別名**? | **映射的類型** |

| ---------- | -------------- |

| _byte? ? ? | Byte? ? ? ? ? |

| _long? ? ? | Long? ? ? ? ? |

| _short? ? | Short? ? ? ? ? |

| _int? ? ? | Int? ? ? ? ? ? |

| _integer? | Int? ? ? ? ? ? |

| _double? ? | Double? ? ? ? |

| _float? ? | Float? ? ? ? ? |

| _boolean? | Boolean? ? ? ? |

| string? ? | String? ? ? ? |

| byte? ? ? | Byte? ? ? ? ? |

| long? ? ? | Long? ? ? ? ? |

| short? ? ? | Short? ? ? ? ? |

| int? ? ? ? | Integer? ? ? ? |

| integer? ? | Integer? ? ? ? |

| double? ? | Double? ? ? ? |

| float? ? ? | Float? ? ? ? ? |

| boolean? ? | Boolean? ? ? ? |

| date? ? ? | Date? ? ? ? ? |

| decimal? ? | BigDecimal? ? |

| bigdecimal | BigDecimal? ? |

| object? ? | Object? ? ? ? |

| map? ? ? ? | Map? ? ? ? ? ? |

| hashmap? ? | HashMap? ? ? ? |

| list? ? ? | List? ? ? ? ? |

| arraylist? | ArrayList? ? ? |

| collection | Collection? ? |

| iterator? | Iterator? ? ? |

###? 4.typeHandlers 類型處理器(面試有可能會問)

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

| BooleanTypeHandler? ? ? ? | java.lang.Boolean, boolean | 數(shù)據(jù)庫兼容的 BOOLEAN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| -------------------------- | -------------------------- | ------------------------------------------------------------ |

| ByteTypeHandler? ? ? ? ? ? | java.lang.Byte, byte? ? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 BYTE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| ShortTypeHandler? ? ? ? ? | java.lang.Short, short? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 SHORT INTEGER? ? ? ? ? ? ? ? ? ? ? ? |

| IntegerTypeHandler? ? ? ? | java.lang.Integer, int? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 INTEGER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| LongTypeHandler? ? ? ? ? ? | java.lang.Long, long? ? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 LONG INTEGER? ? ? ? ? ? ? ? ? ? ? ? |

| FloatTypeHandler? ? ? ? ? | java.lang.Float, float? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 FLOAT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| DoubleTypeHandler? ? ? ? ? | java.lang.Double, double? | 數(shù)據(jù)庫兼容的 NUMERIC 或 DOUBLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| BigDecimalTypeHandler? ? ? | java.math.BigDecimal? ? ? | 數(shù)據(jù)庫兼容的 NUMERIC 或 DECIMAL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| StringTypeHandler? ? ? ? ? | java.lang.String? ? ? ? ? | CHAR, VARCHAR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| ClobReaderTypeHandler? ? ? | java.io.Reader? ? ? ? ? ? | -? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| ClobTypeHandler? ? ? ? ? ? | java.lang.String? ? ? ? ? | CLOB, LONGVARCHAR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| NStringTypeHandler? ? ? ? | java.lang.String? ? ? ? ? | NVARCHAR, NCHAR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| NClobTypeHandler? ? ? ? ? | java.lang.String? ? ? ? ? | NCLOB? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| BlobInputStreamTypeHandler | java.io.InputStream? ? ? ? | -? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| ByteArrayTypeHandler? ? ? | byte[]? ? ? ? ? ? ? ? ? ? | 數(shù)據(jù)庫兼容的字節(jié)流類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| BlobTypeHandler? ? ? ? ? ? | byte[]? ? ? ? ? ? ? ? ? ? | BLOB, LONGVARBINARY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| DateTypeHandler? ? ? ? ? ? | java.util.Date? ? ? ? ? ? | TIMESTAMP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| DateOnlyTypeHandler? ? ? ? | java.util.Date? ? ? ? ? ? | DATE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| TimeOnlyTypeHandler? ? ? ? | java.util.Date? ? ? ? ? ? | TIME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| SqlTimestampTypeHandler? ? | java.sql.Timestamp? ? ? ? | TIMESTAMP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| SqlDateTypeHandler? ? ? ? | java.sql.Date? ? ? ? ? ? ? | DATE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| SqlTimeTypeHandler? ? ? ? | java.sql.Time? ? ? ? ? ? ? | TIME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| ObjectTypeHandler? ? ? ? ? | Any? ? ? ? ? ? ? ? ? ? ? ? | OTHER 或未指定類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| EnumTypeHandler? ? ? ? ? ? | Enumeration Type? ? ? ? ? | VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引)? |

| EnumOrdinalTypeHandler? ? | Enumeration Type? ? ? ? ? | 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)。 |

你可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標(biāo)準(zhǔn)的類型。 具體做法為:實(shí)現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個 JDBC 類型。

### **5.** 對象工廠(objectFactory)(了解)

MyBatis 每次創(chuàng)建結(jié)果對象的新實(shí)例時,它都會使用一個對象工廠(ObjectFactory)實(shí)例來完成。默認(rèn)的對象工廠需要做的僅僅是實(shí)例化目標(biāo)類,要么通過默認(rèn)構(gòu)造方法,要么在參數(shù)映射存在的時候通過參數(shù)構(gòu)造方法來實(shí)例化。默認(rèn)情況下,我們不需要配置,mybatis會調(diào)用默認(rèn)實(shí)現(xiàn)的objectFactory。從這個類的外部看,這個類的主要作用就是根據(jù)一個類的類型得到該類的一個實(shí)體對象,比如,我們給他一個User的type,他將會給我們一個Tiger的實(shí)體對象,我們給他一個java.lang.List對象,他將會給我們一個List的實(shí)體對象。**類似于spring 工廠實(shí)例化bean**

### **6. plugins 插件**

MyBatis 允許你在已映射語句執(zhí)行過程中的某一點(diǎn)進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來攔截的方法調(diào)用包括:

· Executor (sql執(zhí)行時, update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

· ParameterHandler (參數(shù)的處理, getParameterObject, setParameters)

· ResultSetHandler (結(jié)果集的處理, handleResultSets, handleOutputParameters)

· StatementHandler (申明語句的處理, prepare, parameterize, batch, update, query)

這些類中方法的細(xì)節(jié)可以通過查看每個方法的簽名來發(fā)現(xiàn),或者直接查看 MyBatis 的發(fā)行包中的源代碼。 假設(shè)你想做的不僅僅是監(jiān)控方法的調(diào)用,那么你應(yīng)該很好的了解正在重寫的方法的行為。 因?yàn)槿绻谠噲D修改或重寫已有方法的行為的時候,你很可能在破壞 MyBatis 的核心模塊。 這些都是更低層的類和方法,所以使用插件的時候要特別當(dāng)心。

通過 MyBatis 提供的強(qiáng)大機(jī)制,使用插件是非常簡單的,只需實(shí)現(xiàn) Interceptor 接口,并指定了想要攔截的方法簽名即可。

總配置添加

~~~ xml

<!-- 插件 -->?

<plugins>?

? ? <plugin interceptor="com.xxx.plugins.ExamplePlugin">? ? ? ? ?

? ? ? ? <property name="someProperty" value="100" />?

? ? </plugin>

</plugins>

~~~

插件demo:

~~~ java

@Intercepts({?

? ? @Signature(? ? ?

? ? ? ? type=Executor.class,? ? ?

? ? ? ? /**? ? ? ?

? ? ? ? * 攔截所有方法? ?

? ? ? ? */? ?

? ? ? ? method="query",? ? ?

? ? ? ? /**? ? ? ? ?

? ? ? ? * 參數(shù)定義? ?

? ? ? ? */? ? ? ? ?

? ? ? ? args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}? ? ? ? ? ? )

})

public class ExamplePlugin implements Interceptor {?

? ? /**? ?

? ? * 每個插件必須實(shí)現(xiàn)以下三個方法?

? ? */? ?

? ? /**? ?

? ? * Object intercept(Invocation invocation)是實(shí)現(xiàn)攔截邏輯的地方,?

? ? * 內(nèi)部要通過invocation.proceed()顯式地推進(jìn)責(zé)任鏈前進(jìn),也就是調(diào)用下一個攔截器攔截目標(biāo)方法。

? ? */?

? ? public Object intercept(Invocation invocation) throws Throwable {? ? ? System.out.println("intercept");? ?

? ? ? ? return invocation.proceed();?

? ? ? }? ? ?

? ? /**? ?

? ? * Object plugin(Object target) 就是用當(dāng)前這個攔截器生成對目標(biāo)target的代理,?

? ? * 實(shí)際是通過Plugin.wrap(target,this) 來完成的,把目標(biāo)target和攔截器this傳給了包裝函數(shù)。?

? ? */?

? ? public Object plugin(Object target) {? ?

? ? ? ? return Plugin.wrap(target, this);?

? ? }? ? ?

? ? /**? ?

? ? * setProperties(Properties properties)用于設(shè)置額外的參數(shù),參數(shù)配置在攔截器的Properties節(jié)點(diǎn)里。?

? ? */?

? ? public void setProperties(Properties properties) {? ? ? System.out.println(properties.get("hello"));?

? ? }

}

~~~

### 7. 配置環(huán)境(environments)(熟悉 配多個數(shù)據(jù)源)

MyBatis 可以配置成適應(yīng)多種環(huán)境,這種機(jī)制有助于將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫之中, 現(xiàn)實(shí)情況下有多種理由需要這么做。例如,開發(fā)、測試和生產(chǎn)環(huán)境需要有不同的配置;或者共享相同 Schema 的多個生產(chǎn)數(shù)據(jù)庫, 想使用相同的 SQL 映射。許多類似的用例。

**不過要記?。罕M管可以配置多個環(huán)境,每個 SqlSessionFactory 實(shí)例只能選擇其一。**

所以,如果你想連接兩個數(shù)據(jù)庫,就需要創(chuàng)建兩個 SqlSessionFactory 實(shí)例,每個數(shù)據(jù)庫對應(yīng)一個。而如果是三個數(shù)據(jù)庫,就需要三個實(shí)例,依此類推,記起來很簡單:

**·** **每個數(shù)據(jù)庫對應(yīng)一個 SqlSessionFactory 實(shí)例**

~~~ xml

<environments default="development">

? ? <environment id="development">

? ? ? ? <transactionManager type="JDBC" />

? ? ? ? <dataSource type="POOLED">

? ? ? ? ? ? <property name="driver" value="${driver}" />

? ? ? ? ? ? <property name="url" value="${url}" />

? ? ? ? ? ? <property name="username" value="${username}" />

? ? ? ? ? ? <property name="password" value="${password}" />

? ? ? ? </dataSource>

? ? </environment>


? ? <environment id="test">

? ? ? ? <transactionManager type="JDBC" />

? ? ? ? <dataSource type="POOLED">

? ? ? ? ? ? <property name="driver" value="${driver2}" />

? ? ? ? ? ? <property name="url" value="${url2}" />

? ? ? ? ? ? <property name="username" value="${username2}" />

? ? ? ? ? ? <property name="password" value="${password2}" />

? ? ? ? </dataSource>

? ? </environment>

</environments>

~~~

~~~ xml

## development

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8

username=root

password=root

## test

driver2=com.mysql.jdbc.Driver

url2=jdbc:mysql://127.0.0.1:3306/mybatis2?useUnicode=true&amp;characterEncoding=utf8

username2=root

password2=root

~~~

測試sqlSessionFactory

~~~ java

public void test02() {?

? ? InputStream in;?

? ? try {? ? ? ?

? ? ? ? in = Resources.getResourceAsStream(this.getClass().getClassLoader()

? ? ? ? , "config.xml");? ? ?

? ? ? ? // 默認(rèn)開發(fā)庫? ?

? ? ? ? //SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);? ? ? ? ? // 測試庫? ? ?

? ? ? ? SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in,"test");? ? ?

? ? ? ? UserDao userDao=new UserDaoImpl(sqlSessionFactory);? ? ?

? ? ? ? User user= userDao.queryUserById(1);? ?

? ? ? ? System.out.println(user);

? ? ? ? } catch (IOException e) {? ?

? ? ? ? e.printStackTrace();? ?

? ? }

}

~~~

### 8. 事務(wù)管理器(transactionManager)(了解)

在 MyBatis 中有兩種類型的事務(wù)管理器(也就type=”[JDBC|MANAGED]”):

*? JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。

*? MANAGED – 這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務(wù)的整個生命周期。 默認(rèn)情況下它會關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設(shè)置為 false 來阻止它默認(rèn)的關(guān)閉行為。例如:

~~~ xml

<transactionManager type="MANAGED">?

? ? <property name="closeConnection" value="false"/>

</transactionManager>

~~~

**如果你正在使用 Spring + MyBatis,則沒有必要配置事務(wù)管理器, 因?yàn)?Spring 模塊會使用自帶的管理器來覆蓋前面的配置。**(集成時會講到)

### 9.dataSource 數(shù)據(jù)源(了解)

dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。

數(shù)據(jù)源類型有三種:UNPOOLED,POOLED,JNDI

**UNPOOLED**

這個數(shù)據(jù)源的實(shí)現(xiàn)只是**每次被請求時打開和關(guān)閉連接**。雖然有一點(diǎn)慢,它對在及時可用連接方面沒有性能要求的簡單應(yīng)用程序是一個很好的選擇。 不同的數(shù)據(jù)庫在這方面表現(xiàn)也是不一樣的,所以對某些數(shù)據(jù)庫來說使用連接池并不重要,這個配置也是理想的。

*? driver – 這是 JDBC 驅(qū)動的 Java 類的完全限定名(并不是JDBC驅(qū)動中可能包含的數(shù)據(jù)源類)。

*? url – 這是數(shù)據(jù)庫的 JDBC URL 地址。

*? username – 登錄數(shù)據(jù)庫的用戶名。

*? password – 登錄數(shù)據(jù)庫的密碼。

*? defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級別。

作為可選項,你也可以傳遞屬性給數(shù)據(jù)庫驅(qū)動。要這樣做,屬性的前綴為“driver.”,例如:

*? driver.encoding=UTF8

這將通過DriverManager.getConnection(url,driverProperties)方法傳遞值為 UTF8 的 encoding 屬性給數(shù)據(jù)庫驅(qū)動。

**POOLED**

? 這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對象組織起來,避免了創(chuàng)建新的連接實(shí)例時所必需的初始化和認(rèn)證時間。 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請求的流行處理方式。(一般選用這種)

* poolMaximumActiveConnections – 在任意時間可以存在的活動(也就是正在使用)連接數(shù)量,默認(rèn)值:10

* poolMaximumIdleConnections – 任意時間可能存在的空閑連接數(shù)。

* poolMaximumCheckoutTime – 在被強(qiáng)制返回之前,池中連接被檢出(checked out)時間,默認(rèn)值:20000 毫秒(即 20 秒)

* poolTimeToWait – 這是一個底層設(shè)置,如果獲取連接花費(fèi)的相當(dāng)長的時間,它會給連接池打印狀態(tài)日志并重新嘗試獲取一個連接(避免在誤配置的情況下一直安靜的失?。J(rèn)值:20000 毫秒(即 20 秒)。

* poolPingQuery – 發(fā)送到數(shù)據(jù)庫的偵測查詢,用來檢驗(yàn)連接是否處在正常工作秩序中并準(zhǔn)備接受請求。默認(rèn)是“NO PING QUERY SET”,這會導(dǎo)致多數(shù)數(shù)據(jù)庫驅(qū)動失敗時帶有一個恰當(dāng)?shù)腻e誤消息。

* poolPingEnabled – 是否啟用偵測查詢。若開啟,也必須使用一個可執(zhí)行的 SQL 語句設(shè)置 poolPingQuery 屬性(最好是一個非??斓?SQL),默認(rèn)值:false。

* poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用頻度。這可以被設(shè)置成匹配具體的數(shù)據(jù)庫連接超時時間,來避免不必要的偵測,默認(rèn)值:0(即所有連接每一時刻都被偵測 — 當(dāng)然僅當(dāng) poolPingEnabled 為 true 時適用)。


**JNDI**

? 這個數(shù)據(jù)源的實(shí)現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的引用。

* initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那么 data_source 屬性將會直接從 InitialContext 中尋找。

* data_source – 這是引用數(shù)據(jù)源實(shí)例位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進(jìn)行查找,沒有提供時則直接在 InitialContext 中查找。和其他數(shù)據(jù)源配置類似,可以通過添加前綴“env.”直接把屬性傳遞給初始上下文。比如:

* env.encoding=UTF8

這就會在初始上下文(InitialContext)實(shí)例化時往它的構(gòu)造方法傳遞值為 UTF8 的 encoding 屬性。

### 10.mappers 映射器(四種配置)(熟悉)

這里是告訴mybatis去哪尋找映射SQL 的語句??梢允褂妙惵窂街械馁Y源引用,或者使用字符,輸入確切的URL 引用。

~~~ xml

!— sqlmapper配置文件路徑 -->

<mappers>

? <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

? <mapper resource="org/mybatis/builder/BlogMapper.xml"/>

? <mapper resource="org/mybatis/builder/PostMapper.xml"/>

</mappers>

<!—url絕對路徑形式-->

<mappers>

? <mapper url="file:///var/mappers/AuthorMapper.xml"/>

? <mapper url="file:///var/mappers/BlogMapper.xml"/>

? <mapper url="file:///var/mappers/PostMapper.xml"/>

</mappers>

<!—接口 列表配置形式? 注解sql-->

<mappers>

? <mapper class="org.mybatis.builder.AuthorMapper"/>

? <mapper class="org.mybatis.builder.BlogMapper"/>

? <mapper class="org.mybatis.builder.PostMapper"/>

</mappers>

<!—映射包下所有接口-->

<mappers>

? <package name="org.mybatis.builder"/>

</mappers>

~~~

這些配置會告訴了 MyBatis 去哪里找映射文件,剩下的細(xì)節(jié)就應(yīng)該是每個 SQL 映射文件。

## 擴(kuò)展

### 封裝Dao

#### 1新建接口CustomerDao

接口定義:

~~~ java

public interface CustomerDao {

? ? Customer queryCustomerByName(String userName);

}

~~~

#### 2 xml映射文件

~~~ xml

<?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="com.xxx.dao.CustomerDao">

? ? <!-- 查詢客戶-->

? ? <select id="queryCustomerByName" parameterType="string" resultType="com.xxx.pojo.Customer">

? ? ? SELECT id,user_name 'userName',user_balance 'userBalance' FROM? yg_customer WHERE? user_name=#{userName}

? ? </select>

</mapper>

~~~

#### 3 mappers映射器配置

~~~ xml

<mappers>

? ? ? <!-- <mapper resource="com/xxx/mapper/CustomerDao.xml" />-->

? ? ? ? <package name="com.xxx.dao"/>

</mappers>

~~~

#### 4 測試

~~~ java

public class App

{

? ? public static void main( String[] args ) throws IOException {

? ? ? ? //1 加載配置文件

? ? ? ? InputStream is = Resources.getResourceAsStream("mybatis.xml");

? ? ? ? //2 創(chuàng)建sqlsessionfactor工廠

? ? ? ? SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

? ? ? ? //3 構(gòu)建數(shù)據(jù)庫會話

? ? ? ? SqlSession session = factory.openSession();

? ? ? /* Customer customer = session.selectOne("com.xxx.mapper.customerMapper.queryCustomerById", 2);

? ? ? ? System.out.println(customer);*/

? ? ? ? CustomerDao customerDao = session.getMapper(CustomerDao.class);

? ? ? ? Customer customer = customerDao.queryCustomerByName("zhaoliying");

? ? ? ? System.out.println(customer);

? ? ? ? session.close();

? ? }

}

~~~

onFactory factory = new SqlSessionFactoryBuilder().build(is);

? ? ? ? //3 構(gòu)建數(shù)據(jù)庫會話

? ? ? ? SqlSession session = factory.openSession();

? ? ? /* Customer customer = session.selectOne("com.xxx.mapper.customerMapper.queryCustomerById", 2);

? ? ? ? System.out.println(customer);*/

? ? ? ? CustomerDao customerDao = session.getMapper(CustomerDao.class);

? ? ? ? Customer customer = customerDao.queryCustomerByName("zhaoliying");

? ? ? ? System.out.println(customer);

? ? ? ? session.close();

? ? }

}

~~~

需要視頻配套文檔或更多資料+我們程序員小姐姐v:lezijie007(加好友時備注:b站-LT,不備注拒絕添加喲)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容