我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mybatis一对多查询列表属性处理示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mybatis一对多查询列表属性处理示例详解

一、说明

1.<collection>标签属性说明

  • property:指定主对象中的集合属性名称。
  • ofType:指定集合元素的类型。默认值为java.lang.Object。可以通过指定 ofType 属性来指定集合元素的类型。
  • column:指定集合元素所用的列名,用于匹配结果集中的列。(内层select关联字段,若不指定则默认使用外键对应的主键作为column属性的值)
  • columnPrefix: 指定集合元素所用的列名前缀,用于匹配结果集中的列。(用于平铺查询方式下内层列映射自动匹配)
  • select:指定获取集合元素的 SQL 查询语句。
  • resultSetType:指定 SQL 查询结果集的类型,默认值为FORWARD_ONLY,还可以设置为SCROLL_SENSITIVE和SCROLL_INSENSITIVE,具体的用法可以参考JDBC文档。
  • fetchType:指定集合的加载方式,默认值为“lazy”,可选值为“eager”,当 fetchType 属性设置为“eager”时,MyBatis会在执行 SQL 语句返回结果集后,立即加载集合元素。
  • javaType: 指定集合的 Java 类型,通常不需要指定,MyBatis会根据集合属性的类型自动推断。
  • jdbcType: 指定集合属性在数据库中的类型,可以参考 JDBC 中的类型定义。如果不指定,MyBatis会自动推断。
  • notNullColumn:指定一个或多个属性列的名称,这些列不能为空。当这些属性列为空时,MyBatis会抛出异常。notNullColumn 属性可以使用逗号(,)分隔,以指定多个属性列。
  • columnOverride:指定一个或多个元素属性与结果集中列的映射关系。
  • typeHandler:指定一个元素属性的类型处理器。
  • ofTypeHandler:指定集合元素的类型处理器。
  • resultMap:指定集合元素的映射器,通常是通过嵌套 result 标签来定义,并使用该 resultMap 的 id 来指定。
  • orderBy:指定升序或降序。多个排序条件时,用空格分开。例如orderBy="id desc,create_time asc"表示先按id降序,再按createTime升序排列。(不推荐使用,建议在SQL中手动指定排序方式)
  • notNullColumn:指定一个或多个属性列的名称,这些列不能为空。当这些属性列为空时,MyBatis会抛出异常。notNullColumn 属性可以使用逗号(,)分隔,以指定多个属性列。
  • statementType:指定操作执行的SQL类型,有STATEMENT,PREPARED和CALLABLE三种,分别代表简单语句、预处理语句和调用存储过程。默认值为PREPARED。

columnPrefix用法

如果使用了 columnPrefix 属性,可以省略 result 标签中的 column 属性,并且 MyBatis 会自动完成属性与列名之间的映射。

<resultMap id="userResultMap" type="User">
  <id column="user_id" property="id"/>
  <result column="user_name" property="name"/>
  <collection property="roles" ofType="Role">
    <id column="role_id" property="id"/>
    <result column="role_name" property="name"/>
  </collection>
</resultMap>

改用columnPrefix前缀写法简化代码,使用使用时,多使用表别名作为列前缀,例如columnPrefix="r."

<resultMap id="userResultMap" type="User">
  <id column="user_id" property="id"/>
  <result column="user_name" property="name"/>
  <collection property="roles" ofType="Role" columnPrefix="role_">
    <id column="role_id" property="id"/>
    <result property="name"/>
  </collection>
</resultMap>

mybatis 官方文档

2. 示例代码

实体类

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private List<Order> orders;

    // 省略 getter 和 setter 方法
}

public class Order {
    private Integer id;
    private String orderNo;
    private Date createTime;

    // 省略 getter 和 setter 方法
}

二、平铺查询

可结合columnPrefixresultMap使用

Mybatis XML

<select id="getUserOrdersById" resultMap="userResultMap">
  SELECT u.id, u.name, u.age, o.id AS order_id, o.order_no, o.create_time
  FROM user u
  INNER JOIN `order` o ON u.id = o.user_id
  WHERE u.id = #{id}
</select>
<resultMap id="userResultMap" type="com.example.User">
  <id property="id" column="id" />
  <result property="name" column="name" />
  <result property="age" column="age" />
  <collection property="orders" ofType="com.example.Order" resultMap="orderResultMap" />
</resultMap>
<resultMap id="orderResultMap" type="com.example.Order">
  <id property="id" column="order_id" />
  <result property="orderNo" column="order_no" />
  <result property="createTime" column="create_time" />
</resultMap>

三、 嵌套查询(Nested Select for Collection)

嵌套查询支持惰性加载,可通过设置fetchType调整集合加载方式,默认值为“lazy”,可选值为“eager”。

3.1 外键查询

<select id="getUserOrdersById" resultMap="userResultMap">
  SELECT u.id, u.name, u.age
  FROM user u
  WHERE u.id = #{id}
</select>
<select id="getOrderByUserId" resultMap="orderResultMap">
  SELECT o.id, o.order_no, o.create_time
  FROM `order` o
  WHERE o.user_id = #{userId}
</select>
<resultMap id="orderResultMap" type="com.example.Order">
  <id property="id" column="order_id" />
  <result property="orderNo" column="order_no" />
  <result property="createTime" column="create_time" />
</resultMap>
<resultMap id="userResultMap" type="com.example.User">
  <id property="id" column="id" />
  <result property="name" column="name" />
  <result property="age" column="age" />
  <collection property="orders" ofType="com.example.Order" resultMap="orderResultMap" select="getOrderByUserId" column="id">
      <!-- 这里使用 column="id",指定了内层 select 语句的参数值为外层查询语句结果集中的 id 属性值(即用户ID) -->
  </collection>
</resultMap>

3.2 select传入多个参数

上面讲到指定select嵌套sql时,需要指定column="id",如果内层SQL需要传入多个参数时,可采用如下方式

public class OrderQuery {
    private Long userId; // 用户id
    private Integer status; // 订单状态
    // getter和setter方法
}
<select id="getOrdersByUserId" resultType="Order">
    SELECT *
    FROM `order`
    WHERE user_id = #{userId}
    AND status = #{status}
</select>
<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <!-- 注意这里的association标签的select属性使用了OrderQuery对象的属性 -->
    <result property="orders" column="id" 
            select="com.example.mapper.OrderMapper.getOrdersByUserId">
        <association property="param" javaType="OrderQuery">
            <result property="userId" column="id"/>
            <result property="status" value="1"/> <!-- 这里传递的是固定值,也可以替换为动态的表达式 -->
        </association>
    </result>
</resultMap>

association一对一属性处理

上面介绍一对多查询列表属性处理,其实association更常用于一对一属性的处理上

package com.example;

public class Order {
  private int orderId;
  private String orderName;
  private Customer customer;

  // getters and setters for orderId, orderName, customer
}

package com.example;

public class Customer {
  private int customerId;
  private String customerName;

  // getters and setters for customerId, customerName
}
<resultMap id="orderMap" type="com.example.Order">
  <id property="orderId" column="order_id"/>
  <result property="orderName" column="order_name"/>
  <association property="customer" javaType="com.example.Customer">
    <id property="customerId" column="customer_id"/>
    <result property="customerName" column="customer_name"/>
  </association>
</resultMap>

在这个例子中,Order类有一个Customer属性,我们使用Association关联对象将query出的Customer映射到Order对象的Customer属性上。
需要注意的是,Association也可以嵌套使用,我们可以通过多层Association实现多个对象之间的关联。此外,需要注意的是,在映射关联对象Association时要确保SQL语句中的JOIN操作正确无误。

总结

到此这篇关于Mybatis一对多查询列表属性处理的文章就介绍到这了,更多相关Mybatis一对多查询列表属性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mybatis一对多查询列表属性处理示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Mybatis一对多查询列表属性处理示例详解

使用MyBatis进行多表联查的关键是构建数据库中表的字段和java中对象的属性的映射关系,下面这篇文章主要给大家介绍了关于Mybatis一对多查询列表属性处理的相关资料,需要的朋友可以参考下
2023-05-20

Mybatis实现一对一、一对多关联查询的方法(示例详解)

这篇文章主要介绍了Mybatis实现一对一、一对多关联查询的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-14

spring中mybatis多表查询处理的示例分析

这篇文章将为大家详细讲解有关spring中mybatis多表查询处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。package com.swhy.bw.advisor.center.comme
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录