因为类的全限定名一般包括包名,显得很长,在使用过程中不是很方便,所以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类,我在配置文件中是这样配置的:

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

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


MyBatis配置文件(三)--typeAliases别名的更多相关文章

  1. Mybatis 全局配置文件中typeAliases(别名)

    在具体的mapper.xml文件中,定义很多的statement,statement需要parameterType指定输入参数的类型.需要resultType指定输出结果的映射类型. 如果在指定类型时 ...

  2. mybatis学习七 typeAliases 别名

    1. mybatis中内置的一些别名,例如Map,List,int 等常用类型 2.手动为某个类设置别名 在mybatis的全局配置文件中加如下代码 <typeAliases> <t ...

  3. mybatis基础,mybatis配置文件核心组件typeAliases元素

    typeAliases元素,术语类型别名 类型别名是为 Java 类型设置一个短的名字.它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余 <typeAliases> & ...

  4. mybatis 配置之<typeAliases>别名配置元素设置

    一.方式一:使用typeAlias <typeAliases> <typeAlias alias="User" type="com.**.entity. ...

  5. 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    [转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...

  6. MyBatis的学习总结三:优化MyBatis配置文件中的配置

    一.优化Mybatis配置文件conf.xml中数据库的信息 1.添加properties的配置文件,存放数据库的信息:mysql.properties具体代码: driver=com.mysql.j ...

  7. MyBatis系列(三) MyBatis 配置文件

    一.properties 此标签的主要作用是引用配置文件,以数据源来举例. 新建mybatis-confing.properties配置文件 mybatis-confing.properties dr ...

  8. MyBatis学习日记(三):戏说MyBatis配置文件

    properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...

  9. Mybatis笔记三:全局配置文件

    目录 配置文件 dtd提示 properties标签(不怎么用) typeAliases 自动把下划线换成驼峰命名 配置文件 看着这个配置文件,我们将对这个配置文件进行细致的讲解 <?xml v ...

随机推荐

  1. Linux和Windows下ping命令详解

    转:http://linux.chinaitlab.com/command/829332.html 一.Linux下的ping参数 用途 发送一个回送信号请求给网络主机. 语法 ping [ -d] ...

  2. 实现客户端连接Mysql数据库服务器

    以前学习mysql的时候,都是部署在本机,这样不存在客户端主机与服务器主机连接的问题,都是直接用localhost登录就行. 今天因项目需要,我们把mysql部署在服务器上,然后客户端装了client ...

  3. c++中变量、变量名、变量地址、指针、引用等含义

    首先了解内存,内存就是一排房间,编号从0开始,0,1,2,3,4,5...... 房间里面一定要住人,新人住进去了,原来的人就走了:不管你住不住,里面都有人. 编号就是地址.里面的人就是内容,为了我们 ...

  4. 跨数据库查询——dblink

    现在本地建一个dblink Create database link create public database link DBLINKTEST (名称) connect to MGP(用户名) i ...

  5. python编码(31-01)

    以什么方式编码,就以什么方式解码! 第一种编码与解码方式: encode()编码 decode()解码 type()查看数据类型 repr()查看数据内容 s = '你好'print(type(s)) ...

  6. POJ 2187 /// 凸包入门 旋转卡壳

    题目大意: 求最远点对距离 求凸包上的最远点对 挑战263页 #include <cstdio> #include <string.h> #include <algori ...

  7. iOS逆向系列-逆向APP思路

    界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...

  8. BP 算法之一种直观的解释

    0. 前言 之前上模式识别课程的时候,老师也讲过 MLP 的 BP 算法, 但是 ppt 过得太快,只有一个大概印象.后来课下自己也尝试看了一下 stanford deep learning 的 wi ...

  9. 2016.8.18上午纪中初中部NOIP普及组比赛

    2016.8.18上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1336 翻!车!啦!好吧,那是因为大神归来. 进度: 比赛:AC ...

  10. 【转载】TCP演进简述

    TCP演进简述 http://www.cnblogs.com/fll/ 一.互联网概述 TCP,即传输控制协议,是目前网络上使用的最多的传输协议,我们知道,整个互联网的体系结构是以IP协议提供的无连接 ...