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

yizhihongxing

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日

相关文章

  • java如何获取两个日期的时间差

    获取两个日期的时间差,可以使用Java中的时间处理类,例如java.util.Date和java.time.LocalDateTime类。下面分别介绍这两种方式的具体实现方法: 使用java.util.Date类实现时间差: 代码示例: import java.text.SimpleDateFormat; import java.util.Date; pub…

    Java 2023年5月20日
    00
  • Java 执行CMD命令或执行BAT批处理方式

    下面就来详细讲解一下“Java 执行 CMD 命令或执行 BAT 批处理方式”的攻略。 1、执行 CMD 命令的示例 1.1、使用 Runtime 类执行 Java 中可以使用 Runtime 类来执行 CMD 命令或执行 BAT 批处理。下面是一个简单的示例程序,演示如何使用 Runtime 类执行 CMD 命令: import java.io.IOExc…

    Java 2023年5月23日
    00
  • webuploader+springmvc实现图片上传功能

    前提条件在使用webuploader+springmvc进行图片上传之前,需要确保以下条件已准备就绪: 服务器环境: JDK:1.8及以上; Tomcat:7.0及以上; SpringFramework:4.0.9及以上; Maven或Gradle; webuploader插件。 整体思路: 利用webuploader插件进行文件上传,前端通过ajax向服务…

    Java 2023年6月15日
    00
  • 如何实现线程安全的队列?

    以下是关于线程安全的队列的完整使用攻略: 什么是线程安全的队列? 线程安全的队列是指在线程环境下,多个线同时访问队列中的元素而会出现数据不一致或程序崩溃等问题。在线程编程中,线程安全的队列是非常重要的,因为多个线程同时访问队列,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的队列? 为实现线程安全的列,需要使用同步机制来保证多线程对队列的…

    Java 2023年5月12日
    00
  • Intellij Idea中进行Mybatis逆向工程的实现

    IntelliJ IDEA是一款功能强大的开发工具,Mybatis是一个流行的Java持久化框架。在IntelliJ IDEA中进行Mybatis逆向工程的实现可以大大提高开发效率,本文将提供详细的攻略。 1. 安装插件 在IntelliJ IDEA中使用MyBatis逆向工程需要安装插件,具体步骤如下: 打开IntelliJ IDEA,选择菜单栏的File…

    Java 2023年5月20日
    00
  • 如何使用Java Instrumentation API?

    如何使用Java Instrumentation API Java Instrumentation API是Java平台提供的一个高级工具,用于在运行时修改或监视Java应用程序的字节码。具体来说,Instrumentation API允许我们在JVM启动应用程序之前动态地修改类定义和字节码。这使得我们能够增强应用程序的功能,例如在应用程序执行过程中收集性能…

    Java 2023年5月11日
    00
  • Spring MVC中的Controller进行单元测试的实现

    在 Spring MVC 中,Controller 是处理 HTTP 请求的核心组件。为了确保 Controller 的正确性,我们需要对其进行单元测试。本文将详细讲解如何在 Spring MVC 中对 Controller 进行单元测试的实现。 1. 单元测试环境搭建 在进行单元测试之前,我们需要先搭建好测试环境。下面是一个简单的示例,演示了如何使用 JU…

    Java 2023年5月18日
    00
  • Java 异常机制Exception和自定义异常

    Java 异常机制是 Java 中非常重要的一部分,异常机制可以帮助我们区分代码执行过程中出现的不正常情况,而不是简单的让代码继续执行下去。在 Java 中异常机制主要分为 Throwable、Error 和 Exception 三个类别,其中 Throwable 是异常的父类,Error 和 Exception 继承自 Throwable 类,其中 Err…

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