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类,我在配置文件中是这样配置的:
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别名的更多相关文章
- Mybatis 全局配置文件中typeAliases(别名)
在具体的mapper.xml文件中,定义很多的statement,statement需要parameterType指定输入参数的类型.需要resultType指定输出结果的映射类型. 如果在指定类型时 ...
- mybatis学习七 typeAliases 别名
1. mybatis中内置的一些别名,例如Map,List,int 等常用类型 2.手动为某个类设置别名 在mybatis的全局配置文件中加如下代码 <typeAliases> <t ...
- mybatis基础,mybatis配置文件核心组件typeAliases元素
typeAliases元素,术语类型别名 类型别名是为 Java 类型设置一个短的名字.它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余 <typeAliases> & ...
- mybatis 配置之<typeAliases>别名配置元素设置
一.方式一:使用typeAlias <typeAliases> <typeAlias alias="User" type="com.**.entity. ...
- 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置
[转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...
- MyBatis的学习总结三:优化MyBatis配置文件中的配置
一.优化Mybatis配置文件conf.xml中数据库的信息 1.添加properties的配置文件,存放数据库的信息:mysql.properties具体代码: driver=com.mysql.j ...
- MyBatis系列(三) MyBatis 配置文件
一.properties 此标签的主要作用是引用配置文件,以数据源来举例. 新建mybatis-confing.properties配置文件 mybatis-confing.properties dr ...
- MyBatis学习日记(三):戏说MyBatis配置文件
properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...
- Mybatis笔记三:全局配置文件
目录 配置文件 dtd提示 properties标签(不怎么用) typeAliases 自动把下划线换成驼峰命名 配置文件 看着这个配置文件,我们将对这个配置文件进行细致的讲解 <?xml v ...
随机推荐
- VMware下CentOS6.5无法连接网络
VMware下CentOS6.5无法连接网络的主要原因就是eth0文件配置了不正确的地址 正确配置方法如下: 1.确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然 ...
- 解决div设置浮动,高度消失
给包围 浮动的层 加清除浮动样式,样式要兼容的用下面的代码.clearfix {*zoom:1; clear:both;}.clearfix:after{content:".";d ...
- python函数基础(函数的定义和调用)
函数的定义 python定义函数使用def关键字 return[表达式]语句用于退出函数,选择性的向调用方返回一个表达式,不带参数值的return语句返回none def 函数名(参数列表): 函数体 ...
- 移植 TinyLogin
下载 从 http://tinylogin.busybox.net/downloads/tinylogin1.4.tar.bz2下载 tinylogin1.4 到/tmp 目录当中,并解压. 修改 ...
- xcart-子分类/语言不显示
由于数据库的版本不同,表名会区分大小写的情况,这样就导致xcart语言相关的信息显示不出来,此时只需更改根目录下的init.php文件,如下: 改成小写的就OK了.
- html--垂直居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Sky Code
Sky Code 给出n个数,求选出4个数组合,使其gcd为1,,\(n<=10000\),每个数\(<=10000\). 解 理解1:容斥原理 注意到Mobius反演式子不好写出,于是我 ...
- 2016.8.16上午纪中初中部NOIP普及组比赛
2016.8.16上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1334 这次也翻车了,感觉比之前难多了. 辛辛苦苦改完了,太难改 ...
- 数组(Array)与 字符串(String)公用的属性与方法
数组与字符串都有很多方法,有一些方法是公用的,在这里就将数组与字符串公用的方法提取出来,方便大家的记忆 1. length 可通过str.length与arr.length分别取到字符串与数组的长度: ...
- Django项目在linux上运行
目录 前言 上传 解压 制作启动脚本 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 前言 我们在windows本地开发完Django项目后,需要把项目部署到lin ...