標籤:result test dem 不同的 private val 環境配置 net 開發環境
MyBatis 最關鍵的組成部分是 SqlSessionFactory,我們可以從中擷取 SqlSession,並執行映射的 SQL 陳述式。SqlSessionFactory 對象可以通過基於 XML 的配置資訊或者 Java API 建立。
1 mybatis環境,environments 配置預設的資料庫環境
MyBatis 支援配置多個 dataSource 環境,可以將應用部署到不同的環境上,如 DEV(開發環境),TEST(測試換將),QA(品質評估環境),UAT(使用者驗收環境),PRODUCTION(生產環境),可以通過將預設 environment 值設定成想要的environment id 值。
2 每個environment 環境配置,需要有dataSource 和 transactionManager
dataSource 元素被用來設定資料庫串連屬性。典型配置如下
<dataSource type="POOLED"><property name="driver" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource>
2.1 dataSource 的類型可以配置成其內建類型之一,如 UNPOOLED,POOLED,JNDI。
? 如果將類型設定成 UNPOOLED,MyBatis 會為每一個資料庫操作建立一個新的串連,並關閉它。該方式
適用於只有小規模數量並發使用者的簡單應用程式上。
? 如果將屬性設定成 POOLED,MyBatis 會建立一個資料庫連接池,串連池中的一個串連將會被用作資料
庫操作。一旦資料庫操作完成,MyBatis 會將此串連返回給串連池。在開發或測試環境中,經常使用此
種方式。
? 如果將類型設定成 JNDI,MyBatis 從在應用伺服器向配置好的 JNDI 資料來源 dataSource 擷取資料庫
串連。在生產環境中,優先考慮這種方式。
2.2 交易管理員 TransactionManager
MyBatis 支援兩種類型的交易管理員: JDBC and MANAGED.
- JDBC 交易管理員被用作當應用程式負責管理資料庫串連的生命週期(提交、回退等等)的時候。當你將TransactionManager 屬性設定成 JDBC,MyBatis 內部將使用 JdbcTransactionFactory 類建立TransactionManager。例如,部署到 Apache Tomcat 的應用程式,需要應用程式自己管理事務。
- MANAGED 交易管理員是當由應用伺服器負責管理資料庫串連生命週期的時候使用。當你將TransactionManager 屬性設定成 MANAGED 時,MyBatis 內部使用 ManagedTransactionFactory 類建立交易管理員TransactionManager。例如,當一個JavaEE的應用程式部署在類似 JBoss,WebLogic,GlassFish 應用伺服器上時,它們會使用 EJB 進行應用伺服器的交易管理能力。在這些管理環境中,你可以使用 MANAGED 交易管理員。
Managed 是託管的意思,即是應用本身不去管理事務,而是把交易管理交給應用所在的伺服器進行管理。
3 類型別名 typeAliases,
設定檔中,對於 resultType 和 parameterType 屬性值,我們需要使用 JavaBean 的完全限定名。
我們可以為完全限定名取一個別名(alias),然後其需要使用完全限定名的地方使用別名,而不是到處使用完全限定名。
<typeAliases><typeAlias alias="Student" type="com.mybatis3.domain.Student" /><typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" /><package name="com.mybatis3.domain" /></typeAliases>
另一種方式為 JavaBeans 起別名,使用註解@Alias:
@Alias("StudentAlias")public class Student{}
注意:@Alias 註解將會覆蓋設定檔中的<typeAliases>定義。
4 類型處理器 typeHandlers
MyBatis 是怎麼知道對於 Integer 類型屬性使用 setInt() 和 String 類型屬性使用 setString()方法呢?
其實 MyBatis 是通過使用類型處理器(type handlers)來決定這麼做的。
MyBatis 對於以下的類型使用內建的類型處理器:所有的基礎資料型別 (Elementary Data Type)、基本類型的包裹類型、byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚舉類型等。所以當 MyBatis 發現屬性的類型屬於上述類型,他會使用對應的類型處理器將值設定到 PreparedStatement 中,同樣地,當從 SQL 結果集構建 JavaBean 時,也有類似的過程。
對於自訂的類型,需要自己建立自訂類型處理器。
MyBatis 提供了抽象類別 BaseTypeHandler<T> ,我們可以繼承此類建立自訂類型處理器。
例如,假設表 STUDENTS 有一個 PHONE 欄位,類型為 VARCHAR(15),而 JavaBean Student 有一個 PhoneNumber 類定義類型的 phoneNumber 屬性。
有一個屬性是如下的類, PhoneNumber 類
public class PhoneNumber{private String countryCode;private String stateCode;private String number;public PhoneNumber(){}public PhoneNumber(String countryCode, String stateCode, Stringnumber){this.countryCode = countryCode;this.stateCode = stateCode;this.number = number;}public PhoneNumber(String string){if(string != null){String[] parts = string.split("-");if(parts.length > 0) this.countryCode = parts[0];if(parts.length > 1) this.stateCode = parts[1];if(parts.length > 2) this.number = parts[2];}}public String getAsString(){return countryCode + "-" + stateCode + "-" + number;}// Setters and getters}View Code
而Student 定義如下
public class Student{private Integer id;private String name;private String email;private PhoneNumber phone;// Setters and getters}View Code
4.1 建立的類型處理器如下
importjava.sql.CallableStatement;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importcom.mybatis3.domain.PhoneNumber;public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{@Overridepublic void setNonNullParameter(PreparedStatement ps, int i,PhoneNumber parameter, JdbcType jdbcType) throwsSQLException{ps.setString(i, parameter.getAsString());}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, StringcolumnName)throws SQLException{return new PhoneNumber(rs.getString(columnName));}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, intcolumnIndex)throws SQLException{return new PhoneNumber(rs.getString(columnIndex));}@Overridepublic PhoneNumber getNullableResult(CallableStatement cs, intcolumnIndex)throws SQLException{return new PhoneNumber(cs.getString(columnIndex));}}
說明:我們使用 ps.setString()和 rs.getString()方法是因為 phone 列是 VARCHAR 類型。
4.2 一旦我們實現了自訂的類型處理器,我們需要在 mybatis-config.xml 中註冊它:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="application.properties" /><typeHandlers> <typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /></typeHandlers></configuration>
註冊 PhoneTypeHandler 後, MyBatis 就能夠將 Phone 類型的對象值儲存到 VARCHAR 類型的列上。
5 SQL 映射定義 Mappers
Mapper XML 檔案中包含的 SQL 映射語句將會被應用通過使用其 statementid 來執行。我們需要在 mybatis-config.xml 檔案中配置 SQL Mapper 檔案的位置。
<mappers> <mapper resource="com/mybatis3/mappers/StudentMapper.xml" /> <mapper url="file:///D:/mybatisdemo/app/mappers/TutorMapper.xml" /> <mapper class="com.mybatis3.mappers.TutorMapper" /> <package name="com.mybatis3.mappers" /></mappers>
以上每一個<mapper> 標籤的屬性有助於從不同類型的資源中載入映射 mapper:
? resource 屬性用來指定在 classpath 中的 mapper 檔案。
? url 屬性用來通過完全檔案系統路徑或者 web URL 地址來指向 mapper 檔案
? class 屬性用來指向一個 mapper 介面
? package 屬性用來指向可以找到 Mapper 介面的包名
Java Persistence with MyBatis 小結2