下面介紹 MyBatis 的核心配置文件 SqlMapConfig.xml 的配置實用:java
SqlMapConfig.xml 中配置的內容和順序以下:mysql
properties(屬性)、settings(配置)、typeAliases(類型別名)、typeHandlers(類型處理器)、 objectFactory(對象工廠)、plugins(插件)、sql
environments(環境集合屬性對象)
數據庫
environment(環境子屬性對象)
性能優化
transactionManager(事務管理)
mybatis
dataSource(數據源)
oracle
databaseIdProvider(數據庫ID提供者)app
1. properties(屬性)ide
SqlMapConfig.xml 能夠引用 Java 屬性文件中的配置信息,以下:
性能
在classpath 下定義 database.properties 文件
#Database configuration mysql.driver=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 mysql.username=root mysql.password=mysql oracle.driver=oracle.jdbc.driver.OracleDriver oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl oracle.username=dog oracle.password=dog
在 SqlMapConfig.xml 中引用:
<properties resource="database.properties" /> 標籤引入配置文件,${XXX} 調用配置文件中的屬性
<!-- 數據庫配置文件 --> <properties resource="database.properties" /> <!-- 配置mybatis的運行環境 --> <environments default="development"> <environment id="development"> <!-- 事務管理 --> <transactionManager type="JDBC" /> <!-- 配置數據庫鏈接池 --> <dataSource type="POOLED"> <!-- MySql DB --> <!-- <property name="driver" value="${mysql.driver}" /> <property name="url" value="${mysql.url}" /> <property name="username" value="${mysql.username}" /> <property name="password" value="${mysql.password}" /> --> <!-- Oracle DB --> <property name="driver" value="${oracle.driver}" /> <property name="url" value="${oracle.url}" /> <property name="username" value="${oracle.username}" /> <property name="password" value="${oracle.password}" /> </dataSource> </environment> </environments>
2. settings(配置)
MyBatis 的全局配置參數,全局參數的修改將會影響MyBatis的運行行爲。MyBatis會自動進行性能優化。
<settings> <setting name="" value=""/> </settings>
3. typeAliases(類型別名)
a. MyBatis 支持的別名:
別名 映射的類型
_byte byte byte Byte
_long long long Long
_short short short Short
_int int int Integer
_integer int integer Integer
_double double double Double
_float float float Float
_boolean boolean boolean Boolean
string String date Date
decimal BigDecimal bigdecimal BigDecimal
b. 自定義別名:
方法一:在SqlMapConfig.xml 中配置:
<typeAliases> <!-- 單個別名定義 --> <!-- <typeAlias type="mybatis.model.User" alias="user"/> --> <!-- 批量別名定義,掃描整個package下的類,默認別名 便是 類名(首字母小寫) --> <package name="mybatis.model"/> </typeAliases>
而後在UserMapper.xml 文件中使用別名代替原來的類路徑便可。
<select id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select>
方法二:使用註解 @Alias("user")
@Alias("user") public class User { private int userId; private String username;// 用戶姓名
4. typeHandlers(類別處理器)
類型處理器的做用是:將 Java類型和 Sql 映射文件進行映射。以下:
<select id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select>
parameterType:指定輸入參數類型爲int,即向statement 設置值
resultType:指定輸出數據類型爲自定義User,即將 ResultSet 轉爲 Java 對象
MyBatis 自帶的類型處理器基本上可以知足平常須要,不太須要單獨定義。
MyBatis 支持類型處理器:
類型處理器 | Java 類型 | JDBC 類型 |
BooleanTypeHandler | Boolean,boolean | 任何兼容的布爾值 |
ByteTypeHandler | Byte,byte | 任何兼容的數字或者字節類型 |
ShortTypeHandler | Short,short | 任何兼容的數字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的數字和整型 |
LongTypeHandler | Long,long | 任何兼容的數字或長整型 |
FloatTypeHandler | Float,float | 任何兼容的數字或單精度浮點型 |
DoubleTypeHandler | Double,double | 任何兼容的數字或雙精度浮點型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的數字或十進制小數類型 |
StringTypeHandler | String | CHAR 和 VARCHAR類型 |
ClobTypeHandler | String | CLOB 和 LONGVARCHAR類型 |
NStringTypeHandler | String | NCHAR 和 NVARCHAR類型 |
NClobTypeHandler | String | NCLOB類型 |
ByteArrayTypeHandle | byte[] | 任何兼容的字節流類型 |
BlobTypeHandler | byte[] | BLOB 和 LONGVARBINARY類型 |
DateTypeHandler | Date(java.util) | TIMESTAMP類型 |
DateOnlyTypeHandler | Date(java.util) | DATE類型 |
TimeOnlyTypeHandler | Date(java.util) | TIME類型 |
SqlTimestampTypeHandler | Timestamp(java.sql) | TIMESTAMP類型 |
SqlDataTypeHandler | Date(java.sql) | DATE類型 |
SqlTimeTypeHandler | Time(java.sql) | TIME類型 |
ObjectTypeHandler | 任意 | 其餘或未指定類型 |
EnumTypeHandler | Enumeration類型 | VARCHAR-任何兼容的字符串類型,做爲代碼存儲(而不是索引) |
5. envrionments(環境集合屬性對象)
MyBatis 能夠配置多種環境,將SQL 映射應用於多種數據庫之中。
a. 首先在 SqlMapConfig.xml 中配置多個環境
<!-- 配置mybatis的運行環境 --> <environments default="development_oracle"> <environment id="development_oracle"> <!-- 事務管理 --> <transactionManager type="JDBC" /> <!-- 配置數據庫鏈接池 --> <dataSource type="POOLED"> <!-- Oracle DB --> <property name="driver" value="${oracle.driver}" /> <property name="url" value="${oracle.url}" /> <property name="username" value="${oracle.username}" /> <property name="password" value="${oracle.password}" /> </dataSource> </environment> <environment id="development_mysql"> <!-- 事務管理 --> <transactionManager type="JDBC" /> <!-- 配置數據庫鏈接池 --> <dataSource type="POOLED"> <!-- MySql DB --> <property name="driver" value="${mysql.driver}" /> <property name="url" value="${mysql.url}" /> <property name="username" value="${mysql.username}" /> <property name="password" value="${mysql.password}" /> </dataSource> </environment> </environments>
b. 一樣的寫Sql映射和對應的Mapper接口
c. 在代碼中根據 environment 獲取SqlSessionFactory
//獲取SqlSessionFactory //environment參數:("development_oracle") SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development_oracle"); //獲取SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //指定 mapper 接口的類型,MyBatis經過動態代理的方式實現mapper接口 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(100101);
<select id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select> <select id="findUserById_mysql" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select>
public User findUserById(int userId) throws Exception; public User findUserById_mysql(int userId) throws Exception;
如上這樣作,會須要兩套 Mapper 接口(sql配置的ID 、接口名 都不相同)來針對不一樣的數據庫?如何解決?? 解決方法:利用 databaseIdProvider
6. databaseIdProvider(數據庫ID提供者)
在使用 JDBC 操做數據庫時經過 connnection.getMetaData().getDatavaseProductName() 方法能夠獲取數據庫產品信息,不一樣的數據庫能夠獲取不一樣的信息,不過獲取的信息字符串不少,這裏使用關鍵字匹配的方法將數據庫產品名稱簡化,如獲取到的數據庫產品名稱含有Oracle的則簡化爲oracle,目的是要在 UserMapper.xml 映射爲那件中指定sql用在哪一個數據庫中。例如:在 SqlMapConfig.xml 中添加
<databaseIdProvider type="DB_VENDOR"> <property name="Oracle" value="oracle"/> <property name="MySQL" value="mysql"/> </databaseIdProvider>
這樣,在寫 UserMapper.xml 映射文件的SQL時,只須要加上 databaseId 屬性,就可使用相同的Sql Id:
<select databaseId="oracle" id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select> <select databaseId="mysql" id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{userId} </select>
Mapper接口就可使用同一個
public User findUserById(int userId) throws Exception; //public User findUserById_mysql(int userId) throws Exception;
在執行時同第5點,根據 environment 獲取 SqlSessionFactory。
7. mappers (映射器)
映射器有四種指定方式:
<!-- mapper Config,指定sql映射文件 --> <mappers> <!-- 使用相對路徑的資源 --> <!-- <mapper resource="UserMapper.xml"/> --> <!-- 使用徹底限定路徑 --> <!-- <mapper url="file:///D:\LeoWorkspace\mybatis\mapperConfig\UserMapper.xml"/> --> <!-- 使用 mapper 接口類路徑 :要求 mapper 接口名和 mapper映射文件名 相同,且放在同一個目錄下 --> <!-- <mapper class="mybatis.mapper.UserMapper"/> --> <!-- 經過 package 指定掃描 mapper 包的路徑,MyBatis 自動將此包下的 mapper 接口與 mapper 映射文件對應 :要求 mapper 接口名和 mapper映射文件名 相同,且放在 同一個目錄下--> <package name="mybatis.mapper"/> </mappers>