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 ...
随机推荐
- 牛客多校第四场 J Free 最短路
题意: 求最短路,但是你有k次机会可以把路径中某条边的长度变为0. 题解: 跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距 ...
- exit与return的区别
===========================PHP的解释=========================================================== return ...
- Andriod Fragment 的作用和基本用法
1.什么是Fragment: Fragment (片段)在Google Android 开发指南中的解释是:片段是Activity中的一部分,一个Activity中可以有多个Fragment.一个Fr ...
- 数据库连接JDBC
#=======================mysql============================= #jdbc.driverClassName=com.mysql.jdbc.Driv ...
- 4_6.springboot2.xWeb开发之错误处理机制
1.SpringBoot默认的错误处理机制 默认效果:1).浏览器,返回一个默认的错误页面 浏览器发送请求的请求头: 2).如果是其他客户端,默认响应一个json数据 原理: 默认情况下,Sp ...
- 最近开始学习python,学习到了关于web的内容。
然而在win10中IIS发布CGI脚本的时候遇到了各种各样的问题. 如ISAPI和CGI限制,权限限制等等,一一的百度解决了,最后又出现了 HTTP 错误 502.2 - Bad Gateway Th ...
- <数据可视化>Matplotlib(2D+3D)
1.Matplotlib介绍(2D) Matplotlib 是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式. pylab 是 matplo ...
- [Neo4j] 添加算法插件包
下载graph-algorithms-algo-xxx.jar包,我下的是3.5.3.1,放到neo4j目录的plugins文件夹下 修改 conf目录下的配置文件 neo4j.conf ,加一行: ...
- Python中else的用法
Python中else除了可以与if组成条件语句外,还可以和while .for .try一起串联使用. else和while配合使用: count=0 while count>12: if ( ...
- Android开发 SpannableString开发详解
前言 SpannableString,是google提供用来处理富文本的功能类.支持很多文本内容的效果变化.另外,它也是Android实现富文本编辑器的关键. 关键API详解 String conte ...