摘要:介绍MyBatis 中 type-aliases-package 属性的作用。在Spring Boot项目中,使用属性type-aliases-package为MyBatis引用的实体类自定义别名,避免使用又长又臭的完全限定名。
综述
用过mybatis的客官应该都知道,无论是使用resultType映射查询到的结果集到一个实体类,还是使用parameterType基于Java Bean为SQL脚本传参,都需要使用完全限定名(包名+类名)来指定引用了哪个Java Bean,否则启动时会抛异常,提示找不到类。
但是有些包名很长的,每次配置完全限定名就会显得很长很麻烦,如下:
<select id="getUser" resultType="com.wiener.study.pojo.User" parameterType="int">
</select>
我们可以通过type-aliases-package定义一个全限定名的别名来解决这个问题。
设置类的别名
设置别名只需要在application.properties(yml)中指定别名扫描路径即可:
mybatis:
type-aliases-package: com.wiener.demo.study.pojo # 具体到User类所在的目录
项目启动的时候,mybatis会自动扫描指定包及其子包下的所有实体类并将别名装配到上下文中,默认别名是类名和类名首字母小写。例如,项目包含多个模块,每个模块(例如 study)都有自己的pojo,扫描多个包可以只写到模块的父级目录:
mybatis:
type-aliases-package: com.wiener.demo # 具体到模块study所在的父级目录
加上配置之后,只要resultType引用了这个包下的实体类,就可以直接用别名来代替全限定名,如下所示:
<select id="getUser" resultType="user" parameterType="int">
</select>
类User为com.wiener.study.pojo包下的实体类,这里使用别名user即可。在上述配置的基础上,还可以通过在实体类上加入@Alias注解来进一步设置别名:
@Alias("userMsg")
@Getter
@Setter
@ToString
public class User implements Serializable {
//实现serializable接口
private static final long serialVersionUID = -2241172936329900646L;
private String id;
private String password;
private String name;
}
此时,User类的别名被重定义为userMsg,select语句更新如下:
<select id="getUser" resultType="userMsg" parameterType="int">
</select>
温馨提示:在不同包下创建类的时候,不可以有重复命名的类!