在前面的文章<Mybatis配置之<properties>属性配置元素详述>,我们讲述了<properties>标签元素的配置和使用方法。
在这篇文章中,我们来说说<typeAliases>标签元素,这个元素主要是用于对类型进行别名控制,具体什么意思呢?我们下面用一个示例说明,看了之后我相信你就会明白了。
这里我们贴出之前的UserDao对应的mapper文件
如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<? 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>标签元素,给实体类设置一个别名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<? 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之后,否则会出异常!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<? 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!下面跟大家说说另一种配置方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<? 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注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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文件中引用的类型别名,改为小写,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<? 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的标签下面;
1
2
3
4
|
< configuration > < typeAliases > < typeAlias type = "com.uu.bean.News" alias = "jj" /> </ typeAliases > |
修改后:
添加后在mapper的映射文件中全限定名中改为了配置的简单的别名。
第二种方式:
在代码中:
1
2
3
|
import org.apache.ibatis.type.Alias; @Alias ( "jj" ) public class News { |
在配置文件中:
1
2
3
4
|
< configuration > < typeAliases > < package name = "com.uu.bean" /> </ typeAliases > |
可以达到与配置中声名相同的效果。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://majing.blog.csdn.net/article/details/71503263