当前位置:首页 > Java技术 > MyBatis配置文件(三)--typeAliases别名

MyBatis配置文件(三)--typeAliases别名

2022年09月17日 16:30:28Java技术8

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

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

作者:bug改了我
来源链接:https://www.cnblogs.com/hellowhy/p/9668096.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42702.html

标签: MyBatis
分享给朋友:

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

mybatis实战之拦截器

mybatis实战之拦截器 在服务的开发过程中,往往存在这样的需求,针对业务,实现对数据库操作语句做统一的处理。比如对某些敏感数据如用户姓名、手机号等坐脱敏处理保存和查询、对未实现权限的查询通过添加关联查询实现权限控制查询结果等等。 这时,myba...

mybatis:在springboot中的配置

## Mybatis 配置 mybatis.type-aliases-package=com.xfind.core.entity.xianyu mybatis.mapper-locations=classpath:mapper/*.xml #使全局的映射器启用或禁用缓存。 mybati...

SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释(转)

原文:https://blog.csdn.net/yijiemamin/article/details/51156189# 这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算...

springboot中配置mybatis别名该怎么写?

springboot中配置mybatis别名该怎么写?

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。 今天给大家分享的是,在springboot配置文件中,如何给mybatis实体类起别名。 在以前,我们写mybatis的时候,有一个文件为mybatis-config.xml,sql映射m...

Mybatis分页插件PageHelper的配置和使用方法

Mybatis分页插件PageHelper的配置和使用方法

http://www.cnblogs.com/kangoroo/p/7998433.html   前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。 前端...

Mybatis Generator最完整配置详解

Mybatis Generator最完整配置详解

背景 通过mybatis插件自动生成代码 MyBatis 介绍 MyBatis 是一款标准的 ORM 框架,被广泛的应用于各企业开发中。MyBatis 最早是 Apache 的一个开源项目 iBatis,2010 年这个项目由 Apache Software F...

Mybatis使用xml方式配置

Mybatis使用xml方式配置

官网地址:https://mybatis.org/mybatis-3/zh/getting-started.html 使用案例: 我们创建一个数据库叫做mybatis,在其下创建userinfo数据表,然后创建相应的字段,对应的数据库字段如下: 然后,...

Mybatis Generator配置详解

参考:http://www.jianshu.com/p/e09d2370b796          http://mbg.cndocs.tk <?xml version="1.0" encoding="UTF...

Mybatis配置

Mybatis配置

Mybatis配置文件并不复杂,它的所有元素如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Confi...

MyBatis配置下划线转驼峰

myBatis配置实现数据库字段下划线映射到java对象的驼峰式命名属性。 要实现上面的配置需要在mybatis-config.xml配置文件中添加如下设置: <?xml version="1.0" encoding="UTF-8" ?>...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。