zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/hellowhy/p/9668096.html
Copyright © 2011-2022 走看看