MyBatis四typeAliases别名

因为类的全限定名一般包括包名,显得很长,在使用过程中不是很方便,所以MyBatis中允许我们使用一种简写的方式来代替全限定名,这就是别名。这就相当于我们在玩微信的时候,有些人的昵称很长很难记,怎么办?我们给它加一个备注,方便我们快速识别,但是如果有两个相同的备注名怎么区分到底谁是谁呢,你可能会说通过头像,那再极端一点万一这俩人的头像也是一摸一样的呢?所以这就说明一个问题,别名必须是能够唯一标示一个类,否则容易引发冲突,这些问题在MyBatis的配置中都有对应的处理方式,待会会介绍。别名又分为系统别名和自定义别名,在MyBatis中别名由类TypeAliasRegistry去定义,且别名不分大小写。

一、系统定义的别名

因为别名是由TypeAliasRegistry去定义,所以我们既可以通过这个对象获取系统中已经定义好的别名,也能自定义别名,先通过一段代码来获取系统中都预定义了哪些别名。

/**
     * 获取系统别名配置
     */
    public static void getTypeAlias() {
        SqlSession sqlSession = getSqlSession();
        TypeAliasRegistry typeAliasRegistry = sqlSession.getConfiguration().getTypeAliasRegistry();
        Map<String, Class<?>> tarMap = typeAliasRegistry.getTypeAliases();
        for (String key : tarMap.keySet()) {
            System.out.println("类:"+tarMap.get(key).getSimpleName()+"====别名:"+key);
        }
    }
    
    public static void main(String[] args) {
        getTypeAlias();
    }

1⃣️首先要获取SqlSession对象sqlSession;

2⃣️通过sqlSession对象获取到Configuration对象configuration;

3⃣️通过configuration对象获取TypeAliasRegistry对象typeAliasRegistry

4⃣️通过typeAliasRegistry的getTypeAliases()方法就能获取到所有系统别名了

下面是我打印出的结果:

Date=====date
boolean=====_boolean
CglibProxyFactory=====cglib
byte[]=====_byte[]
int[]=====_int[]
Object[]=====object[]
BigDecimal[]=====decimal[]
Integer=====integer
Float=====float
PerpetualCache=====perpetual
byte=====_byte
Iterator=====iterator
BigInteger[]=====biginteger[]
XMLLanguageDriver=====xml
double=====_double
int=====_int
HashMap=====hashmap
float[]=====_float[]
SoftCache=====soft
JavassistProxyFactory=====javassist
Date[]=====date[]
BigDecimal[]=====bigdecimal[]
Slf4jImpl=====slf4j
Byte=====byte
Double=====double
ResultSet=====resultset
RawLanguageDriver=====raw
Collection=====collection
List=====list
LruCache=====lru
float=====_float
long=====_long
int=====_integer
int[]=====_integer[]
Boolean[]=====boolean[]
BigDecimal=====decimal
double[]=====_double[]
Object=====object
BigInteger=====biginteger
String=====string
Long[]=====long[]
JdbcTransactionFactory=====jdbc
Long=====long
WeakCache=====weak
NoLoggingImpl=====no_logging
UnpooledDataSourceFactory=====unpooled
PooledDataSourceFactory=====pooled
VendorDatabaseIdProvider=====db_vendor
ManagedTransactionFactory=====managed
JakartaCommonsLoggingImpl=====commons_logging
short[]=====_short[]
short=====_short
Map=====map
Log4jImpl=====log4j
Jdk14LoggingImpl=====jdk_logging
Product=====product
FifoCache=====fifo
BigDecimal=====bigdecimal
Short[]=====short[]
Integer[]=====int[]
ArrayList=====arraylist
Integer=====int
Float[]=====float[]
Log4j2Impl=====log4j2
Byte[]=====byte[]
Boolean=====boolean
StdOutImpl=====stdout_logging
Double[]=====double[]
long[]=====_long[]
JndiDataSourceFactory=====jndi
Short=====short
boolean[]=====_boolean[]
Integer[]=====integer[]

可以看到系统总共定义了73个别名,所以我们可以使用别名代替冗长的全限定名。

比如在MyBatis的映射文件中,我们设置一个sql语句的参数类型或返回类型的时候,如果这个类型是字符串,我们完全可以用string代替java.lang.String。但是这就会有一个问题,我怎么知道哪个类型的别名是什么呢?在不知道的情况下有两种方式可以知道:

1⃣️保险的方法:将系统别名打印出来,或者找官方文档查询;

2⃣️寻规律:其实从上面的结果可以发现一个规律,就是如果类名以大写开头,则只要将大写变为小写就是该类的别名;而如果类名本来就是小写,只需要在小写前面加上下划线即可。

二、自定义别名

自定义别名的方式有通过配置文件配置、通过TypeAliasRegistry的registerAlias方法注册、通过注解三种方式,一般来说使用第一种比较方便,第二种和第三种都可以用来给特定类设置,以解决别名重复的问题。

1⃣️配置文件中的typeAliases属性
<!--别名:pojo对象的别名 -->
    <typeAliases>
        <!--对类单独进行别名设置  -->
        <typeAlias alias="user" type="com.daily.pojo.User"></typeAlias>
        <typeAlias alias="product" type="com.daily.pojo.Product"></typeAlias>
        <!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
        <package name="com.daily.pojo"/>
    </typeAliases>

如代码注解中所写,有两种配置,一种是通过typeAlias子属性给每个类单独做配置,其缺点在于当有很多个类需要配置别名时就显得很麻烦,所以有了第二种配置,使用package子元素对整个包进行自动扫描,MyBatis会自动设置别名,设置规则是:将类名的第一个字母变为小写,这和我们一个一个配置的规则是一样的。但是这种方式还是存在缺陷,比如需要扫描的包有多个,其中有好几个包下面都有一个名称相同的类,那么按照上面的规则就会出现同一个别名作用在不同包的不同类上,这样在使用过程中难免引发冲突,怎么办?答案是使用后两种。

2⃣️通过TypeAliasRegistry的registerAlias方法

假设我还有一个叫做com.daily.pojo2的包,该包下也有一个User类,我在配置文件中是这样配置的:

<!--别名:pojo对象的别名 -->
   <typeAliases>
      <!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
      <package name="com.daily.pojo"/>
      <package name="com.daily.pojo2"/>
   </typeAliases>

那么扫描的时候MyBatis只会定义一个别名user,那我们在引用的时候就不知道是哪个包下的User类了,是吧?解决方法如下

这种方式跟前面获取系统配置的方式一样,都要获取到TypeAliasRegistry对象,然后用其registerAlias方法进行注册

/**
     * 总定义别名
     */
    public static void setTypeAlias() {
        SqlSession sqlSession = getSqlSession();
        TypeAliasRegistry typeAliasRegistry = sqlSession.getConfiguration().getTypeAliasRegistry();
        //代码方式配置别名
        typeAliasRegistry.registerAlias("user1",com.daily.pojo2.User.class);
    }
3⃣️通过注解

这种方式比较简单,只要在对应包下的对应类上面使用注解@Alias("别名")即可,如下:

package com.daily.pojo2;

import org.apache.ibatis.type.Alias;

@Alias("user1")
public class User {
    private Integer id;

    private String userName;

    private String pwd;

    private String sex;

    private String random;
}

个人博客
腾讯云社区
掘金
CSDN
公众号:

wx.jpg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容