• MyBatis配置文件(三)--typeAliases别名


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

    一、系统定义的别名

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

     1 /**
     2      * 获取系统别名配置
     3      */
     4     public static void getTypeAlias() {
     5         SqlSession sqlSession = getSqlSession();
     6         TypeAliasRegistry typeAliasRegistry = sqlSession.getConfiguration().getTypeAliasRegistry();
     7         Map<String, Class<?>> tarMap = typeAliasRegistry.getTypeAliases();
     8         for (String key : tarMap.keySet()) {
     9             System.out.println("类:"+tarMap.get(key).getSimpleName()+"====别名:"+key);
    10         }
    11     }
    12     
    13     public static void main(String[] args) {
    14         getTypeAlias();
    15     }

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

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

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

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

    下面是我打印出的结果:

     1 Date=====date
     2 boolean=====_boolean
     3 CglibProxyFactory=====cglib
     4 byte[]=====_byte[]
     5 int[]=====_int[]
     6 Object[]=====object[]
     7 BigDecimal[]=====decimal[]
     8 Integer=====integer
     9 Float=====float
    10 PerpetualCache=====perpetual
    11 byte=====_byte
    12 Iterator=====iterator
    13 BigInteger[]=====biginteger[]
    14 XMLLanguageDriver=====xml
    15 double=====_double
    16 int=====_int
    17 HashMap=====hashmap
    18 float[]=====_float[]
    19 SoftCache=====soft
    20 JavassistProxyFactory=====javassist
    21 Date[]=====date[]
    22 BigDecimal[]=====bigdecimal[]
    23 Slf4jImpl=====slf4j
    24 Byte=====byte
    25 Double=====double
    26 ResultSet=====resultset
    27 RawLanguageDriver=====raw
    28 Collection=====collection
    29 List=====list
    30 LruCache=====lru
    31 float=====_float
    32 long=====_long
    33 int=====_integer
    34 int[]=====_integer[]
    35 Boolean[]=====boolean[]
    36 BigDecimal=====decimal
    37 double[]=====_double[]
    38 Object=====object
    39 BigInteger=====biginteger
    40 String=====string
    41 Long[]=====long[]
    42 JdbcTransactionFactory=====jdbc
    43 Long=====long
    44 WeakCache=====weak
    45 NoLoggingImpl=====no_logging
    46 UnpooledDataSourceFactory=====unpooled
    47 PooledDataSourceFactory=====pooled
    48 VendorDatabaseIdProvider=====db_vendor
    49 ManagedTransactionFactory=====managed
    50 JakartaCommonsLoggingImpl=====commons_logging
    51 short[]=====_short[]
    52 short=====_short
    53 Map=====map
    54 Log4jImpl=====log4j
    55 Jdk14LoggingImpl=====jdk_logging
    56 Product=====product
    57 FifoCache=====fifo
    58 BigDecimal=====bigdecimal
    59 Short[]=====short[]
    60 Integer[]=====int[]
    61 ArrayList=====arraylist
    62 Integer=====int
    63 Float[]=====float[]
    64 Log4j2Impl=====log4j2
    65 Byte[]=====byte[]
    66 Boolean=====boolean
    67 StdOutImpl=====stdout_logging
    68 Double[]=====double[]
    69 long[]=====_long[]
    70 JndiDataSourceFactory=====jndi
    71 Short=====short
    72 boolean[]=====_boolean[]
    73 Integer[]=====integer[]

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

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

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

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

    二、自定义别名

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

    1⃣️配置文件中的typeAliases属性

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

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

    2⃣️通过TypeAliasRegistry的registerAlias方法

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

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

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

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

    1 /**
    2      * 总定义别名
    3      */
    4     public static void setTypeAlias() {
    5         SqlSession sqlSession = getSqlSession();
    6         TypeAliasRegistry typeAliasRegistry = sqlSession.getConfiguration().getTypeAliasRegistry();
    7         //代码方式配置别名
    8         typeAliasRegistry.registerAlias("user1",com.daily.pojo2.User.class);
    9     }

    3⃣️通过注解

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

     1 package com.daily.pojo2;
     2 
     3 import org.apache.ibatis.type.Alias;
     4 
     5 @Alias("user1")
     6 public class User {
     7     private Integer id;
     8 
     9     private String userName;
    10 
    11     private String pwd;
    12 
    13     private String sex;
    14 
    15     private String random;
    16

    以上就是自定义别名的方式,注意,当解决冲突的时候,别名要区分于另一个同名类的别名哦!!!

  • 相关阅读:
    window10+python3.7安装tensorflow--gpu tensorflow 安装
    解决plsql中文显示问号(???)问题
    卷积神经网络通俗解读
    NLP进阶之(七)膨胀卷积神经网络
    如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?
    【Learning Notes】线性链条件随机场(CRF)原理及实现
    【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
    条件随机场(CRF)
    条件随机场(CRF)
    条件随机场(CRF)
  • 原文地址:https://www.cnblogs.com/hellowhy/p/9668096.html
Copyright © 2020-2023  润新知