Mybatis配置之typeAlias标签的用法
作者:匍匐-菜鸟 发布时间:2023-11-27 20:18:20
标签:Mybatis,typeAlias,标签
Mybatis typeAlias标签
在实际的工程之中,类的全限定名称很长,当我们需要大量使用的时候,这非常不方便的,然而mybatis提供了typeAlias别名标签供我们别名和自定义别名,然而在mybatis之中别名的注册实际上由TypeAliasRegistry去定义,需要非常注意的是,在mybatis中名不区分大小写的,这一点非常重要。
下面展示了mybatis自己自动初始化了一些别名:
那么他是如何实现初始化别名的呢?
一般的是通过Configuration获取TypeAliasRegistry类对象其中有一个getTypeAliasRegisry方法获取别名,获取之后就可以通过registerAlias方法对别名注册了。
事实上Configuration对象也对一些常用的配置项配置了别名:
public class TypeAliasRegistry {
//使用的HashMap来传记录,String为键或者属性名称,Class<?>则为键值或者为
//属性值。
private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();
/*
* TypeAliasRegistry主要进行初始化别名的配置,
*/
public TypeAliasRegistry() {
/*
* 初始化别名
* e.g. 调用registerAlias方法注册别名
*
*/
registerAlias("string", String.class);
registerAlias("byte", Byte.class);
registerAlias("long", Long.class);
registerAlias("short", Short.class);
registerAlias("int", Integer.class);
registerAlias("integer", Integer.class);
registerAlias("double", Double.class);
registerAlias("float", Float.class);
registerAlias("boolean", Boolean.class);
registerAlias("byte[]", Byte[].class);
registerAlias("long[]", Long[].class);
registerAlias("short[]", Short[].class);
registerAlias("int[]", Integer[].class);
registerAlias("integer[]", Integer[].class);
registerAlias("double[]", Double[].class);
registerAlias("float[]", Float[].class);
registerAlias("boolean[]", Boolean[].class);
registerAlias("_byte", byte.class);
registerAlias("_long", long.class);
registerAlias("_short", short.class);
registerAlias("_int", int.class);
registerAlias("_integer", int.class);
registerAlias("_double", double.class);
registerAlias("_float", float.class);
registerAlias("_boolean", boolean.class);
registerAlias("_byte[]", byte[].class);
registerAlias("_long[]", long[].class);
registerAlias("_short[]", short[].class);
registerAlias("_int[]", int[].class);
registerAlias("_integer[]", int[].class);
registerAlias("_double[]", double[].class);
registerAlias("_float[]", float[].class);
registerAlias("_boolean[]", boolean[].class);
registerAlias("date", Date.class);
registerAlias("decimal", BigDecimal.class);
registerAlias("bigdecimal", BigDecimal.class);
registerAlias("biginteger", BigInteger.class);
registerAlias("object", Object.class);
registerAlias("date[]", Date[].class);
registerAlias("decimal[]", BigDecimal[].class);
registerAlias("bigdecimal[]", BigDecimal[].class);
registerAlias("biginteger[]", BigInteger[].class);
registerAlias("object[]", Object[].class);
registerAlias("map", Map.class);
registerAlias("hashmap", HashMap.class);
registerAlias("list", List.class);
registerAlias("arraylist", ArrayList.class);
registerAlias("collection", Collection.class);
registerAlias("iterator", Iterator.class);
registerAlias("ResultSet", ResultSet.class);
}
@SuppressWarnings("unchecked")
// throws class cast exception as well if types cannot be assigned
public <T> Class<T> resolveAlias(String string) {
try {
if (string == null) {
return null;
}
// issue #748
String key = string.toLowerCase(Locale.ENGLISH);
Class<T> value;
if (TYPE_ALIASES.containsKey(key)) {
value = (Class<T>) TYPE_ALIASES.get(key);
} else {
value = (Class<T>) Resources.classForName(string);
}
return value;
} catch (ClassNotFoundException e) {
throw new TypeException("Could not resolve type alias '" + string + "'. Cause: " + e, e);
}
}
/*
* registerAlias方法输入参数为包的路径名称,并且其要注册的对应的类
* 既可以仅通过包的完整名称进行注册,也可以通过提供包名和对应的类的注册
* 类型。
* 方法1,通过提供包名称进行注册,默认的注册为Object类
*/
public void registerAliases(String packageName){
registerAliases(packageName, Object.class);
}
/*
* ResolverUtil用于定位,某一个类的路径,可满足任意条件类。两个最常见的条件是
* 一个类实现/继承另一个类,或者用一个特定的注释注释它。但是,通过使用测试类,
* 可以使用任意条件进行搜索。
* 类加载器是用于定位所有位置(目录和JAR文件)在类路径中包含在一定的包装类,
* 然后加载这些类和检查。默认情况下,类加载器使用的的线程可以由currentthread()。
* getcontextclassloader()获取其名称, 但这可以通过调用setclassloader(ClassLoader)
* 方法重写
*/
/*
* 方法2:主要是利用ResolverUtil对提供的超类,和包名方式进行注册
*/
public void registerAliases(String packageName, Class<?> superType){
ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
for(Class<?> type : typeSet){
// Ignore inner classes and interfaces (including package-info.java)
// Skip also inner classes. See issue #6
//判断是否为匿名类或者是接口,成员类即类中的嵌套类,是的话不注册
if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
registerAlias(type);
}
}
}
/*
* 方法3,仅提供注册类型
*/
public void registerAlias(Class<?> type) {
String alias = type.getSimpleName();
Alias aliasAnnotation = type.getAnnotation(Alias.class);
if (aliasAnnotation != null) {
alias = aliasAnnotation.value();
}
registerAlias(alias, type);
}
public void registerAlias(String alias, Class<?> value) {
if (alias == null) {
throw new TypeException("The parameter alias cannot be null");
}
// issue #748
String key = alias.toLowerCase(Locale.ENGLISH);
if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {
throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + TYPE_ALIASES.get(key).getName() + "'.");
}
TYPE_ALIASES.put(key, value);
}
public void registerAlias(String alias, String value) {
try {
registerAlias(alias, Resources.classForName(value));
} catch (ClassNotFoundException e) {
throw new TypeException("Error registering type alias "+alias+" for "+value+". Cause: " + e, e);
}
}
/**
* @since 3.2.2
*/
public Map<String, Class<?>> getTypeAliases() {
return Collections.unmodifiableMap(TYPE_ALIASES);
}
}
以上是mybatis中关于别名的类,其在org.apache.ibatis.type包里面,还要注意某些已经注册过的类别就不要重复定义了,这会引起mybatis 的运行错误,那么我们如何实现自定义别名呢,
<typeAliases>
<typeAlias alias="role" type="com.*.类名">
</typeAliases>
这样可以定义一个别名了,如果需要很多的类需要注册时,可以使用mybatis支持的扫描别名。
<typeAliases>
<package name="com.">
</typeAliases>
这样就会扫描指定的这个包,并将这个包中的类的第一个字母变为小写字母的新名字作为别名,假如扫描的多个包中有同名称的类,这时候就会产生异常,此时我们可以在pojo类添加Alias注解。
@Alias("User2")
public class User{
····
}
这样就能够导致不同的包中出现相同的类名而导致自动扫描的别名一样造成的冲突,建议部分包名和类型名作为别名,可以有效进行区分。
Mybatis typeAlias配置
用3种方法实现typeAlias配置
1.定义别名:
<typeAliases>
<typeAlias alias="User" type="cn.lxc.vo.User" />
</typeAliases>
2.扫描包方式:
<typeAliases>
<package name="cn.lxc.vo" />
</typeAliases>
3.注解方式:
package cn.lxc.vo;
import org.apache.ibatis.type.Alias;
@Alias("User")
public class User {
private int id;
private String name;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
来源:https://blog.csdn.net/qq_18870127/article/details/79558187
0
投稿
猜你喜欢
- ImageCacheconst int _kDefaultSize = 1000;const int _kDefaultSizeBytes
- springboot配置文件中属性变量引用@@这种属性应用方式是field_name=@field_value@。两个@符号是springb
- 什么是队列结构一种线性结构,具有特殊的运算法则【只能在一端(队头)删除,在另一端(队尾)插入】。分类:顺序队列结构链式队列结构基本操作:入队
- ActiveMQ是什么ActiveMQ是消息队列技术,为解决高并发问题而生ActiveMQ生产者消费者模型(生产者和消费者可以跨平台、跨系统
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method
- 相信在做B/S模式的项目时,我们请求server端时通常遇到返回数据的处理,对返回数据的格式处理方式多样,随着JSON的流行,现在很多的项目
- 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或0
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- 前言在介绍使用微信自定义分享前,我们来先了解一下什么是自定义分享?访问自定义微信外链地址页面,点击红色框位置进行分享给朋友或者朋友圈,具体操
- 前言:封装、继承和多态是面向对象编程的三大特征。1.封装1.1.封装概念封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据
- 本文实例讲述了Android之复选框对话框用法。分享给大家供大家参考。具体如下:main.xml布局文件<?xml version=&
- Spring boot项目结合docker容器用,打了个jar包,启动的时候竟然说:no main manifest attribute,
- 在 Flutter 中使用图片是最基础能力之一。作为春节开工后的第一篇文章,17 做了精心准备,满满的都是干货!本文介绍如何在 Flutte
- 在阻塞队里中,除了对元素进行增加和删除外,我们可以把元素的删除做一个延迟的处理,即使用DelayQueue的方法。本文就来和大家聊聊Java
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 最近在做一个项目,遇到了项目打成 war 包的一个问题,项目创建时选择的时 jar 包方式,后因项目部署要求,需要打成 war 包部署,遇到
- 本文实例为大家分享了flutter实现倒计时加载页面的具体代码,供大家参考,具体内容如下效果图实现步骤1、pubspec.yaml中添加依赖
- 第一步:下载需要添加的jar包可以在maven库中查找下载,也可以在对应官网下载maven库网址:https://mvnrepository
- 井字棋游戏要求在3乘3棋盘上,每行都相同或者每列都相同再或者对角线相同,则胜出.因此我们可以使用一个二维数组来表示棋盘,判断胜负只需要判断数
- IntelliJ IDEA是广受Java开发者喜爱的工具,其商业版的价格十分昂贵,如下图:现在有机会免费获取IntelliJ IDEA的正版