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 ...
随机推荐
- 适AT maven多个子项目、父项目之间的引用问题
适AT maven多个子项目.父项目之间的引用问题 在项目时用到maven管理项目,在一个就项目的基础上开发新的项目:关于子项目和父项目,子项目与子项目之间的调用问题,发现自己存在不足,以下是自己 ...
- 第十三篇:一点一滴学ibatis(二)映射文件
首先给出一个常见的映射文件局部模板 <?xml version="1.0" encoding="utf-8" ?><!DOCTYPE s ...
- 第十篇:javaScript中的JSON总结
参考网站:json中国,MDN json 一.必知基础 JSON 是JavaScript对象文字符号的一个子集,它可以自如的在JavaScript中使用.看下这个对象: var myJSONOb ...
- 初识OpenCV-Python - 009: 图像梯度
本节学习找到图像的梯度和边界.只要用到的函数为: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 1. Laplacian 和 Sobel的对比 import c ...
- Ubuntu环境下安装Scala以及安装IntelliJ Scala插件(Plugin)
一.Scala介绍 1.结合Spark处理大数据 这是Scala的一个主要应用,而且Spark也是那Scala写的. 2.Java的脚本语言版 可以直接写Scala的脚本,也可以在.sh直接使用Sc ...
- openSUSE 安装compass,mkmf.rb can't find,checking for ffi.h...extconf.rb failed
安装compass时,提示 Fetching: sass-.gem (%) Successfully installed sass- Fetching: ffi-.gem (%) Building n ...
- 数据库存含中文的json 时避免存成中文的ascii
使用json.dumps将dict转换为json时 如果包含中文 会将中文变成中文对应的ascii编码 当把这样的json存进数据库再取出之后反斜杠没有了会变成: 使用 json.dumps(x,en ...
- Android基础控件EditText
1.常用属性 <!--selectAllOnFocus 获得焦点后全选组件内所有文本内容--> <!--inputType 限制输入方式--> <!--singleLin ...
- samba初级使用记录
首先安利一下什么是samba: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在 ...
- java流对象
Java和C++都是静态类型的面向对象编程语言 stream结尾都是字节流,reader和writer结尾都是字符流 区别: 就是读写的时候一个是按字节读写,一个是按字符. 实际使用通常差不多. 在读 ...