Mybatis配置之<typeAliases>別名配置元素詳述

在前面的文章<Mybatis配置之<properties>屬性配置元素詳述>,我們講述了<properties>標籤元素的配置和使用方法。在這篇文章中,我們來說說<typeAliases>標籤元素,這個元素主要是用於對類型進行別名控制,具體什麼意思呢?我們下面用一個示例說明,看了之後我相信你就會明白了。


這裏我們貼出之前的UserDao對應的mapper文件,如下所示:


  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>     
  2. <!DOCTYPE mapper     
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"    
  4. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  
  5. <mapper namespace="com.majing.learning.mybatis.dao.UserDao">  
  6.   
  7.     <select id="findUserById" resultType="com.majing.learning.mybatis.entity.User">  
  8.         select * from user where id = #{id}  
  9.     </select>  
  10.       
  11.     <insert id="addUser" parameterType="com.majing.learning.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id">  
  12.         insert into user(name,password,age) values(#{name},#{password},#{age})  
  13.     </insert>  
  14.       
  15.     <delete id="deleteUser" parameterType="int">  
  16.         delete from user where id = #{id}  
  17.     </delete>  
  18.       
  19.     <update id="updateUser" parameterType="com.majing.learning.mybatis.entity.User">  
  20.         update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}  
  21.     </update>  
  22.   
  23. </mapper></span>  

從這個配置文件中,我們可以看到<select>、<insert>和<update>三個標籤元素的resultType都是User對象,需要設置這個User對象的類全限定名,即packname.classname。

我們發現一個問題,那就是這個類名,我們需要寫多次,如果要改這個類名的話,我們需要在多個地方進行修改。很明顯,這樣配置的話很容易造成修改上的遺漏,同時也書寫上也比較麻煩。因此,MyBatis爲我們提供了一個簡單方便的配置方法,那就是使用<typeAliases>標籤元素,給實體類設置一個別名。


如上所示,我們在原來的mybatis配置文件中增加了<typeAliases>標籤,並將com.majing.learning.mybatis.entity.User這個實體類重命名爲User,然後我們在mapper配置文件中就可以如下使用了。

備註:這裏需要注意的是,typeAliases配置需要放置在settings之後,否則會出異常!!!

<?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="mysql.properties">  
        <property name="username" value="root"/>  
        <property name="password" value="root"/>  
        <property name="driver" value="com.mysql.jdbc.Driver"/>  
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>  
    </properties>  
  
    <settings>  
        <setting name="logImpl" value="LOG4J" />  
    </settings>  
      
   <typeAliases>  
        <typeAlias alias="User" type="com.majing.learning.mybatis.entity.User"/>   
    </typeAliases></span>  
  
    <!-- 和spring整合後 environments配置將廢除 -->  
    <environments default="development">  
        <environment id="development">  
            <!-- 使用jdbc事務管理 -->  
            <transactionManager type="JDBC" />  
            <!-- 數據庫連接池 -->  
            <dataSource type="POOLED">  
                <property name="driver" value="${driver}" />  
                <property name="url" value="${url}" />  
                <property name="username" value="${username}" />  
                <property name="password" value="${password}" />  
            </dataSource>  
        </environment>  
    </environments>  
  
    <mappers>  
        <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />  
    </mappers>  
  
</configuration>  

  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>     
  2. <!DOCTYPE mapper     
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"    
  4. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  
  5. <mapper namespace="com.majing.learning.mybatis.dao.UserDao">  
  6.   
  7.     <select id="findUserById" resultType="User">  
  8.         select * from user where id = #{id}  
  9.     </select>  
  10.       
  11.     <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">  
  12.         insert into user(name,password,age) values(#{name},#{password},#{age})  
  13.     </insert>  
  14.       
  15.     <delete id="deleteUser" parameterType="int">  
  16.         delete from user where id = #{id}  
  17.     </delete>  
  18.       
  19.     <update id="updateUser" <span style="color:#FF0000;"><span style="color:#000000;">parameterType="User"</span></span>>  
  20.         update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}  
  21.     </update>  
  22.   
  23. </mapper></span>  

這樣即使實體類名修改了,所需要修改的地方也只有一處,便於集中管理。

也許你會有疑問,如果實體類比較多怎麼辦?還不是要配置很多實體類和別名,NO,NO,NO!下面跟大家說說另一種配置方法。

  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration    
  3.     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"    
  4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.   
  7.     <properties resource="mysql.properties">  
  8.         <property name="username" value="root"/>  
  9.         <property name="password" value="root"/>  
  10.         <property name="driver" value="com.mysql.jdbc.Driver"/>  
  11.         <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>  
  12.     </properties>  
  13.   
  14.     <settings>  
  15.         <setting name="logImpl" value="LOG4J" />  
  16.     </settings>  
  17.       
  18.     <typeAliases>  
  19.         <package name="com.majing.learning.mybatis.entity"/>  
  20.     </typeAliases>  
  21.   
  22.     <!-- 和spring整合後 environments配置將廢除 -->  
  23.     <environments default="development">  
  24.         <environment id="development">  
  25.             <!-- 使用jdbc事務管理 -->  
  26.             <transactionManager type="JDBC" />  
  27.             <!-- 數據庫連接池 -->  
  28.             <dataSource type="POOLED">  
  29.                 <property name="driver" value="${driver}" />  
  30.                 <property name="url" value="${url}" />  
  31.                 <property name="username" value="${username}" />  
  32.                 <property name="password" value="${password}" />  
  33.             </dataSource>  
  34.         </environment>  
  35.     </environments>  
  36.   
  37.     <mappers>  
  38.         <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />  
  39.     </mappers>  
  40.   
  41. </configuration></span>  

在這裏,我們不再使用<typeAliases>標籤下<typeAliase>,而是使用<package>標籤,表示掃描該包名下的所有類(除了接口和匿名內部類),如果類名上有註解,則使用註解指定的名稱作爲別名,如果沒有則使用類名首字母小寫作爲別名,如com.majing.learning.mybatis.entity.User這個類如果沒有設置@Alias註解,則此時會被關聯到user這個別名上。

因此,按照上面的配置,我們還需要將實體類做一下調整,如下兩種方式所示:

(1)給實體類添加@Alias註解

  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;">package com.majing.learning.mybatis.entity;  
  2.   
  3. import org.apache.ibatis.type.Alias;  
  4.   
  5. @Alias(value="User")  
  6. public class User {  
  7.     private int id;  
  8.     private String name;  
  9.     private String password;  
  10.     private int age;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public String getPassword() {  
  24.         return password;  
  25.     }  
  26.     public void setPassword(String password) {  
  27.         this.password = password;  
  28.     }  
  29.     @Override  
  30.     public String toString() {  
  31.         return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";  
  32.     }  
  33.     public int getAge() {  
  34.         return age;  
  35.     }  
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.   
  40.       
  41.       
  42. }  
  43. </span>  

(2)實體類不加註解的情況下,修改mapper文件中引用的類型別名,改爲小寫,如下所示:
  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>     
  2. <!DOCTYPE mapper     
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"    
  4. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  
  5. <mapper namespace="com.majing.learning.mybatis.dao.UserDao">  
  6.   
  7.     <select id="findUserById" resultType="user">  
  8.         select * from user where id = #{id}  
  9.     </select>  
  10.       
  11.     <insert id="addUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">  
  12.         insert into user(name,password,age) values(#{name},#{password},#{age})  
  13.     </insert>  
  14.       
  15.     <delete id="deleteUser" parameterType="int">  
  16.         delete from user where id = #{id}  
  17.     </delete>  
  18.       
  19.     <update id="updateUser" parameterType="user">  
  20.         update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}  
  21.     </update>  
  22.   
  23. </mapper></span>  


最後想說,mybatis爲我們已經實現了很多別名,已經爲許多常見的 Java 類型內建了相應的類型別名。它們都是大小寫不敏感的,需要注意的是由基本類型名稱重複導致的特殊處理。

別名 映射的類型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章