Mybatis配置之<typeAliases>別名配置元素解析
在前面的文章<Mybatis配置之<properties>屬性配置元素詳述>,我們講述瞭<properties>標簽元素的配置和使用方法。
在這篇文章中,我們來說說<typeAliases>標簽元素,這個元素主要是用於對類型進行別名控制,具體什麼意思呢?我們下面用一個示例說明,看瞭之後我相信你就會明白瞭。
這裡我們貼出之前的UserDao對應的mapper文件
如下所示:
<?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>
從這個配置文件中,我們可以看到<select>、<insert>和<update>三個標簽元素的resultType都是User對象,需要設置這個User對象的類全限定名,即packname.classname。
我們發現一個問題,那就是這個類名,我們需要寫多次,如果要改這個類名的話,我們需要在多個地方進行修改。
很明顯,這樣配置的話很容易造成修改上的遺漏,同時也書寫上也比較麻煩。
因此,MyBatis為我們提供瞭一個簡單方便的配置方法,那就是使用<typeAliases>標簽元素,給實體類設置一個別名。
<?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> <!-- 和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>
如上所示,我們在原來的mybatis配置文件中增加瞭<typeAliases>標簽,並將com.majing.learning.mybatis.entity.User這個實體類重命名為User,然後我們在mapper配置文件中就可以如下使用瞭。
備註:這裡需要註意的是,typeAliases配置需要放置在settings之後,否則會出異常!!!
<?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>
這樣即使實體類名修改瞭,所需要修改的地方也隻有一處,便於集中管理。
也許你會有疑問,如果實體類比較多怎麼辦?還不是要配置很多實體類和別名,NO,NO,NO!下面跟大傢說說另一種配置方法。
<?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>
在這裡,我們不再使用<typeAliases>標簽下<typeAliase>,而是使用<package>標簽,表示掃描該包名下的所有類(除瞭接口和匿名內部類),如果類名上有註解,則使用註解指定的名稱作為別名,如果沒有則使用類名首字母小寫作為別名,如com.majing.learning.mybatis.entity.User這個類如果沒有設置@Alias註解,則此時會被關聯到user這個別名上。
因此,按照上面的配置,我們還需要將實體類做一下調整,如下兩種方式所示:
(1)給實體類添加@Alias註解
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; } }
(2)實體類不加註解的情況下
修改mapper文件中引用的類型別名,改為小寫,如下所示:
<?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>
最後想說,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 |
至此,關於別名的全部使用方法這裡便介紹完成瞭,是不是很簡單啊~
Mybatis別名的配置(兩種方法)
對於mapper的映射xml文件
sql語句中存在著resultType。
修改前:寫瞭接受實體類的全限定名
在mybatis的配置文件中添加
位置需要添加在configtion的標簽下面;
<configuration> <typeAliases> <typeAlias type="com.uu.bean.News" alias="jj"/> </typeAliases>
修改後:
添加後在mapper的映射文件中全限定名中改為瞭配置的簡單的別名。
第二種方式:
在代碼中:
import org.apache.ibatis.type.Alias; @Alias("jj") public class News {
在配置文件中:
<configuration> <typeAliases> <package name="com.uu.bean"/> </typeAliases>
可以達到與配置中聲名相同的效果。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Mybatis配置解析看這一篇就夠瞭
- MyBatis中基於別名typeAliases的設置
- Mybatis sqlMapConfig.xml中的mappers標簽使用
- Mybatis配置之<properties>屬性配置元素解析
- Mybatis 如何在配置文件中給實體類起別名