mybatis3.0-[topic10-14] -全域性配置檔案_plugins外掛簡介/ typeHandlers_型別處理器簡介 /enviroments_執行環境 /多資料庫支援/mappers_sql對映註冊
阿新 • • 發佈:2018-11-27
mybatis3.0-全域性配置檔案_ 下面為中文官網解釋
/plugins外掛簡介 目前瞭解即可
外掛(plugins) MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, parameterize, batch, update, query) 這些類中方法的細節可以通過檢視每個方法的簽名來發現,或者直接檢視 MyBatis 發行包中的原始碼。
/typeHandlers_型別處理器簡介 目前瞭解即可
無論是 MyBatis 在預處理語句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時,
都會用型別處理器將獲取的值以合適的方式轉換成 Java 型別。下表描述了一些預設的型別處理器。
提示 從 MyBatis 3.4.5 (JDK1.8) 開始,MyBatis 預設支援 JSR-310(日期和時間 API) 。
/enviroments_執行環境 <--4 -->
MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。
例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映。許多類似的用例。
不過要記住:儘管可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一。
事務管理器(transactionManager)
資料來源(dataSource)
/多資料庫支援 <--5 -->
/mappers_sql對映註冊 <--6 -->
既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。
但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。
Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。
你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。
筆記要點
出錯分析與總結
使用包名的批量註冊, conf下的com.dao 和src下的com.dao目錄一直,也更加好看,
相當於把conf下的com.dao 的在物理位置上放到了src下的com.dao目錄. 全域性配置的mappers中新增: <package name="com.dao"/>
推薦:比較重要的, 複雜的Dao 介面我們來寫sql對映檔案;
不重要的,簡單的Dao介面為了開發快速可以使用註解;
全域性配置檔案 mybatis.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="dbconfig.properties"></properties> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!--.typeAliases : 別名處理器,可以為我們的java類的型別起別名 --> <typeAliases> <package name="com.bean"/> </typeAliases> <!-- 4.environments; 環境,mybatis可以配置多個環境, environments:配置一個具體的環境資訊,必須有以下兩個標籤: transactionManager: 事務管理器; 在 MyBatis 中有兩種型別(也就是 type=”[JDBC|MANAGED]”): Spring中會自動覆蓋; dataSource:資料來源的type型別; 有三種內建的資料來源型別(也就是 type=”[UNPOOLED| POOLED| JNDI] 自定義資料來源:實現DatasourceFactory介面即可, --> <environments default="development"> <!--測試環境--> <environment id="test"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> <!--開發環境--> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 5.databaseIdProvider : 支援多資料庫廠商; type="DB_VENDOR" , 作用就是得到資料庫廠商的標識(驅動:getDatabaseProductName()).mybatis --> <databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle" /> </databaseIdProvider> <!--6. 將我們寫好的sql對映檔案{EmployeeMapper.xml}, 一定要註冊到本全域性配置檔案{mybatis-config.xml}中--> <mappers> <!-- 一個mapper; 註冊一個sql對映! resource: 引用類路徑下的sql對映檔案, eg: resource="EmployeeMapper.xml"/> 或完全限定資源定位符:引用網路路徑或者磁碟路徑下的sql對映檔案(包括 file:/// 的 URL), eg:<mapper url="file:///var/conf/*********.xml"/> 或類名(使用對映器介面實現類的完全限定類名): 註冊介面:class,引用註冊介面. 1.有sql對映檔案 2,沒有sql對映檔案,所有的sql都是利用註解進行; eg: <mapper class="com.dao.EmployeeMapperAnnotation"/> 批量註冊: 包名(將包內的對映器介面實現全部註冊為對映器): 推薦:比較重要的, 複雜的Dao 介面我們來寫sql對映檔案; 不重要的,簡單的Dao介面為了開發快速可以使用註解; --> <package name="com.dao"/> </mappers> </configuration>
工程組織
測試程式碼
使用註解,建立EmployeeMapperAnnotation介面, 並加上註解
@Select("select * from tbl_employee where id=#{id}")
:
package com.dao; import com.bean.*; import org.apache.ibatis.annotations.Select; public interface EmployeeMapperAnnotation { @Select("select * from tbl_employee where id=#{id}") public Employee getEmpById(Integer id); }
測試類:test_tp14 測試成功
package com.test; public class test_tp14 { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test02() throws IOException{ SqlSession openSession = getSqlSessionFactory().openSession(); try { EmployeeMapperAnnotation mapper=openSession.getMapper(EmployeeMapperAnnotation.class); Employee empById = mapper.getEmpById(1); System.out.println(empById); } finally { openSession.close(); } } }
上個部落格的 測試類:test_tp04 也測試成功
package com.test; import com.bean.*; import com.dao.*; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /**介面式程式設計: * 1. 原生: Dao 介面-->Dao介面的實現類 * mybatis: Mapper --> 有一個與之對應的 XXMapper.xml * 2. SqlSession * 代表與資料庫的一次會話,用完必須關閉資源; *3.SqlSession 和connection 一樣都是非執行緒安全,不能宣告為全域性變數; * 每次使用都需要重新生命. * 4.mapper介面沒有實現類, 但是mybatis 會為這個介面生成一個代理物件: * (需要先將介面和XML檔案進行繫結!) * EmployeeMapper empMapper=openSession.getMapper(EmployeeMapper.class); * 5.兩個重要的配置檔案: * mybatis的全域性配置檔案: 包含資料庫連線池資訊,事物管理器資訊,系統檔案的資訊..... * SQL對映檔案: 儲存了每一個SL語句的對映資訊, */ public class Test_tp04 { //建立一個模板,直接返回一個新建的SqlSessionFactory public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test //第四節測試,測試介面式程式設計 public void test01() throws IOException{ //1.獲取sqlSessionFactory物件 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //呼叫模板的方法 //2.獲取一個SqlSession物件 SqlSession openSession = sqlSessionFactory.openSession(); try { //3.獲取介面的實現類 EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println("mapper.getClass(): "+mapper.getClass()); System.out.println(employee); } finally { openSession.close(); } } }View Code
測試結果
DEBUG 11-27 18:20:35,719 ==> Preparing: select * from tbl_employee where id=? (BaseJdbcLogger.java:145) DEBUG 11-27 18:20:35,736 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 11-27 18:20:35,748 <== Total: 1 (BaseJdbcLogger.java:145) Employee{id=1, lastname='tom', email='[email protected]', gender='0'}