MyBatis 的配置文件包含了會深深影響 MyBatis 行爲的設置(settings)和屬性(properties)信息。文檔的頂層結構以下:java
configuration 配置 properties 屬性 settings 設置 typeAliases 類型別名 typeHandlers 類型處理器 objectFactory 對象工廠 plugins 插件 environments 環境 environment 環境變量 transactionManager 事務管理器 dataSource 數據源 databaseIdProvider 數據庫廠商標識 mappers 映射器
配置一些常見變量,相似於spring中placeholder的做用。通常能夠用來引入數據庫配置 mysql
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8 username=root password=1234
在mybatis配置文件中配置
spring
| 設置參數| 描述 | 有效值|默認值 | |--|--|--|--| | cacheEnabled |全局地開啓或關閉配置文件中的全部映射器已經配置的任何緩存。 |true |false | lazyLoadingEnabled |延遲加載的全局開關。當開啓時,全部關聯對象都會延遲加載。 特定關聯關係中可經過設置fetchType屬性來覆蓋該項的開關狀態 | true |false |aggressiveLazyLoading | 當開啓時,任何方法的調用都會加載該對象的全部屬性。不然,每一個屬性會按需加載(參考lazyLoadTriggerMethods) | true |false |multipleResultSetsEnabled | 是否容許單一語句返回多結果集(須要兼容驅動)。 | true |false | useColumnLabel |使用列標籤代替列名。不一樣的驅動在這方面會有不一樣的表現, 具體可參考相關驅動文檔或經過測試這兩種不一樣的模式來觀察所用驅動的結果 | true |false | useGeneratedKeys | 容許 JDBC 支持自動生成主鍵,須要驅動兼容。 若是設置爲 true 則這個設置強制使用自動生成主鍵,儘管一些驅動不能兼容但仍可正常工做(好比 Derby) | true |false |autoMappingBehavior | 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意複雜的結果集(不管是否嵌套) | NONE, PARTIAL, FULL |PARTIAL | autoMappingUnknownColumnBehavior |指定發現自動映射目標未知列(或者未知屬性類型)的行爲。 NONE: 不作任何反應WARNING: 輸出提醒日誌(‘org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ 的日誌等級必須設置爲 WARN) FAILING: 映射失敗 (拋出 SqlSessionException |NONE, WARNING, FAILING | NONE | |defaultExecutorType |配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新 |SIMPLE REUSE BATCH |SIMPLE | |defaultStatementTimeout |設置超時時間,它決定驅動等待數據庫響應的秒數。 | 任意正整數 | Not Set (null) | |defaultFetchSize | 爲驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只能夠在查詢設置中被覆蓋。| 任意正整數 | Not Set (null) | |safeRowBoundsEnabled | 容許在嵌套語句中使用分頁(RowBounds)。若是容許使用則設置爲false。| true |false | | safeResultHandlerEnabled | 容許在嵌套語句中使用分頁(ResultHandler)。若是容許使用則設置爲false | true | false | | mapUnderscoreToCamelCase |是否開啓自動駝峯命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的相似映射| true | false |false | | localCacheScope |MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。 默認值爲 SESSION,這種狀況下會緩存一個會話中執行的全部查詢。 若設置值爲 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不一樣調用將不會共享數據。 | SESSION | STATEMENT |SESSION | jdbcTypeForNull | 當沒有爲參數提供特定的 JDBC 類型時,爲空值指定 JDBC 類型。 某些驅動須要指定列的 JDBC 類型,多數狀況直接用通常類型便可,好比 NULL、VARCHAR 或 OTHER。| JdbcType 常量. 大多都爲: NULL, VARCHAR and OTHER |OTHER | lazyLoadTriggerMethods |指定哪一個對象的方法觸發一次延遲加載|用逗號分隔的方法列表。 |equals,clone,hashCode,toString | defaultScriptingLanguage | 指定動態 SQL 生成的默認語言。 | 一個類型別名或徹底限定類名|org.apache.ibatis.scripting.xmltags.XMLLanguageDriver | defaultEnumTypeHandler |指定 Enum 使用的默認 TypeHandler 。 (從3.4.5開始) 一個類型別名或徹底限定類名。 |org.apache.ibatis.type.EnumTypeHandler | | callSettersOnNulls |指定當結果集中值爲 null 的時候是否調用映射對象的 setter(map 對象時爲 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的 | true | false |false
| returnInstanceForEmptyRow |當返回行的全部列都是空時,MyBatis默認返回null。 當開啓這個設置時,MyBatis會返回一個空實例。 請注意,它也適用於嵌套的結果集 (i.e. collectioin and association)。(從3.4.2開始) |true | false |false
| logPrefix |指定 MyBatis 增長到日誌名稱的前綴。 | 任何字符串 |Not set
| logImpl |指定 MyBatis 所用日誌的具體實現,未指定時將自動查找 | SLF4J |LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING
| proxyFactory | 指定 Mybatis 建立具備延遲加載能力的對象所用到的代理工具 | CGLIB|JAVASSIST |vfsImpl |指定VFS的實現 | 自定義VFS的實現的類全限定名,以逗號分隔。|false
| useActualParamName | 容許使用方法簽名中的名稱做爲語句參數名稱。 爲了使用該特性,你的工程必須採用Java 8編譯,而且加上-parameters選項。(從3.4.1開始) |true | false |false
| useActualParamName | 指定一個提供Configuration實例的類。 這個被返回的Configuration實例用來加載被反序列化對象的懶加載屬性值。 這個類必須包含一個簽名方法static Configuration getConfiguration(). (從 3.2.3 版本開始) | 類型別名或者全類名. |falsesql
| 別名|映射類型 | |--|--| | _byte |byte | | _long |long | | _shtor | shtor | |_int |int | | _integer | int| | _double |double | |_float |float | | _boolean |boolean | |string |String | | byte |Byte | | long | Long | |shtor Shtor| | | int | Integer | |integer |Integer | | double |Double | |float| Float | | boolean |Boolean | |date | Date | | decimal |BigDecimal | |bidecimal | BigDecimal |數據庫
上面這些是由MyBatis提供的別名映射,開發者也能夠自定義別名,定義方式以下apache
<typeAliases> <!-- 別名不區分大小寫 --> <!-- <typeAlias type="com.sxt.bean.User" alias="user"/> --> <!-- 指定類型名稱的所屬的package --> <package name="com.sxt.bean" /> </typeAliases
==自定義別名使用不區分大小寫==緩存
ypeHandlers稱作類型處理器。就是實現Java類型和數據庫類型之間轉換的。 除了系統提供的類型轉換器以外,開發者也能夠自定義類型轉換,以下:session
例如List<—>VARCHAR之間的類型轉換:mybatis
/** * 自定義的類型轉換器 實現list<String> <----> String * * @author Administrator * */ @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class MytypeHandler extends BaseTypeHandler<List<String>> { /** * PreparedStatement ps=coon.createPreparedStatement(sql); * ps.setObject(1,xxx); ps.setObject(2,xxx); ps.setObject(3,xxx); * ps.setObject(4,xxx); ... ps.setObject(5,xxx); * * 將數據保存到數據庫的方法 */ @Override public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType JdbcType) throws SQLException { // 1.處理自定義的類型數據 StringBuilder sb = new StringBuilder(); for (String s : parameter) { sb.append(s + ";"); String msg = sb.toString(); if (msg.contains(";")) { msg = msg.substring(0, msg.lastIndexOf(";")); } // 設置佔位符對應的參數 ps.setString(i, msg); } } /** * ps.executeQuery() While(rs.next){ a;b;c rs.Object(colnmnIndex) } */ @Override public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { String msg = rs.getString(columnName); return Arrays.asList(msg.split(";")); } @Override public List<String> getNullableResult(ResultSet rs, int colnmnIndex) throws SQLException { String msg = rs.getString(colnmnIndex); return Arrays.asList(msg.split(";")); } @Override public List<String> getNullableResult(CallableStatement cs, int colnmnIndex) throws SQLException { // TODO Auto-generated method stub return null; } }
<!-- 綁定自定義的類型處理器 --> <typeHandlers> <typeHandler handler="com.sxt.typehandler.MytypeHandler"/> </typeHandlers>
private Integer id; private String name; private List<String> games;
@Test public void test2() { SqlSession session = Dbutils.getsession(); IStudentDao dao = session.getMapper(IStudentDao.class); Student s=new Student(); s.setName("wo"); s.setGames(Arrays.asList("a","b","c")); int i = dao.insert(s); System.out.println(i); session.commit(); session.close(); } @Test public void test3() { SqlSession session = Dbutils.getsession(); IStudentDao dao = session.getMapper(IStudentDao.class); List<Student> list = dao.query(); for (Student student : list) { System.out.println(student); } }