Mybatis配置之typeAlias标签的用法

Mybatis typeAlias标签

在实际的工程之中,类的全限定名称很长,当我们需要大量使用的时候,这非常不方便的,然而mybatis提供了typeAlias别名标签供我们别名和自定义别名,然而在mybatis之中别名的注册实际上由TypeAliasRegistry去定义,需要非常注意的是,在mybatis中名不区分大小写的,这一点非常重要。

下面展示了mybatis自己自动初始化了一些别名:

那么他是如何实现初始化别名的呢?

一般的是通过Configuration获取TypeAliasRegistry类对象其中有一个getTypeAliasRegisry方法获取别名,获取之后就可以通过registerAlias方法对别名注册了。

事实上Configuration对象也对一些常用的配置项配置了别名:

public class TypeAliasRegistry {

	//使用的HashMap来传记录,String为键或者属性名称,Class<?>则为键值或者为
	//属性值。
  private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();

  /*
   * TypeAliasRegistry主要进行初始化别名的配置,
   */
  public TypeAliasRegistry() {
	  /*
	   * 初始化别名
	   * e.g. 调用registerAlias方法注册别名
	   *
	   */
    registerAlias("string", String.class);
    registerAlias("byte", Byte.class);
    registerAlias("long", Long.class);
    registerAlias("short", Short.class);
    registerAlias("int", Integer.class);
    registerAlias("integer", Integer.class);
    registerAlias("double", Double.class);
    registerAlias("float", Float.class);
    registerAlias("boolean", Boolean.class);

    registerAlias("byte[]", Byte[].class);
    registerAlias("long[]", Long[].class);
    registerAlias("short[]", Short[].class);
    registerAlias("int[]", Integer[].class);
    registerAlias("integer[]", Integer[].class);
    registerAlias("double[]", Double[].class);
    registerAlias("float[]", Float[].class);
    registerAlias("boolean[]", Boolean[].class);

    registerAlias("_byte", byte.class);
    registerAlias("_long", long.class);
    registerAlias("_short", short.class);
    registerAlias("_int", int.class);
    registerAlias("_integer", int.class);
    registerAlias("_double", double.class);
    registerAlias("_float", float.class);
    registerAlias("_boolean", boolean.class);

    registerAlias("_byte[]", byte[].class);
    registerAlias("_long[]", long[].class);
    registerAlias("_short[]", short[].class);
    registerAlias("_int[]", int[].class);
    registerAlias("_integer[]", int[].class);
    registerAlias("_double[]", double[].class);
    registerAlias("_float[]", float[].class);
    registerAlias("_boolean[]", boolean[].class);

    registerAlias("date", Date.class);
    registerAlias("decimal", BigDecimal.class);
    registerAlias("bigdecimal", BigDecimal.class);
    registerAlias("biginteger", BigInteger.class);
    registerAlias("object", Object.class);

    registerAlias("date[]", Date[].class);
    registerAlias("decimal[]", BigDecimal[].class);
    registerAlias("bigdecimal[]", BigDecimal[].class);
    registerAlias("biginteger[]", BigInteger[].class);
    registerAlias("object[]", Object[].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);
  }

  @SuppressWarnings("unchecked")
  // throws class cast exception as well if types cannot be assigned
  public <T> Class<T> resolveAlias(String string) {
    try {
      if (string == null) {
        return null;
      }
      // issue #748
      String key = string.toLowerCase(Locale.ENGLISH);
      Class<T> value;
      if (TYPE_ALIASES.containsKey(key)) {
        value = (Class<T>) TYPE_ALIASES.get(key);
      } else {
        value = (Class<T>) Resources.classForName(string);
      }
      return value;
    } catch (ClassNotFoundException e) {
      throw new TypeException("Could not resolve type alias '" + string + "'.  Cause: " + e, e);
    }
  }

  /*
   * registerAlias方法输入参数为包的路径名称,并且其要注册的对应的类
   * 既可以仅通过包的完整名称进行注册,也可以通过提供包名和对应的类的注册
   * 类型。
   * 方法1,通过提供包名称进行注册,默认的注册为Object类
   */
  public void registerAliases(String packageName){
    registerAliases(packageName, Object.class);
  }

  /*
   * ResolverUtil用于定位,某一个类的路径,可满足任意条件类。两个最常见的条件是
   * 一个类实现/继承另一个类,或者用一个特定的注释注释它。但是,通过使用测试类,
   * 可以使用任意条件进行搜索。
   * 类加载器是用于定位所有位置(目录和JAR文件)在类路径中包含在一定的包装类,
   * 然后加载这些类和检查。默认情况下,类加载器使用的的线程可以由currentthread()。
   * getcontextclassloader()获取其名称, 但这可以通过调用setclassloader(ClassLoader)
   * 方法重写
   */

  /*
   * 方法2:主要是利用ResolverUtil对提供的超类,和包名方式进行注册
   */

  public void registerAliases(String packageName, Class<?> superType){
    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
    Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
    for(Class<?> type : typeSet){
      // Ignore inner classes and interfaces (including package-info.java)
      // Skip also inner classes. See issue #6
    	//判断是否为匿名类或者是接口,成员类即类中的嵌套类,是的话不注册
      if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
        registerAlias(type);
      }
    }
  }

  /*
   * 方法3,仅提供注册类型
   */
  public void registerAlias(Class<?> type) {
    String alias = type.getSimpleName();
    Alias aliasAnnotation = type.getAnnotation(Alias.class);
    if (aliasAnnotation != null) {
      alias = aliasAnnotation.value();
    }
    registerAlias(alias, type);
  }

  public void registerAlias(String alias, Class<?> value) {
    if (alias == null) {
      throw new TypeException("The parameter alias cannot be null");
    }
    // issue #748
    String key = alias.toLowerCase(Locale.ENGLISH);
    if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {
      throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + TYPE_ALIASES.get(key).getName() + "'.");
    }
    TYPE_ALIASES.put(key, value);
  }

  public void registerAlias(String alias, String value) {
    try {
      registerAlias(alias, Resources.classForName(value));
    } catch (ClassNotFoundException e) {
      throw new TypeException("Error registering type alias "+alias+" for "+value+". Cause: " + e, e);
    }
  }

  /**
   * @since 3.2.2
   */
  public Map<String, Class<?>> getTypeAliases() {
    return Collections.unmodifiableMap(TYPE_ALIASES);
  }
}

以上是mybatis中关于别名的类,其在org.apache.ibatis.type包里面,还要注意某些已经注册过的类别就不要重复定义了,这会引起mybatis 的运行错误,那么我们如何实现自定义别名呢,

<typeAliases>
         <typeAlias alias="role" type="com.*.类名">
</typeAliases>

这样可以定义一个别名了,如果需要很多的类需要注册时,可以使用mybatis支持的扫描别名。

<typeAliases>
         <package name="com.">
</typeAliases>

这样就会扫描指定的这个包,并将这个包中的类的第一个字母变为小写字母的新名字作为别名,假如扫描的多个包中有同名称的类,这时候就会产生异常,此时我们可以在pojo类添加Alias注解。

@Alias("User2")
public class User{
      ····
}

这样就能够导致不同的包中出现相同的类名而导致自动扫描的别名一样造成的冲突,建议部分包名和类型名作为别名,可以有效进行区分。

Mybatis typeAlias配置

用3种方法实现typeAlias配置

1.定义别名:

<typeAliases>
     <typeAlias alias="User" type="cn.lxc.vo.User" />
</typeAliases>

2.扫描包方式:

<typeAliases>
     <package name="cn.lxc.vo" />
</typeAliases>

3.注解方式:

package cn.lxc.vo;
import org.apache.ibatis.type.Alias;
@Alias("User")
public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis中typeAliases的使用

    最近写接口的时候,关于返回值resultType="com.whiteme.po.User"之类的东西想来觉得有简化的方法,再看看一些代码发现果然有,于是写了这篇博客记录一下,这样的好处可能是以后包名换了比较好改(虽然可能性低),但是他解决了写全路径的问题,简化开发  typeAliases 单个定义 <typeAliases> <typeAlias alias="users" type="com.whiteme.po.Users&quo

  • 详解MyBatis配置typeAliases的方法

    0x00:前言参考 之前的<MyBatis 中 SqlMapConfig 配置文件详解>记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 typeAliases 标签的详细使用. 0x01:标签介绍 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声明该类型的全路径,java.lang.String,或者 cn

  • 关于MyBaties的基本配置标签总结

    MyBaties的基本配置标签 1-全局配置文件(xxx.properties)引入的两种方式 resource:引入类路径下的资源 url:引入网络路径或磁盘路径下的资源 <properties resource="dbconfig.properties"></properties> 2-settings包含设置项 name:配置项 value:属性值 <settings> <setting name="mapUnderscoreT

  • mybatis typeAliases 给实体类起别名的方法

    typeAliases 在我们开发中,Mapper中的实体类每次都要写上包名,是不是特别的麻烦 针对这一现象,myabtis提供了解决方案,简化开发 typeAliases标签 第一种用法 在主配置文件中 配置[不是映射文件,而是主配置文件] <typeAliases> <!--type:实体类的具体全限定类名, alias:别名--> <typeAlias type="com.yixuexi.entity.User" alias="User&q

  • Mybatis配置之typeAlias标签的用法

    Mybatis typeAlias标签 在实际的工程之中,类的全限定名称很长,当我们需要大量使用的时候,这非常不方便的,然而mybatis提供了typeAlias别名标签供我们别名和自定义别名,然而在mybatis之中别名的注册实际上由TypeAliasRegistry去定义,需要非常注意的是,在mybatis中名不区分大小写的,这一点非常重要. 下面展示了mybatis自己自动初始化了一些别名: 那么他是如何实现初始化别名的呢? 一般的是通过Configuration获取TypeAliasRe

  • Mybatis配置之properties和settings标签的用法

    Mybatis properties标签和settings标签 本次将讲述mybatis的配置,主要的配置是基于mybatis的配置文件来进行配置的,其配置文件并不复杂 如下面的例子: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://my

  • MyBatis动态SQL标签的用法详解

    1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

  • Java Mybatis框架增删查改与核心配置详解流程与用法

    目录 Mybatis简介 Mybatis开发步骤: Mybatis的映射文件概述 Mybatis的增删改查操作 MyBatis的核心配置文件概述 MyBatis核心配置文件层级关系 MyBatis常用配置解析 Mybatis相应API 原始JDBC操作 原始jdbc操作(查询数据) 原始jdbc操作(插入数据) 原始jdbc操作的分析原始jdbc开发存在的问题如下: ①数据库连接创建.释放频繁造成系统资源浪费从而影响系统性能 ②sql 语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可

  • MyBatis动态Sql之if标签的用法详解

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景: 1.根据查询条件实现动态查询 2.根据参数值实现动态更新某些列 3.根据参数值实现动态插入某些列 1. 使用if标签实现动态查询 假设有这样1个需求:根据用户的输入条件来查询用户列表,如果输入了用户名,就根据用户名模糊查询,如果输入了邮箱,就根据邮箱精确查询,如果同时输入了

  • mybatis中sql语句CDATA标签的用法说明

    sql语句CDATA标签的用法 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&" 是非法的: "<" 会产生错误,因为解析器会把该字符解释为新元素的开始: "&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始: 在mapper文件中写sql语句时,遇到特殊字符时,如:"<&

  • Mybatis配置映射文件中parameterType的用法讲解

    目录 Mybatis配置映射文件parameterType用法 1.基本数据类型 2.复杂数据类型:包含java实体类,map Mybatis parameterType # $符号的注意事项 Mybatis配置映射文件parameterType用法 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数类型即可.parameterType有基

  • MyBatis的 config.xml标签

    <?xml version="1.0" encoding="UTF-8" ?> <configuration><!-- 配置 --> <!-- <properties resource="XXXXXX.properties" /> 或者使用properties配置文件 读取顺序优先级次之 读取顺序参数传递优先级最低 --> <properties><!-- 属性 --&

  • MyBatis学习教程(三)-MyBatis配置优化

    一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="." encoding="UTF-"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config .//EN" "http://mybatis.org/dtd/mybatis--

随机推荐