mybatis-config詳細配置說明

<?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>
	<!-- 屬性配置元素可以將配置值具體化到一個屬性文件中,並且使用配置文件的key作爲佔位符
		application.properties
		jdbc.driverClassName=com.mysql.jdbc.Driver
		jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo
		jdbc.username=root
		jdbc.password=admin
		在mybatis-config.xml中可以使用application.properties文件中定義的佔位符
		當然也可以直接使用properties來設置值
	 -->
	<properties resource="application.properties">
		<property name="username" value="db_user" />
		<property name="password" value="verysecurepwd" />
	</properties>
	<!-- 全局設置settings -->
	<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="defaultExecutorType" value="SIMPLE" />
		<setting name="defaultStatementTimeout" value="25000" />
		<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>
	<!-- 類型別名
		主要是爲了簡化在mapper文件中paramerType和resultType對應的類全限定名
	 -->
	<typeAliases>
		<typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" />
		<!-- 可以提供需要取別名的類所在的包,mybatis會自動掃描包內的javaBean,然後分別爲每個javaBean定義一個小寫字母開頭的
			 例如這個包下有一個Student,那麼別名爲:student
			 除此之外:@Alias("StudentAlias")
				   public class Student{
				   		...
				   }
			@Alias 註解將會覆蓋配置文件中的<typeAliases>定義
		-->
		<package name="com.mybatis3.domain" />
	</typeAliases>
	<!-- 
		類型句柄,類型處理器
		當mybatis執行一個INSERT操作的時候,匯創建一個PreparedStatement對象,並且執行一系列操作(操作下面詳細說)
		這個過程中有一個setXXX()方式爲佔位符設置值的過程,xxx可以是Int,String,Date的任何一種類型,
		那麼mybatis是依據什麼來判斷該使用setInt()還是setString()呢?其實 MyBatis 是通過使用類型處理器(type handlers)來決定這麼做的。
		MyBatis 對於以下的類型使用內建的類型處理器:所有的基本數據類型、基本類型的包裹類型、byte[] 、
		java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚舉類型等。所以當 MyBatis 發現
		屬性的類型屬於上述類型,他會使用對應的類型處理器將值設置到 PreparedStatement 中,同樣地,當從 SQL 結果集構
		建 JavaBean 時,也有類似的過程。
	 -->
	<typeHandlers>
		<typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />
		<package name="com.mybatis3.typehandlers" />
	</typeHandlers>
	<!-- 數據庫連接環境配置-->
	<environments default="development">
		<!-- environment:
		mybatis可以有多個dataScource環境,如DEV(開發),TEST(測試),
		可以通過默認的設置environment值來設定想要的environment  id。
		如果一個應用需要連接多個數據庫,需要將每一個數據庫設置成一個單獨的環境,
		並且爲每一個數據庫設置一個SqlSessionFactory -->
		<environment id="development">
			<!-- 事務管理器
				type1:JDBC:mybatis內部會使用JdbcTransactionFactory來創建TransectionManager。
					       例如,部署到tomcat的應用程序,需要應用程序自己來管理程序
				type2:MANAGED(託管,應用本身不去管理實務,交給所在服務器來管理):
					  mybatis內部使用ManagedTransactionFactory來創建事務管理其TransactionManager
					       例如:當一個 JavaEE的應用程序部署在類似 JBoss, WebLogic,GlassFish 應用服務器上時,
					       它們會使用 EJB 進行應用服務器的事務管理能力。在這些管理環境中,你可以使用 MANAGED 事務管理器。
			 -->
			<transactionManager type="JDBC" />
			<!-- 數據源dataSource
				type1:UNPOOLED:會爲每一個數據庫操作創建一個新的鏈接,並關閉它。適合於小數據小併發的情況
				type2:POOLED:會穿件一個數據庫連接池,開發和測試階段常用模式
				type3:JNDI:從在服務器上配置好的JNDI數據源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>
		</environment>
		<environment id="production">
			<transactionManager type="MANAGED" />
			<dataSource type="JNDI">
				<property name="data_source" value="java:comp/jdbc/MyBatisDemoDS" />
			</dataSource>
		</environment>
	</environments>
	<!-- mapper文件映射 -->
	<mappers>
		<mapper resource="com/mybatis3/mappers/StudentMapper.xml" /> 
		<mapper url="file:///D:/mybatisdemo/mappers/TutorMapper.xml" />
		<mapper class="com.mybatis3.mappers.TutorMapper" />
	</mappers>
	<!-- 
		附:
		1、mybatis執行一條INSERT語句的過程
			1)創建一個有佔位符的 PreparedStatement 接口,如下:
			Java Code 
			PreparedStatement pstmt = connection.prepareStatement
			("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)");
			2)檢查 Student 對象的屬性 studId 的類型,然後使用合適 setXXX 方法去設置參數值。這裏 studId 是 integer
			類型,所以會使用 setInt()方法:
			Java Code 
			pstmt.setInt(1,student.getStudId());
			3)類似地,對於 name 和 email 屬性都是 String 類型,MyBatis 使用 setString()方法設置參數。
			Java Code
			pstmt.setString(2, student.getName());
			pstmt.setString(3, student.getEmail());
			4)至於 dob 屬性, MyBatis 會使用 setDate() 方法設置 dob 處佔位符位置的值。
			5)MyBaits 會將 java.util.Date 類型轉換爲 into java.sql.Timestamp 並設值:
			pstmt.setTimestamp(4, new Timestamp((student.getDob()).
			getTime()));
		2、自定義typeHandler
			假設表 STUDENTS 有一個 PHONE 字段,類型爲 VARCHAR(15),而 JavaBean  Student 有一個 PhoneNumber 類定義類型的 phoneNumber 屬性。
			Java Code  
			public class PhoneNumber{
				private String countryCode;
				private String stateCode;
				private String number;
				public PhoneNumber(){
					//...
				}
			public PhoneNumber(String countryCode, String stateCode, String number){
				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
			}
			public class Student{
				private Integer id;
				private String name;
				private String email;
				private PhoneNumber phone;
				// Setters and getters
			}
			XML Code  
			<insert id="insertStudent" parameterType="Student">
				insert into students(name,email,phone)
				values(#{name},#{email},#{phone})
			</insert>
			這裏,phone 參數需要傳遞給#{phone};而 phone 對象是 PhoneNumber 類型。然而,MyBatis 並不知道該怎樣來處理這個類型的對象。
			爲了讓 MyBatis 明白怎樣處理這個自定義的 Java 對象類型,如 PhoneNumber,我們可以創建一個自定義的類型處理器,如下所示:
			1)MyBatis 提供了抽象類 BaseTypeHandler<T> ,我們可以繼承此類創建自定義類型處理器。
			Java Code 
			packagecom.mybatis3.typehandlers;
			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>{
				@Override
				public void setNonNullParameter(PreparedStatement ps, int i,
				PhoneNumber parameter, JdbcType jdbcType) throwsSQLException{
					ps.setString(i, parameter.getAsString());
				}
				@Override
				public PhoneNumber getNullableResult(ResultSet rs, String columnName)throws SQLException{
					return new PhoneNumber(rs.getString(columnName));
				}
				@Override
				public PhoneNumber getNullableResult(ResultSet rs, int columnIndex)throws SQLException{
					return new PhoneNumber(rs.getString(columnIndex)); 
				}
				@Override
				public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)throws SQLException{
					return new PhoneNumber(cs.getString(columnIndex));
				}
			}
			2)我們使用 ps.setString()和 rs.getString()方法是因爲 phone 列是 VARCHAR 類型。
			3)一旦我們實現了自定義的類型處理器,我們需要在 mybatis-config.xml 中註冊它:
			XML Code 
			<?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 類型的列上。
	 -->
</configuration>

本文參考:Java Persistence with MyBatis 3(中文版)

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