面试官:Mybatis如何将数据库类型转换成Java类型?如何创建SQL返回的对象?如何起别名?

411 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一,XML配置-类型别名(typeAliases)

  类型别名是为了简化开发,我们常见的mapper文件一般都是这样的:User类是user表对应的pojo,可以看到框中的两个一个写了User类的全限定类名,另一个写的是user,这个user就是别名。如果一个映射文件中多次使用到这个实体类,那么就可以使用别名,来减少开发量以及代码的可读性。

配置别名有三种方式

  1. 使用org.apache.ibatis.type包下的注解@Alias

  1. 在核心配置文件中使用标签来配置,其中type属性是类的全限定名,alias属性是别名

  1. 在核心配置文件中使用标签来配置,其中name属性是包名,在这个包下的所有实体类默认有一个别名,别名名称默认是类名首字母消息,正如上文的user

小结:三种方式可以理解为两种,一种通过注解配置,一种通过标签配置。两种方式存在优先级的关系,注解的优先级大于标签的优先级。添加别名后,仍然可以使用类的全限定名,这是允许的。对于一些参见类型的别名可以参考官网,实际本文第一章图片中就使用了java.lang.Integer的别名int。

二,XML配置-类型处理器(typeHandlers)

  原生的JDBC中获取连接对象后的一步操作是获取预编译的实例PreparedStatement,这个时候如果sql中有占位符?时,我们需要调用setString之类的方法为占位符赋值(见下图)。还有在获取结果集时也是一样。这些处理在Mybatis中是使用用类型处理器将获取到的值以合适的方式转换成 Java 类型。

  Mybatis常见的类型处理器可参考官网类型处理器,如果Mybatis的类型处理器不满足你的需求,可以自定义类型处理器,有两种方式:

  1. 实现org.apache.ibatis.type.TypeHandler接口
  2. 继承org.apache.ibatis.type.BaseTypeHandler类

小结:Mybatis提供的类型处理器非常的完善,基本能满足99%的开发场景,所以一般实际开发中我们是不需要自定义类型处理器的。

三,XML配置-对象工厂(objectFactory)

  对象工厂是Mybatis的一个默认工厂类,类名是DefaultObjectFactory,这个类的作用是实例化目标类。实例化方式有两种:1. 默认使用无参构造;2.通过存在的参数映射来调用带有参数的构造方法。与类型处理器是一样的,我们同样可以继承默认工厂类来规定自己的初始化逻辑。

public class ExampleObjectFactory extends DefaultObjectFactory {
  public Object create(Class type) {
    return super.create(type);
  }
  public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
    return super.create(type, constructorArgTypes, constructorArgs);
  }
  public void setProperties(Properties properties) {
    super.setProperties(properties);
  }
  public <T> boolean isCollection(Class<T> type) {
    return Collection.class.isAssignableFrom(type);
  }}
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
  <property name="someProperty" value="100"/>
</objectFactory>

ObjectFactory 接口很简单,它包含两个创建实例用的方法,一个是处理默认无参构造方法的,另外一个是处理带参数的构造方法的。 另外,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
引用自Mybatis官网