Mapper.xml中的resultType与parameterType与resultMap

resultType

在 MyBatis 中,resultType 是一个在 <select>、<insert>、<update>、<delete> 这类 SQL 映射标签中使用

的属性,它指定了 SQL 查询返回结果应该被映射成的 Java 类型。该 Java 类型可以是一个简单的基础数据类型

(例如 Integer、String 等),也可以是一个复杂的 JavaBean 对象,通常用于封装多个属性的值。

目的

是让 MyBatis 知道如何将 SQL 查询得到的数据行转换成 Java 对象。MyBatis 会根据 resultType 指定的类型,

自动将结果集(ResultSet)中的列值映射到 Java 类型的相应字段或属性上。为此,Java 类型应当提供合适的

setter 方法,或者是公有字段,以便 MyBatis 可以进行值的设置。

举例:

假设你有一个简单的 Value Object 类(简称VO类),用来表示数据库查询的结果,比如:

public class UserVO {
    private Integer id;
    private String name;
    private int age;
    // getters 和 setters 方法
}
<select id="findUserById" resultType="com.myapp.UserVO">
  SELECT id, name, age FROM users WHERE id = #{id}
</select>

当上面的 SQL 被执行后,MyBatis 会为结果集中的每一行数据创建一个 UserVO 对象,并将结果集的列值填充到

这个对象的属性中:列 id 到属性 id,列 name 到属性 name,列 age 到属性 age。然后,该对象会被添加到一

个列表中(如果查询返回多行结果),最后这个列表会被作为整个 <select> 标签的查询结果返回。

总之,resultType 告诉 MyBatis 如何按照开发者的预期将 SQL 查询的原始结果转换为更易

parameterType

创建一个新的类来包装所有参数,并在 MyBatis 的 XML 映射中作为 parameterType 引用这个新类。

在 MyBatis 中,parameterType 属性用于定义 SQL 映射语句中传入参数的 Java 类型。它告诉 MyBatis 方法参

数的类型是什么,以便在执行 SQL 语句之前,MyBatis 能够准确地知道如何处理这些参数。这个属性主要用在

<insert>、<update>、<delete> 和 <select> 等映射标签中,用以指明传递给 SQL 语句的参数的数据类型。

你可以使用 parameterType 来指定单个参数的类型或者是一个对象(JavaBean 或者 Map)来包含多个参数。如

果使用对象作为参数,MyBatis 允许你在 SQL 语句中用点语法来引用对象的属性。

单个参数

当 SQL 语句需要一个简单类型(如 int、long、String 等)的参数时,可以直接指定该参数的类型作为

parameterType 的值。

举例:

<select id="selectUserById" parameterType="int"
        resultType="com.example.User">
  SELECT id, username, password, email
  FROM users
  WHERE id = #{id}
</select>

对象作为参数

当 SQL 语句需要多个参数时,通常会传递一个拥有多个字段(每个字段作为一个参数)的对象。在这种情况下,

parameterType 应该被设置为这个对象的类路径,MyBatis 会通过反射自动从对象中取出相应的属性值作为

SQL 语句的参数。

举例:

public class User {
    private Integer id;
    private String username;
    // getters 和 setters
}
<update id="updateUser" parameterType="com.example.User">
  UPDATE users
  SET username = #{username}
  WHERE id = #{id}
</update>

(UNIX_TIMESTAMP(CONVERT_TZ(NOW(), '+00:00', '+08:00')) * 1000)
-- 查看当前的时间区域
SHOW VARIABLES LIKE '%time_zone%';

-- 将时区设置为中国标准时间
SET GLOBAL time_zone = '+8:00';

为什么要使用 parameterType

  1. 类型安全:通过指定参数类型,MyBatis 能更安全地处理数据,避免类型不匹配的问题。
  2. 简化映射:MyBatis 通过 parameterType 自动识别参数属性,简化了动态 SQL 的编写。
  3. 灵活性:即使是复杂的嵌套对象,只要正确指定了 parameterType,也可以很容易地映射参数。

总之,parameterType 在告诉 MyBatis 如何处理和映射 SQL 语句中的参数方面扮演着关键角色,从而使数据库

操作更加灵活、安全和高效。

resultMap

在MyBatis中,resultMap是一种非常灵活的映射方式,用于定义如何从数据库结果集中映射到Java对象属性。它

提供了比简单类型别名(alias)更细粒度的控制,尤其适用于复杂的映射关系,例如当数据库表的列名和Java对象的

属性名不完全一致,或者需要处理复杂的类型转换时。

基本用法

在mapper.xml文件中,可以使用<resultMap>标签定义一个resultMap,如下所示:

<resultMap id="PetResultMap" type="com.example.Pet">
    <id column="pet_id" property="id" />
    <result column="pet_name" property="name" />
    <result column="pet_age" property="age" />
</resultMap>
  • id属性定义了这个resultMap的唯一标识符。
  • type属性指定了映射到的Java对象的全路径类名。
  • <id>标签映射数据库表的主键列到Java对象的属性。
  • <result>标签映射数据库表的其他列到Java对象的属性。

使用resultMap

在定义了resultMap之后,可以在select语句中通过resultMap属性引用它,如下所示:

<select id="selectPet" resultMap="PetResultMap">
    SELECT pet_id, pet_name, pet_age FROM pets
</select>

这个select语句会使用PetResultMap定义的映射规则从pets表中检索数据,并将结果集映射到com.example.Pet的实例中。

复杂映射

resultMap的强大之处在于其对复杂映射关系的支持。例如,处理一对多关系时,可以使用<collection>标签映射子对象的集合。

<resultMap id="PersonResultMap" type="Person">
    <id column="person_id" property="id" />
    <result column="person_name" property="name" />
    <collection property="pets" ofType="Pet">
        <id column="pet_id" property="id" />
        <result column="pet_name" property="name" />
    </collection>
</resultMap>

在这个例子中,<collection>标签定义了如何从结果集中提取Pet对象的集合,并将它们映射到Person对象的pets属性中。这种方式非常适合处理复杂的关联和嵌套结果集。

resultMap提供的细粒度映射和对复杂映射关系的支持,是MyBatis提供的一个强大功能,使得从数据库结果集到Java对象的映射更加灵活和准确。

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值