MyBatis配置typeAliases(别名)详解 图片看不了?点击切换HTTP 返回上层
由于类的全限定名称很长,需要大量使用的时候,总写那么长的名称不方便。在 MyBatis 中允许定义一个简写来代表这个类,这就是别名,别名分为系统定义别名和自定义别名。
在 MyBatis 中别名由类 TypeAliasRegistry(org.apache.ibatis.type.TypeAliasRegistry)去定义。注意,在 MyBatis 中别名不区分大小写。
如果需要使用对应类型的数组型,要看其是否能支持数据,如果支持只需要使用别名加
有时候要通过代码来实现注册别名,让我们看看 MyBatis 是如何初始化这些别名的,如下所示。
所以使用 TypeAliasRegistry 的 registerAlias 方法就可以注册别名了。一般是通过 Configuration 获取 TypeAliasRegistry 类对象,其中有一个 getTypeAliasRegistry 方法可以获得别名,如 configuration.getTypeAliasRegistry()。
然后就可以通过 registerAlias 方法对别名注册了。而事实上 Configuration 对象也对一些常用的配置项配置了别名,如下所示。
这些配置为的是让我们更容易配置 MyBatis 的相关信息。以上就是 MyBatis 系统定义的别名,我们在使用的时候,不要重复命名,导致出现其他问题。
使用配置文件定义很简单:
比如 com.mybatis.po.User 这个类,MyBatis 还增加了对包 com.mybatis.po 的扫描,那么就会出现异常,这个时候可以使用 MyBatis 提供的注解 @Alias("user3")进行区分,如下所示。
这样就能够避免因为别名重名导致的扫描失败的问题。
在 MyBatis 中别名由类 TypeAliasRegistry(org.apache.ibatis.type.TypeAliasRegistry)去定义。注意,在 MyBatis 中别名不区分大小写。
系统定义别名
在 MyBatis 的初始化过程中,系统自动初始化了一些别名,如下表所示。
别名
|
Java 类型 | 是否支持数组 |
---|---|---|
_byte
|
byte | 是 |
_long
|
long | 是 |
_short
|
short | 是 |
_int
|
int | 是 |
_integer
|
int | 是 |
_double
|
double | 是 |
_float
|
float | 是 |
_boolean
|
boolean | 是 |
string
|
String | 是 |
byte
|
Byte | 是 |
long
|
Long | 是 |
short | Short | 是 |
int | Integer | 是 |
integer | Integer | 是 |
double | Double | 是 |
float | Float | 是 |
boolean | Boolean | 是 |
date | Date | 是 |
decimal | BigDecimal | 是 |
bigdecimal | BigDecimal | 是 |
object | Object | 是 |
map | Map | 否 |
hashmap | HashMap | 否 |
list | List | 否 |
arraylist | ArrayList | 否 |
collection | Collection | 否 |
iterator | Iterator | 否 |
ResultSet | ResultSet | 否 |
[]
即可,比如 _int 数组的别名就是 _int[]。而类似 list 这样不支持数组的别名,则不能那么写。有时候要通过代码来实现注册别名,让我们看看 MyBatis 是如何初始化这些别名的,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public TypeAliasRegistry() { registerAlias( "string" , String.class); registerAlias( "byte" , Byte.class); registerAlias( "long" , Long.class); ...... registerAlias( "byte[]" ,Byte[].class); registerAlias( "long[]" ,Long[].class); ...... registerAlias( "map" , Map.class); registerAlias( "hashmap" , HashMap.class); registerAlias( "list" , List.class); registerAlias( "arraylist" , ArrayList.class); registerAlias( "collection" , Collection.class); registerAlias( "iterator" , Iterator.class); registerAlias( "ResultSet" , ResultSet.class); } |
然后就可以通过 registerAlias 方法对别名注册了。而事实上 Configuration 对象也对一些常用的配置项配置了别名,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //事务方式别名 typeAliasRegistry.registerAlias( "JDBC" ,JdbcTransactionFactory.class); typeAliasRegistry.registerAlias( "MANAGED" ,ManagedTransactionFactory.class); //数据源类型别名 typeAliasRegistry.registerAlias( "JNDI" ,JndiDataSourceFactory.class); typeAliasRegistry.registerAlias( "POOLED" , PooledDataSourceFactory.class); typeAliasRegistry.registerAlias( "UNPOOLED" ,UnpooledDataSourceFactory.class); //缓存策略别名 typeAliasRegistry.registerAlias( "PERPETUAL" ,PerpetualCache.class); typeAliasRegistry.registerAlias( "FIFO" ,FifoCache.class); typeAliasRegistry.registerAlias( "LRU" ,LruCache.class); typeAliasRegistry.registerAlias( "SOFT" , SoftCache.class); typeAliasRegistry.registerAlias( "WEAK" , WeakCache.class); //数据库标识别名 typeAliasRegistry.registerAlias( "DB_VENDOR" , VendorDatabaseIdProvider.class); //语言驱动类别名 typeAliasRegistry.registerAlias( "XML" ,XMLLanguageDriver.class); typeAliasRegistry.registerAlias( "RAW" ,RawLanguageDriver.class); //日志类别名 typeAliasRegistry.registerAlias( "SLF4J" , Slf4jImpl.class); typeAliasRegistry.registerAlias( "COMMONS_LOGGTNG" ,JakartmCommonsLogginglmpl.class); typeAliasRegistry.registerAlias( "LOG4J" , Log4jImpl.class); typeAliasRegistry.registerAlias( "LOG4J2" , Log4j2Impl.class); typeAliasRegistry.registerAlias( "JDK_LOGGING" , Jdk14LoggingImpl.class); typeAliasRegistry.registerAlias( "STDOUT_LOGGING" , StdOutImpl.class); typeAliasRegistry.registerAlias( "NO_LOGGING" ,NoLoggingImpl.class); //动态代理别名 typeAliasRegistry.registerAlias( "CGLIB" ,CglibProxyFactory.class); typeAliasRegistry.registerAlias( "JAVASSIST" ,JavassistProxyFactory.class); |
自定义别名
由于现实中,特别是大型互联网系统中存在许多对象,比如用户(User)这个对象有时候需要大量重复地使用,因此 MyBatis 也提供了用户自定义别名的规则。我们可以通过 TypeAliasRegistry 类的 registerAlias 方法注册,也可以采用配置文件或者扫描方式来自定义它。使用配置文件定义很简单:
<typeAliases><!--别名-->
<typeAlias alias="role" type="com.mybatis.po.Role"/>
<typeAlias alias="role" type="com.mybatis.po.User"/>
</typeAliases>
<typeAliases><!--别名-->
<package name="com.mybatis.po"/>
</typeAliases>
比如 com.mybatis.po.User 这个类,MyBatis 还增加了对包 com.mybatis.po 的扫描,那么就会出现异常,这个时候可以使用 MyBatis 提供的注解 @Alias("user3")进行区分,如下所示。
1 2 3 4 5 | package com.mybatis.po; @Alias( "user3" ) public Class User { ...... } |