在前面的文章<Mybatis配置之<properties>屬性配置元素詳述>,我們講述了<properties>標籤元素的配置和使用方法。在這篇文章中,我們來說說<typeAliases>標籤元素,這個元素主要是用於對類型進行別名控制,具體什麼意思呢?我們下面用一個示例說明,看了之後我相信你就會明白了。
這裏我們貼出之前的UserDao對應的mapper文件,如下所示:
- <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
- <mapper namespace="com.majing.learning.mybatis.dao.UserDao">
- <select id="findUserById" resultType="com.majing.learning.mybatis.entity.User">
- select * from user where id = #{id}
- </select>
- <insert id="addUser" parameterType="com.majing.learning.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id">
- insert into user(name,password,age) values(#{name},#{password},#{age})
- </insert>
- <delete id="deleteUser" parameterType="int">
- delete from user where id = #{id}
- </delete>
- <update id="updateUser" parameterType="com.majing.learning.mybatis.entity.User">
- update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
- </update>
- </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>
- <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
- <mapper namespace="com.majing.learning.mybatis.dao.UserDao">
- <select id="findUserById" resultType="User">
- select * from user where id = #{id}
- </select>
- <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
- insert into user(name,password,age) values(#{name},#{password},#{age})
- </insert>
- <delete id="deleteUser" parameterType="int">
- delete from user where id = #{id}
- </delete>
- <update id="updateUser" <span style="color:#FF0000;"><span style="color:#000000;">parameterType="User"</span></span>>
- update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
- </update>
- </mapper></span>
這樣即使實體類名修改了,所需要修改的地方也只有一處,便於集中管理。
也許你會有疑問,如果實體類比較多怎麼辦?還不是要配置很多實體類和別名,NO,NO,NO!下面跟大家說說另一種配置方法。
- <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?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>
- <package name="com.majing.learning.mybatis.entity"/>
- </typeAliases>
- <!-- 和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></span>
在這裏,我們不再使用<typeAliases>標籤下<typeAliase>,而是使用<package>標籤,表示掃描該包名下的所有類(除了接口和匿名內部類),如果類名上有註解,則使用註解指定的名稱作爲別名,如果沒有則使用類名首字母小寫作爲別名,如com.majing.learning.mybatis.entity.User這個類如果沒有設置@Alias註解,則此時會被關聯到user這個別名上。
因此,按照上面的配置,我們還需要將實體類做一下調整,如下兩種方式所示:
(1)給實體類添加@Alias註解
- <span style="font-family:'KaiTi_GB2312';font-size:18px;">package com.majing.learning.mybatis.entity;
- import org.apache.ibatis.type.Alias;
- @Alias(value="User")
- public class User {
- private int id;
- private String name;
- private String password;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
- </span>
(2)實體類不加註解的情況下,修改mapper文件中引用的類型別名,改爲小寫,如下所示:
- <span style="font-family:'KaiTi_GB2312';font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
- <mapper namespace="com.majing.learning.mybatis.dao.UserDao">
- <select id="findUserById" resultType="user">
- select * from user where id = #{id}
- </select>
- <insert id="addUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
- insert into user(name,password,age) values(#{name},#{password},#{age})
- </insert>
- <delete id="deleteUser" parameterType="int">
- delete from user where id = #{id}
- </delete>
- <update id="updateUser" parameterType="user">
- update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
- </update>
- </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 |