Mybatis配置之別名配置元素詳述
阿新 • • 發佈:2019-02-12
在前面的文章<>,我們講述了<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 |
如果想了解我最新的博文,請關注我的部落格,謝謝。
如果想看到更多相關技術文章並願意支援我繼續寫下去,歡迎給我打賞,對您的打賞我表示感謝。