typeAliases 类型别名
typeAliases 用于为 Java 类型设置简短的别名,避免在 Mapper XML 中反复书写冗长的全限定类名。
为什么需要类型别名
不使用别名时,XML 中需要写完整的类名:
XML
<select id="selectUser" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>
使用别名后,代码变得简洁:
XML
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>
内置类型别名
MyBatis 为常见 Java 类型提供了内置别名:
基本类型
| 别名 | Java 类型 |
|---|---|
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
包装类型
| 别名 | Java 类型 |
|---|---|
| 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 |
数组类型
| 别名 | Java 类型 |
|---|---|
| byte[] | _byte[] |
| long[] | _long[] |
| short[] | _short[] |
| int[] | _int[] |
| integer[] | Integer[] |
| double[] | _double[] |
| float[] | _float[] |
| boolean[] | _boolean[] |
| String[] | string[] |
自定义单个类型别名
为单个类指定别名:
XML
<typeAliases>
<typeAlias type="com.example.entity.User" alias="User"/>
<typeAlias type="com.example.entity.Order" alias="Order"/>
<typeAlias type="com.example.entity.Product" alias="Product"/>
</typeAliases>
配置后在 XML 中使用:
XML
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
包扫描自动设置别名
当实体类较多时,可以指定包名进行批量扫描:
XML
<typeAliases>
<package name="com.example.entity"/>
</typeAliases>
扫描规则:
- MyBatis 会扫描指定包下所有的类
- 自动将类名首字母小写作为别名
- 例如
User的别名为user,OrderItem的别名为orderItem
在 XML 中使用(注意是小写):
XML
<select id="selectUser" resultType="user">
SELECT * FROM user WHERE id = #{id}
</select>
@Alias 注解自定义别名
使用包扫描时,可以通过 @Alias 注解自定义别名:
Java
package com.example.entity;
import org.apache.ibatis.type.Alias;
@Alias("myUser")
public class User {
private Integer id;
private String username;
// 其他字段
}
配置包扫描:
XML
<typeAliases>
<package name="com.example.entity"/>
</typeAliases>
此时 User 的别名为 myUser 而不是默认的 user:
XML
<select id="selectUser" resultType="myUser">
SELECT * FROM user WHERE id = #{id}
</select>
多包扫描
项目结构复杂时,可以扫描多个包:
XML
<typeAliases>
<package name="com.example.entity"/>
<package name="com.example.dto"/>
<package name="com.example.vo"/>
</typeAliases>
别名大小写
MyBatis 对别名的查找是不区分大小写的:
XML
<!-- 以下三种写法均可 -->
<select id="selectUser" resultType="User">
<select id="selectUser" resultType="user">
<select id="selectUser" resultType="USER">
推荐:统一使用类名首字母小写的形式,保持代码风格一致。
别名冲突处理
当不同包下存在同名类时,包扫描会导致别名冲突:
Java
// com.example.entity.User
public class User { }
// com.example.dto.User
public class User { }
解决方式:
- 使用
@Alias注解区分 - 或者改用全限定类名
Java
@Alias("entityUser")
public class User { }
@Alias("dtoUser")
public class User { }
完整配置示例
XML
<configuration>
<typeAliases>
<!-- 单个类型别名 -->
<typeAlias type="com.example.entity.PageResult" alias="PageResult"/>
<!-- 包扫描 -->
<package name="com.example.entity"/>
<package name="com.example.dto"/>
</typeAliases>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
Mapper XML 中使用:
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- resultType 使用别名 -->
<select id="selectById" resultType="user">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- parameterType 使用别名 -->
<insert id="insert" parameterType="user">
INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>
<!-- 返回列表使用别名 -->
<select id="selectAll" resultType="list">
SELECT * FROM user
</select>
</mapper>
要点总结
- 内置别名覆盖了基本类型、包装类型、集合类型等常用类型
typeAlias可以为单个类指定别名package可以批量扫描包,默认别名为类名首字母小写@Alias注解可以覆盖默认别名- 别名查找不区分大小写,但推荐统一风格
- 多包存在同名类时,使用
@Alias或全限定类名避免冲突
📝 发现内容有误?点击此处直接编辑