mybatis resultmap 如何为对象赋值的调用顺序

MyBatis的ResultMap用于映射查询结果集中的每一行数据到Java对象上,并赋值给相应的属性字段。下面是讲解“mybatis resultmap如何为对象赋值的调用顺序”的攻略。

1. ResultMap的调用顺序

在对查询结果集进行映射时,MyBatis会按照以下的调用顺序进行:

  1. 如果存在自定义的映射方法(typeHandler)或者列为null,则直接跳过这一列的赋值。
  2. 如果映射了一个嵌套查询,则会调用查询语句并将结果映射到相应的对象属性上。
  3. 如果定义了枚举类型,会根据结果集中的值设置相应的枚举值。
  4. 如果定义了TypeHandler类型,则会使用TypeHandler对象对结果进行转换,并赋值给相应的属性。
  5. 如果使用了ResultSetHandler,会进行自动映射或构造器注入。

2. ResultMap的示例

(1)使用TypeHandler类型进行结果映射

首先,我们定义一个TypeHandler来进行类型转换。假设我们要将数据库中存储的JSON格式字符串转换成Java对象,我们可以这样实现:

public class JsonTypeHandler<T> extends BaseTypeHandler<T> {

    private final Class<T> clazz;

    public JsonTypeHandler(Class<T> clazz) {
        if (clazz == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSON.toJSONString(parameter));
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String jsonStr = rs.getString(columnName);
        return resolveJson(jsonStr);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String jsonStr = rs.getString(columnIndex);
        return resolveJson(jsonStr);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String jsonStr = cs.getString(columnIndex);
        return resolveJson(jsonStr);
    }

    @SuppressWarnings("unchecked")
    private T resolveJson(String jsonStr) {
        if (StringUtils.isBlank(jsonStr)) {
            return null;
        }
        return (T) JSON.parseObject(jsonStr, clazz);
    }
}

接下来,我们定义一个User类:

public class User {
    private Long id;
    private String name;
    private Address address;

    // 省略getter和setter方法
}

在接下来的XML配置中,我们为User类的address属性定义一个ResultMap,并指定我们自己定义的TypeHandler对其进行转换:

<resultMap id="userResult" type="User">
  <id property="id" column="id" />
  <result property="name" column="name" />
  <result property="address" column="address" typeHandler="JsonTypeHandler"/>
</resultMap>

在进行查询时,MyBatis会将查询结果集中address列的值转换成Address类型的对象,并赋值给User对象的address属性。

(2)使用构造函数注入进行结果映射

假设我们有一个User类,其中id和name属性直接与数据库列进行映射,而address属性则需要根据city和street两列构造Address对象进行赋值。我们可以这样实现:

public class User {
    private Long id;
    private String name;
    private Address address;

    public User(Long id, String name, String city, String street) {
        this.id = id;
        this.name = name;
        this.address = new Address(city, street);
    }

    // 省略getter和setter方法
}

public class Address {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    // 省略getter和setter方法
}

在XML配置中,我们使用构造注入的方式对User对象进行赋值。首先,我们定义一个元素,指定构造函数注入的参数类型和Java对象属性名:

<resultMap id="userResult" type="User">
  <!-- 先映射id和name属性 -->
  <id property="id" column="id" />
  <result property="name" column="name" />
  <!-- 再使用构造函数注入生成Address对象,并赋值给address属性 -->
  <constructor>
    <arg column="city" javaType="string" property="city"/>
    <arg column="street" javaType="string" property="street"/>
  </constructor> 
</resultMap>

在执行查询操作时,MyBatis会自动调用User类的构造函数,将city和street列映射成Address对象并赋值给User对象的address属性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis resultmap 如何为对象赋值的调用顺序 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • springboot jpa 实现返回结果自定义查询

    下面是详细讲解“springboot jpa 实现返回结果自定义查询”的完整攻略。 1. 什么是 Spring Boot JPA? Spring Boot是Spring项目中的一种用于简化配置和开发的框架。同时,它也是一个类似于Spring Data JPA的持久化框架。Spring Data JPA则是一个封装了JPA的框架,提供了许多便捷的API,使我们…

    Java 2023年5月20日
    00
  • Tomcat 与 maven 的安装与使用教程

    Tomcat 与 Maven 的安装与使用教程 Tomcat 是一个常用的 Java Web 应用程序的部署容器,Maven 是一个常用的 Java 项目构建工具,在 Java 开发中两者经常被用到。下面是 Tomcat 和 Maven 的安装及使用教程。 1. 安装 Tomcat Tomcat 的官方网站是 http://tomcat.apache.org…

    Java 2023年5月19日
    00
  • Java线程安全性的作用是什么?

    作为一个Java网站的作者,我们需要讲解Java线程安全性的作用。Java线程安全性的作用是确保在多个线程同时访问同一资源的情况下,不会发生数据错误或竞争条件。更具体地说,线程安全是指在多个线程同时执行的情况下,程序的行为仍然是正确的。在Java中,我们可以使用不同的机制来实现线程安全,包括同步方法、同步块、volatile变量和原子类等等。 其中,同步方法…

    Java 2023年5月11日
    00
  • 如何让Jackson JSON生成的数据包含的中文以unicode方式编码

    要让 Jackson JSON 生成的数据包含的中文以 unicode 方式编码,我们可以借助 Jackson 提供的 ObjectMapper 对象以及 JsonGenerator 对象,具体步骤如下: 创建 ObjectMapper 对象,并配置生成 JSON 格式的选项: ObjectMapper mapper = new ObjectMapper()…

    Java 2023年5月20日
    00
  • Spring与Struts整合之使用自动装配操作示例

    让我为您详细讲解一下“Spring与Struts整合之使用自动装配操作示例”的完整攻略。 一、整合准备 首先,我们需要准备好Spring和Struts的环境。其中,Spring的版本我使用的是5.2.2,Struts的版本是2.5.22。 接着,我们需要在Spring的配置文件中进行以下配置: <!– 开启自动扫描 –> <contex…

    Java 2023年5月20日
    00
  • Spring实战之缓存使用condition操作示例

    让我来为您详细讲解“Spring实战之缓存使用condition操作示例”的完整攻略。 1. 背景介绍 Spring Cache是Spring框架的一项优秀功能,它能够优化应用程序的性能和响应时间。通过使用Spring Cache,您可以将方法结果缓存在内存中,并在需要时直接从内存中获取缓存结果,从而避免了在每次调用方法时执行相同的计算。 2. 基本原理 S…

    Java 2023年5月19日
    00
  • JSP中的字符替换函数 str_replace() 实现!

    下面是详细的攻略。 JSP中的字符替换函数 str_replace() 实现 str_replace() 函数可以在 JSP 中轻松实现字符替换功能。 语法格式 str_replace(str, oldChar, newChar) str:必需,规定字符串。 oldChar:必需,规定要替换的字符。 newChar:必需,规定替换的新字符。 示例一 下面是一…

    Java 2023年6月15日
    00
  • JavaWeb Struts文件上传功能实现详解

    JavaWeb Struts文件上传功能实现详解 简介 本文将详细讲解如何在 JavaWeb Struts 框架中实现文件上传功能,其中包括前端页面的设计和后端逻辑的实现。 设计前端页面 前端页面是实现文件上传功能的基础。在这里,我们将使用HTML和JavaScript来设计一个简单的上传页面。 示例一:HTML 代码 <!DOCTYPE html&g…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部