1. 程式人生 > >mybatis學習二:mybatis配置詳解

mybatis學習二:mybatis配置詳解

MyBatis最關鍵的組成部分是SqlSessionFactory,我們可以從中獲取SqlSession, 並執行對映的SQL語句。
SqlSessionFactory物件可以通過基於XML的配置資訊或者JavaAPI建立。
注意:setting初期學習以連線為主,不輕易做修改
2.1 使用xml配置Mybatis
構建SqlSessionFactory最常見的方式是基於XML配置。下面的 mybatis-config.xml展示了一個典型的MyBatis配置檔案的樣子:

	<?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"> 
		<property name="username" value="db_user" /> 
		<property name="password" value="verysecurepwd" /> 
	  </properties> 
	  <settings> 
		<setting name="cacheEnabled" value="true" /> 
	  </settings> 
	  <typeAliases> 
		<typeAlias alias="Student" type="com.briup.pojo.Student" /> 
		<package name="com.briup.pojo" /> 
	  </typeAliases> 
	  <typeHandlers> 
		<typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /> 
		<package name="com.briup.typehandlers" /> 
	  </typeHandlers> 
	  <environments default="development"> 
		<environment id="development"> 
		  <transactionManager type="JDBC" /> 
		  <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> 
	  <mappers> 
		<mapper resource="com/briup/mappers/StudentMapper.xml" /> 
		<mapper url="file:///D:/mybatisdemo/mappers/StudentMapper.xml" /> 
		<mapper class="com.briup.mappers.StudentMapper" /> 
	  </mappers> 
	</configuration> 

	2.1.1 environments元素
	environments是配置mybatis當前工作的資料庫環境的地方
	MyBatis支援配置多個dataSource環境,可以將應用部署到不同的環境上,如DEV(開發環境),TEST(測試換將),QA(質量評估環境),UAT(使用者驗收環境),PRODUCTION(生產環境),可以通過將預設environments值設定成想要的environment的id值。

	有時候,我們可能需要在相同的應用下使用多個數據庫,比如我們可能有shoppingcart資料庫來儲存所有的訂單明細;使用reports資料庫儲存訂單明細的合計,用作報告。(也就是如果系統在執行期間如果有切換資料庫環境的需求,mybatis中也可以很輕鬆的實現).
	如果你的應用需要連線多個數據庫,你需要將每個資料庫配置成獨立的環境,並且為每一個數據庫建立一個SqlSessionFactory
	例如:
	<environments default="shoppingcart"> 
	  <environment id="shoppingcart"> 
		<transactionManager type="MANAGED" /> 
		<dataSource type="JNDI"> 
		  <property name="data_source" value="java:comp/jdbc/ShoppingcartDS" /> 
		</dataSource> 
	  </environment> 
	  <environment id="reports"> 
		<transaction Managertype="MANAGED" /> 
		<dataSource type="JNDI"> 
		  <property name="data_source" value="java:comp/jdbc/ReportsDS" /> 
		</dataSource> 
	  </environment> 
	</environments> 

	我們可以為以上每個環境建立一個SqlSessionFactory
	java程式碼: 
	inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 
	//預設的環境
	defaultSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

	//統計明細的環境
	cartSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "shoppingcart"); 

	//統計報表的環境
	reportSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "reports");
	
	注意:對於environments,我們可以在其中配置多個environment子元素,同時還需要在environment中配置dataSource和transactionManager元素。

	
	2.1.2 dataSource元素
	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> 

	dataSource的型別type屬性可以配置成其內建型別之一,如UNPOOLED,POOLED,JNDI。
	如果將型別設定成UNPOOLED,MyBatis會為每一個數據庫操作建立一個新的連線,使用完了並關閉它,
該方式適用於只有小規模數量併發使用者的簡單應用程式上。
 
	如果將屬性設定成POOLED,MyBatis會建立一個數據庫連線池,連線池中的一個連線將會被用作資料

庫操作。一旦資料庫操作完成,MyBatis會將此連線返回
給連線池。在開發或測試環境中,經常使用此種方式。
如果將型別設定成JNDI(Java Naming and Directory Interface , Java命名和目錄介面,
是SUN公司提供的一種標準的Java命名系統介面),MyBatis
從在應用伺服器向配置好的JNDI資料來源dataSource
獲取資料庫連線。在生產環境中,優先考慮這種方式。

	2.1.3 transactionManager元素 :事務管理器 
	MyBatis支援兩種型別的事務管理器:JDBC 和 MANAGED. 
	JDBC事務管理器的使用,是在【jdbc程式】負責管理資料庫連線的生命週期(提交、回退等等)的時候。如果將

TransactionManager 屬性設定成JDBC,MyBatis內部將使用JdbcTransactionFactory類建立TransactionManager。
例如,部署到ApacheTomcat的應用程式,需要應用程式自己管理事務。
MANAGED 事務管理器的使用,是在【應用伺服器】負責管理資料庫連線生命週期的時候。如果
將TransactionManager屬性設定成MANAGED時,MyBatis內部使用ManagedTransactionFactory 類建立事
務管理器TransactionManager。例如,當一個Java EE的應用程式部署在類似JBoss,
WebLogic,GlassFish應用伺服器上時,它們會使用EJB進行應用伺服器的事務管理能力。在這些管理
環境中,你可以使用MANAGED事務管理器。
注:Managed 是託管的意思,即我們編寫的應用程式本身不去管理事務,而是把事務管理交給應用所在的伺服器進行管理。

	2.1.4 properties元素
	屬性配置元素properties可以將配置值寫死到mybatis-config.xml中,也可以具體到一個屬性檔案中,並且使用屬性檔案的key名作為佔位符.
	在上述的配置中,我們將資料庫連線屬性配置到了application.properties檔案中,並且為driver,URL等屬性使用了佔位符.

	在applications.properties檔案中配置資料庫連線引數,如下所示:
	jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
	jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
	jdbc.username=test 
	jdbc.password=test
	
	在mybatis-config.xml檔案中,為屬性使用application.properties檔案中定義的佔位符:
	<!-- 讀取application.properties檔案中的資料key-value的形式 -->
	<properties resource="application.properties">
	  <!-- 注意:是applications.properties檔案中的值優先順序高 -->
	  <property name="jdbc.username" value="briup" /> 
	  <property name="jdbc.password" value="briup" /> 
	</properties> 
	<environments default="development"> 
		<environment id="development"> 
		  <transactionManager type="JDBC" /> 
		  <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> 
	</environments>  


	2.1.5 typeAliases元素: 類型別名 
	在SQLMapper配置檔案中,對於resultType和parameterType屬性值,我們需要使用JavaBean 的完全限定名。
	例如:
	<select id="findStudentById" parameterType="int"  
		resultType="com.briup.pojo.Student"> 
			SELECT STUD_ID AS ID, NAME, EMAIL, DOB  
			FROM STUDENTS WHERE STUD_ID=#{Id} 
	</select> 
	<update id="updateStudent" parameterType="com.briup.pojo.Student"> 
		UPDATE STUDENTS  
			SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
			WHERE STUD_ID=#{id} 
	</update> 

	注:parameterType表示將來呼叫這個sql語句的時候所傳的引數的型別(引數值或者引數物件裡面的屬性值 用來替換sql語句中的佔位符)
	resultType表示將來呼叫這個sql語句的時候所返回的結果的型別(方便mybatis給我們自動封裝結果集)
	
	這裡我們為resultType和parameterType屬性值設定為Student型別的完全限定名:com.briup.com.Student
	
	我們可以為完全限定名取一個別名(alias),然後就可以在需要使用完全限定名的地方使用別名,
	而不是到處使用完全限定名。如下例子所示,為完全限定名起一個別名:
	<type Aliases> 
	  <type Alias alias="Student" type="com.briup.pojo.Student" /> 
	  <type Alias alias="Teacher" type="com.briup.pojo.Teacher" /> 
	</type Aliases> 

	然後在SQLMapper對映檔案中, 如下使用Student的別名:
	<select id="findStudentById" parameterType="int" resultType="Student"> 
		SELECT STUD_ID AS ID, NAME, EMAIL, DOB  
		FROM STUDENTS WHERE STUD_ID=#{id} 
	</select> 
	<update id="updateStudent" parameterType="Student"> 
		UPDATE STUDENTS  
			SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
		WHERE STUD_ID=#{id} 
	</update> 
	
	你可以不用為每一個JavaBean單獨定義別名,你可以為配置出需要取別名的類的所在的包(package),MyBatis會自動掃描包內定義的類,然後分別為每個類
	註冊一個小寫字母開頭的簡單類名形式的別名。如下所示:
	<type Aliases> 
	  <package name="com.briup.pojo" /> 
	</type Aliases> 
	如果Student.java和 Teacher.java 定義在com.briup.pojo包中,則 com.briup.pojo.Student的別名會被註冊為student。而com.briup.pojo.Teacher別名
	將會被註冊為teacher

	還有另外一種方式為JavaBeans起別名,使用註解 @Alias: 
	@Alias("stu") 
	public class Student{
		....
	} 
	@Alias註解將會覆蓋配置檔案中的<typeAliases>定義。
	


	2.1.6 typeHandlers元素: 型別處理器 
	當MyBatis將一個Java物件作為輸入引數執行INSERT語句操作時,它會建立一個

PreparedStatement物件,並且使用setXXX()方法對佔位符設定相應的
引數值 。這裡,XXX可以是Int,String,Date 等 Java物件屬性型別的任意一個。示例如下:

INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)
VALUES(#{stud Id},#{name},#{email},#{dob})

	為執行這個語句,MyBatis將採取以下一系列動作:
		建立一個有佔位符的PreparedStatement介面,如下:
		Prepared Statement ps = connection.prepare Statement 
                ("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)"); 
		檢查Student物件的屬性studId的型別,然後使用合適setXXX方法去設定引數值。

這裡studId是integer型別,所以會使用setInt()方法:ps.setInt(1,student.getStudId());

		類似地,對於name和email屬性都是String型別MyBatis使用setString()方法設定引數。
		至於dob屬性, MyBatis會使用setDate()方法設定dob處佔位符位置的值。
		MyBaits會將java.util.Date型別轉換為java.sql.Timestamp並設值:
		ps.setTimestamp(4, new Timestamp((student.getDob()).getTime())); 

	但MyBatis是怎麼知道對於Integer型別屬性使用setInt()和String型別屬性使用setString()

方法呢?其實MyBatis是通過使用型別處理器typeHandlers來決定這麼做的。

	MyBatis對於以下的型別使用內建的型別處理器:所有的基本資料型別、基本型別的包裹型別、

byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java枚
舉型別等。所以當MyBatis發現屬性的型別屬於上述型別,他會使用對應的型別處理器將值設定到
PreparedStatement中,同樣地,當SQL結果集封裝成java類物件的時候,也有類似的過程。

	那如果有一個自定義的型別,怎麼儲存儲存到資料庫呢?示例如下:假設表STUDENTS 有一個 PHONE 欄位,型別為 VARCHAR2(15),而 Student類有一個自定義型別屬性 
	alter table students add phone varchar2(15);
	alter table students drop column phone;

	java程式碼:
	PhoneNumber 類定義型別的 phoneNumber 屬性。

	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 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配置:
	<insert id="insertStudent" parameter Type="Student"> 
		insert into students(name,email,phone) 
		values(#{name},#{email},#{phone}) 
	</insert> 

	這裡,引數物件中的屬性phone的值需要傳遞給#{phone};而引數物件的屬性phone是

PhoneNumber型別。但是,MyBatis 並不知道該怎樣來處理這個型別的物件。
為了讓MyBatis明白怎樣處理這個自定義的Java物件型別,如PhoneNumber,我們可以建立
一個自定義的型別處理器,MyBatis提供了抽象類BaseTypeHandler ,我們可以繼承此類建立自定義型別處理器。
程式碼如下所示:
package com.briup.typehandlers;

		import java.sql.CallableStatement;
		import java.sql.PreparedStatement;
		import java.sql.ResultSet;
		import java.sql.SQLException;

		import org.apache.ibatis.type.BaseTypeHandler;
		import org.apache.ibatis.type.JdbcType;

		import com.briup.pojo.PhoneNumber;

		public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{

			//遇到PhoneNumber引數的時候應該如何在ps中設定值
			@Override
			public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)
					throws SQLException {
				ps.setString(i, parameter.getAsString());
			}

			//查詢中遇到PhoneNumber型別的應該如何封裝(使用列名封裝)
			@Override
			public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {
				return new PhoneNumber(rs.getString(columnName));
			}

			//查詢中遇到PhoneNumber型別的應該如何封裝(使用列的下標)
			@Override
			public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
				return new PhoneNumber(rs.getString(columnIndex));
			}

			//CallableStatement使用中遇到了PhoneNumber型別的應該如何封裝
			@Override
			public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
				return new PhoneNumber(cs.getString(columnIndex));
			}

		}
	
	注意:使用ps.setString()和rs.getString()方法是 :因為在資料庫的表中phone列是VARCHAR型別。

	最後一旦我們實現了自定義的型別處理器,我們需要在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" /> 
	  <type Handlers> 
		<type Handler handler="com.briup.typehandlers.PhoneTypeHandler" /> 
	  </type Handlers> 
	</configuration> 
	註冊PhoneTypeHandler後, MyBatis就能夠將Phone型別的物件值儲存到VARCHAR型別的列上。


	
	2.1.7 settings元素: 全域性引數設定
	注意:大多數情況下,【這些引數使用它們的預設值即可】
	為滿足應用特定的需求,MyBatis預設的全域性引數設定可以被覆蓋掉,如下所示:
	<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,hash Code ,to String" /> 
	  <setting name="proxyFactory" value="JAVASSIST" /> 
	  <setting name="aggressiveLazyLoading" value="true" /> 
	  <setting name="logImpl" value="LOG4J " /> 
	  <setting name="logPrefix" value="LOG4J " /> 
	  <setting name="callSettersOnNulls" value="false " /> 
	</settings> 


	<settings>
	  <!-- 這個配置使全域性的對映器啟用或禁用快取 -->
	  <setting name="cacheEnabled" value="true" />

	  <!-- 全域性啟用或禁用延遲載入。當禁用時,所有關聯物件都會即時載入 -->
	  <setting name="lazyLoadingEnabled" value="true" />

	  <!-- 允許或不允許多種結果集從一個單獨的語句中返回(需要適合的驅動) -->
	  <setting name="multipleResultSetsEnabled" value="true" /> 

	  <!-- 使用列標籤代替列名。不同的驅動在這方便表現不同。參考驅動文件或充分測試兩種方法來決定所使用的驅動 -->
	  <setting name="useColumnLabel" value="true" /> 

	  <!-- 允許JDBC支援生成的鍵。需要適合的驅動。 -->
	  <setting name="useGeneratedKeys" value="false" /> 

	  <!-- 指定MyBatis如何自動對映列到欄位/屬性。PARTIAL只會自動對映簡單、沒有巢狀的結果。FULL會自動對映任意複雜的結果(巢狀的或其他情況) -->
	  <setting name="autoMappingBehavior" value="PARTIAL" />
	  
	  <!-- 配置預設的執行器。SIMPLE執行器沒有什麼特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->
	  <setting name="defaultExecutorType" value="SIMPLE" /> 

	  !-- 設定超時時間,它決定驅動等待一個數據庫響應的時間 -->
	  <setting name="defaultStatementTimeout" value="25000" /> 
	  
	  <!-- 允許在巢狀語句中使用分頁(RowBounds)預設false -->
	  <setting name="safeRowBoundsEnabled" value="false" /> 

	  <!-- 是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。預設false -->
	  <setting name="mapUnderscoreToCamelCase" value="false" /> 

	  <!-- MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享資料。 -->
	  <setting name="localCacheScope" value="SESSION" /> 

	  <!-- 當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情況直接用一般型別即可,比如 NULL、VARCHAR 或 OTHER。 -->
	  <setting name="jdbcTypeForNull" value="OTHER" />

	  <!-- 指定物件的哪個方法觸發一次延遲載入。 -->
	  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode ,toString" /> 

	  <!-- CGLIB | JAVASSIST 預設JAVASSIST(MyBatis 3.3 or above)  -->
	  <!-- 指定 Mybatis 建立具有延遲載入能力的物件所用到的代理工具。 -->
	  <setting name="proxyFactory" value="JAVASSIST" /> 
	  <!-- 當啟用時,對任意延遲屬性的呼叫會使帶有延遲載入屬性的物件完整載入;反之,每種屬性將會按需載入。 -->
	  <setting name="aggressiveLazyLoading" value="true" /> 
		
	  <!-- 指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢。 -->
	  <setting name="logImpl" value="LOG4J " /> 

	  <!-- 指定 MyBatis 增加到日誌名稱的字首。值可以是任意字串 -->
	  <setting name="logPrefix" value="LOG4J " /> 

	  <!-- 指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。 預設false-->
	  <setting name="callSettersOnNulls" value="false " /> 
	</settings> 



	2.1.8 mappers元素: SQL對映
	SQLMapper檔案中包含的SQL對映語句將會被應用通過使用其標籤中的id值來執行。我們需要在mybatis-config.xml檔案中配置SQLMapper檔案的位置。
	<mappers> 
	  <mapper resource="com/briup/mappers/StudentMapper.xml" /> 
	  <mapper url="file:///D:/mybatisdemo/app/mappers/StudentMapper.xml" /> 
	  <mapper class="com.briup.mappers.StudentMapper" /> 
	  <package name="com.briup.mappers" /> 
	</mappers> 

	以上每一個<mapper> 標籤都可以從不同型別的資源中載入對映mapper:
	resource屬性用來指定在classpath中的mapper檔案。
	url屬性用來通過完全檔案系統路徑或者web URL地址來指向mapper檔案
	class屬性用來指向一個mapper介面
	package屬性用來指向可以找到Mapper介面的包名


2.2 使用Java API配置MyBatis (屬於瞭解的內容,因為有了靈活的配置配置方法,這個方式幾乎不用)
	MyBatis的SqlSessionFactory介面除了使用基於XML的配置建立外也可以通過JavaAPI程式設計式地被建立。每在XML中配置的元素,都可以程式設計式的建立。
	因為mybatis框架讀取了我們配置的mybatis-config.xml中配置資訊之後,然後利用這些資訊去執行程式碼創建出我們需要的SqlSessionFactory,再從而進一步得到sqlSession,最後再進行各種資料庫操作。
	所以其實我們完全可以不去配置任何資訊直接把資訊寫在程式碼中,然後在按著之前的順序創建出我們需要的SqlSessionFactory,再從而進一步得到sqlSession,最後再進行各種資料庫操作。只是這樣做再大多數時候都會降低程式碼的靈活性,所以我們基本上接觸的框架都是有相應的配置檔案的.

	例如:使用Java API建立SqlSessionFactory物件,之前是讀取配置檔案之後再建立,現在是自己把資訊寫到程式碼中,然後再建立該物件
	public static SqlSessionFactory getSqlSessionFactory() { 
		SqlSessionFactory sqlSessionFactory = null; 
		try { 
			DataSourcedata Source = DataSourceFactory.getDataSource(); 
			TransactionFactory transactionFactory = new JdbcTransactionFactory(); 
			Environment environment = new Environment("development", transactionFactory, dataSource); 
			Configuration configuration = new Configuration(environment); 
			configuration.getTypeAliasRegistry().registerAlias("student",Student.class); 
			configuration.getTypeHandlerRegistry().register(PhoneNumber.class, PhoneTypeHandler.class);
			configuration.addMapper(StudentMapper.class); 
			sqlSessionFactory = new SqlSessionFactoryBuilder(). 
			build(configuration); 
		} 
		catch (Exception e) { 
			throw new RuntimeException(e); 
		} 
		return sqlSessionFactory; 
	} 

	類似的,每個在XML中配置的元素,都可以程式設計式的建立.
	注:這裡就不一一介紹了,因為絕大多數情況下我們還是不會把配置資訊直接寫到程式碼中的

2.3 自定義MyBatis日誌
MyBatis使用其內部LoggerFactory作為真正的日誌類庫使用的門面。其內部的LaggerFactory會將日誌記錄任務委託給如下的所示某一個日誌實現,日誌記錄優先順序由上到下順序遞減:
SLF4J 
Apache Commons Logging 
Log4j2 
Log4j 
JDK logging 

如果MyBatis未發現上述日誌記錄實現,則MyBatis的日誌記錄功能無效,如果你的執行環境中,在classpath中有多個可用的日誌類庫,並且你希望MyBaits使用某個特定的日誌實現,你可以通過呼叫以下其中一個方法:
org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); 
org.apache.ibatis.logging.LogFactory.useLog4JLogging(); 
org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); 
org.apache.ibatis.logging.LogFactory.useJdkLogging(); 
org.apache.ibatis.logging.LogFactory.useCommonsLogging(); 
org.apache.ibatis.logging.LogFactory.useStdOutLogging(); 

注:
如果你想自定義MyBatis日誌記錄,你應該在呼叫任何其它方法之前呼叫以上的其中一個方法

相關推薦

mybatis學習mybatis配置

MyBatis最關鍵的組成部分是SqlSessionFactory,我們可以從中獲取SqlSession, 並執行對映的SQL語句。 SqlSessionFactory物件可以通過基於XML的配置資訊或者JavaAPI建立。 注意:setting初期學習以連線為

Mybatis學習(七)————— mybatis的逆向工程的配置

一、什麼是逆向工程?       簡單點說,就是通過資料庫中的單表,自動生成java程式碼。       Mybatis官方提供了逆向工程,可以針對單表自動生成mybatis程式碼(mapper.java\mapper.xml\po類)       企業中,逆向工程是個很常用的工具,之前我們就學習了hi

mybatis學習 全局配置文件解釋

auto java 命名 配置文件 pool action 取值 連接 詳細 全局配置文件的詳細解析可以參考mybatis的中文參考文檔 1.全局配置文件中內容1.1 <transactionManager/> type 屬性可取值1.1.1 JDBC,事

python爬蟲學習筆記Requests庫及HTTP協議

Requests庫的安裝:https://mp.csdn.net/postedit/83715574 r=requests.get(url,params=None,**kwargs) 這個r是Response物件 url :擬獲取頁面的url連結 params:url中的額外引數

【專案管理】Mybatis-Generator之最完美配置

 小夥伴們注意了,全哥花了一些時間,重新整理了一個最完美的Mybatis Generator(簡稱MBG)配置檔案詳細說明,老闆再也不用擔心我的學習!!! 不用多說,直接上程式碼: <?xml

Mybatis最入門---Mapper檔案配置(上)

[一步是咫尺,一步即天涯] 前文中,我們演示了最基本的HelloWorld程式,下面我們將介紹我們上面各項配置檔案的詳細解釋,以及我們正式開發過程中,各種配置的注意事項等。 慣例,先來看看我們的準備工作有: a.作業系統 :win7 x64 b.基本軟體:MySQ

Mybatis最入門---Mapper檔案配置(下)

[一步是咫尺,一步即天涯] 上文我們詳細解釋了HelloWorld工程中的配置項,本文,我們再來介紹一些更加基礎,靈活的配置項。本文,我們先不演示具體的工程,後續的文章中會按照實際應用來配置相關的

Spring+mybatis+struts框架整合的配置

學了很久的spring+mybatis+struts.一直都是單個的用他們,或者是兩兩組合用過,今天總算整合到一起了,配置起來有點麻煩,但是配置完一次之後,就輕鬆多了,那麼框架整合配置詳解如下。 1、匯入相應的jar包 因為我們建造的是maven的web專案,所有我們在pom.xml中需要匯入這些包。

logback( 常用配置

logback 常用配置詳解(二) <appender> <appender>: <appender>是<configuration>的子節點,是負責寫日誌的元件。 <appender>有兩個必要屬性nam

MyBatis學習mapper.xml屬性

XXMapper.xml檔案 1、id:標識對映檔案中的sql; 將sql語句封裝到mapped statement物件中,所以將id稱為statement的id。 2、parameterType:指定輸入引數型別 3、parameterMap:同parameterType

深入淺出Mybatis系列(三)---配置之properties與environments(mybatis原始碼篇)

上篇文章《深入淺出Mybatis系列(二)---配置簡介(mybatis原始碼篇)》我們通過對mybatis原始碼的簡單分析,可看

Hadoop學習筆記MapReduce框架

object 好的 單點故障 提高 apr copy 普通 exce 代表性 開始聊mapreduce,mapreduce是hadoop的計算框架,我學hadoop是從hive開始入手,再到hdfs,當我學習hdfs時候,就感覺到hdfs和mapreduce關系的緊密。這個

Python學習序列基礎

list ava author 萬裏 單個 使用下標 不能 get 分別是 作者:NiceCui 本文謝絕轉載,如需轉載需征得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/7858473.html 郵箱:moyi

Java學習02-web.xml配置

log 用戶授權 相對 lte 聯合 page int config 定制 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSche

mybatis 學習筆記mybatis SQL註入問題

spa onf concat http 控制臺 throws 檢查 src lec SQL 註入攻擊 首先了解下概念,什麽叫SQL 註入: SQL註入攻擊,簡稱SQL攻擊或註入攻擊,是發生於應用程序之數據庫層的安全漏洞。簡而言之,是在輸入的字符串之中註入SQL指令,在設計

Struts學習之Message Resources配置

目錄 一、概述 二、用法 三、建立資源包 四、配置 五、資原始檔放在哪裡 六、Tags 七、Actions 八、國際化 九、JSTL 十、結論 一、概述        Message Resources訊息

Docker(3)Dockerfile配置

FROM  : 指定base映象 MAINTAINER :設定映象的作者,可以是任意的字串 COPY :將檔案從build context 複製到映象             COPY 支援兩種形式:CO

一起來學SpringBoot | 第二篇SpringBoot配置

文章目錄 自定義屬性配置 自定義檔案配置 多環境化配置 外部命令引導 總結 說點什麼 SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配

Spring Cloud之Zuul(三)路由配置

主題 路由配置詳解 前言 現實中可能只想讓Zuul代理部分微服務,又或者需要對URL進行更加精確的控制。Zuul的路由配置非常靈活、簡單,本部落格通過幾個例項,詳細講解Zuul的路由配置。 內容 1.自定義指定微服務的訪問路徑 說明:配置zuul.routes.指定微服務

hihoCoder題A + B

using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace ConsoleApp3 { class Program1 { sta