乾貨-所有MyBatis配置的詳細介紹

這一篇詳細介紹MyBatis的配置,首先看下配置XML文件的層次結構,然後詳細介紹每個配置項,說明每項的作用,值的取值與含義。

下面列出MyBatis配置XML文件的層次結構,這些層次是不能夠顛倒順序的。

                    

properties元素

  • property子元素

  • properties配置文件

  • 程序參數傳遞

property子元素

      

properties配置文件

創建一個配置文件 jdbc.properties

driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/mi-user username = root password = 123456

設置properties配置文件

程序參數傳遞

實際工作中,會遇到這種場景:系統由運維人員配置,生成數據庫的密碼對開發者是保密的,對用戶名和密碼進行了加密。可以通過程序參數傳遞的方式,先解密,再設置property。

//讀入配置文件流 InputStream cfgStream = Resources.getResourceAsStream("mybatis-config.xml"); Reader cfgReader = new InputStreamReader(cfgStream); //讀入屬性文件流 InputStream proStream = Resources.getResourceAsStream("jdbc.properties"); Reader proReader = new InputStreamReader(proStream); Properties properties = new Properties(); properties.load(proReader); //轉換為明文 properties.setProperty("username",decode(properties.getProperty("username"))); properties.setProperty("pwd",decode(properties.getProperty("pwd"))); //創建sqlSessionFactory SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(cfgReader,properties);

如果3種配置同時出現,優先級為第3種 > 第2種 > 第1種,推薦使用第2種,有特殊需求時使用第3種。

設置

設置會改變MyBatis運行時的行為,設置項很多,只會介紹常用的配置,想了解全部配置可以查看官方文檔。

  • cacheEnabled,全局地開啟或關閉配置文件中的所有映射器已經配置的任何緩存,默認為true;

  • lazyLoadingEnabled,延遲加載的全局開關,當開啟時,所有關聯對象都會延遲加載,特定關聯關係中可通過設置fetchType屬性來覆蓋該項的開關狀態,默認為false;

  • aggressiveLazyLoading,當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載,3.4.1版本之前默認為true,3.4.1之後默認為false;

  • autoMappingBehavior,指定MyBatis應如何自動映射列到字段或屬性,NONE 表示取消自動映射,PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集,FULL 會自動映射任意複雜的結果集,默認為PARTIAL;

  • autoMappingUnknownColumnBehavior,指定發現自動映射目標未知列(或者未知屬性類型)的行為,NONE: 不做任何反應,WARNING: 輸出提醒日誌,FAILING: 映射失敗,默認為NONE;

  • defaultStatementTimeout,設置超時時間,它決定驅動等待數據庫響應的秒數;

  • mapUnderscoreToCamelCase,是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射,默認為false;

  • defaultEnumTypeHandler,指定 Enum 使用的默認 TypeHandler,默認為org.apache.ibatis.type.EnumTypeHandler;

  • returnInstanceForEmptyRow,當返回行的所有列都是空時,MyBatis默認返回null。 當開啟這個設置時,MyBatis會返回一個空實例,默認為false;

  • localCacheScope,MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重複嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據,默認為SESSION;

  • logImpl,指定日誌的具體實現,比如SLF4J|LOG4J|COMMONS_LOGGING等;

別名

  

也可以通過註解方式進行,首先配置一個掃描的包,然後在類定義時添加註解@Alias("role")。

  
@Alias("role") public class Role{ }

類型處理器

MyBatis在預處理語句中設置一個參數時,或者從結果集中取出一個值時,都會用註冊了的typeHader進行處理。typeHander的作用就是將參數從javaType轉化為jdbcType,或者從數據庫取出結果時把jdbcType轉化為javaType。

系統內部已經定義了常用的類型處理器,有些情況下,需要自定義。

MyBatis也提供了枚舉類型的類型處理器,有2個轉化枚舉類型的typeHandler,EnumTypeHandler和EnumOrdinalTypeHandler,其中EnumTypeHandler是使用枚舉字符串名稱作為參數傳遞的,EnumOrdinalTypeHandler是使用整數下標作為參數傳遞的。

但這2個枚舉類型應用不那麼廣泛,更多的時候,需要自定義typeHandler進行處理。

自定義類型處理器,首先要定義類型處理類,實現TypeHandler泛型接口:

public class SexEnumTypeHandler implements TypeHandler { @Override public void setParameter(PreparedStatement ps, int i, Sex sex, JdbcType jdbcType) throws SQLException { ps.setInt(i, sex.getId()); } @Override public Sex getResult(ResultSet rs, String name) throws SQLException { return Sex.getSex(rs.getInt(name)); } @Override public Sex getResult(ResultSet rs, int id) throws SQLException { return Sex.getSex(id); } @Override public Sex getResult(CallableStatement cs, int id) throws SQLException { return Sex.getSex(cs.getInt(id)); } } 

然後註冊自定義的TypeHandler

  

最後,在定義映射器時,指定typeHandler即可

   

ObjectFactory

當MyBatis在構建一個結果返回的時候,都會使用ObjectFactory去構建POJO,在MyBatis中可以定製自己的對象工廠。一般不用配置,使用默認的DefaultObjectFactory即可。

插件plugin

插件比較複雜,後續單獨一篇文章介紹。

environments配置環境

配置環境可以註冊多個數據源,每個數據源包括基本配置和數據庫事務配置。

      

其中,transactionManager指定數據庫事務,有3種配置方法:

  • JDBC,採用JDBC方式管理事務,在獨立編碼中常常使用;

  • MANAGED,採用容器方式管理事務,在JNDI數據源中常用;

  • 自定義,由使用者自定義數據庫事務管理方法;

dataSource標籤,配置數據源連接信息,type配置對數據庫連接方式,有以下幾種:

  • UNPOOLED:非連接池數據庫;

  • POOLED:連接池數據庫;

  • JNDI:JNDI數據源;

  • 自定義數據源;

databaseIdProvider數據庫廠商標識

該屬性的作用在於指定SQL到對應的數據庫廠商提供的數據庫中運行。不常用,就不介紹了。

映射器

映射器是MyBatis最複雜、最核心的配置,包括參數類型、動態SQL、定義SQL、緩存信息等功能,上篇文章也演示了具體的例子,下篇文章會重點介紹細節。


分享到:


相關文章: