MyBatis 之 SqlMapConfig.xml 配置

下面介紹 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>
相關文章
相關標籤/搜索