mybatis(plus)进行一对一、一对多、多对多查询

mybatis(plus)进行一对一、一对多、多对多查询

一般步骤:

  1. 建实体类或者VO类
  2. 自定义resultMap
  3. 写sql

resultMap的编写

一对一查询

建实体类或者VO类中没有属性是自定义的类,正常写resultMap
有的话resultMap中需要使用association 标签,如

<resultMap type="Student" id="studentResultMap">

 <id column="id" property="id" /> 
 <result column="name" property="name" /> 
 <result column="gender" property="gender" />
 <result column="grade" property="grade"/> 
 <association property="supervisor" javaType="Headmaster"> 
	<id property="id" column="h_id"/> 
	<result property="name" column="h_name"/> 
	<result property="gender" column="h_gender"/> 
</association> 
</resultMap> 

一对多查询

resultMap中需要使用collection 标签,如

<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
		<id column="id" 		 property="id"      jdbcType="VARCHAR" />
		<result column="content" property="content" jdbcType="VARCHAR" />
		<result column="type"    property="type"    jdbcType="VARCHAR" />
		<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.xxx.entity.QuestionOption"
					select="com.xxx.modules.xxx.mapper.QuestionOptionMapper.selectList" column="{qid=id,sort=sort}" />
		<!-- qid/sort是定义的变量名, id/sort是主表的字段id/sort,
		先查出主表的结果, 然后主表记录数是几 就执行几次 collection 的select,
		javaType和ofType 写不写都行,
		select的值: 对应xml的namespace + 对应xml中的代码片段的id,
		column作为select语句的参数传入,如果只传一个参数id可以简写: column="id" -->
	</resultMap>

或者

<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
		<id column="id" 		 property="id"      jdbcType="VARCHAR" />
		<result column="content" property="content" jdbcType="VARCHAR" />
		<result column="type"    property="type"    jdbcType="VARCHAR" />
		<result column="sort"    property="sort"    jdbcType="INTEGER" />
		<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.data.entity.QuestionOption">
			<id column="o_id" property="id" jdbcType="VARCHAR" />
			<result column="o_content" property="content" jdbcType="VARCHAR" />
			<result column="o_sort" property="sort" jdbcType="INTEGER" />
		</collection>
		<!-- 列的别名 o_id,o_content,o_sort , 起别名是因为主子表都有这几个字段
			 这里要写 ofType, javaType还是可以不写 -->
	</resultMap>

多对多查询

当前,一个用户可以拥有多个组,一个组也可以拥有多个用户,这样的关系就是多对多,为了解决这个问题,我们需要再用户和组之间建立一张关联的表,用于存储他们之间的对应关系,用户和组都通过这个关联的表,来查询他们之间的关系
在这里插入图片描述
现在我我们先来看一看这个关联对象的JavaBean和其Mybatis的Mapper文件是怎么样的
首先是JavaBean

在这里插入图片描述

再来看看这个实体对应的Mapper文件,只有两个功能
在这里插入图片描述

现在我们开始来看我们的主角Users用户和Group组这两位的JavaBean和Mapper文件时怎么写的

先看Users(用户实体)

在这里插入图片描述

Users的Mapper

在这里插入图片描述

这样查询到的的User对用户象就是这样的,把这个用户所对应的组都查了出来
Users{id=0, username=‘yiibai’, mobile=‘13838009988’, groups=[Group{groupId=1, groupName=‘Group-1’, users=null}, Group{groupId=2, groupName=‘Group-2’, users=null}]}

再来看看Group(组实体),其实就是和Users实体是一样的哈
还是看Group的JavaBean
在这里插入图片描述

再看看看Group的Mapper

在这里插入图片描述

这样再查询Group的时候就会把这个组的所有成员都查询出来了
Group{groupId=0, groupName=‘Group-1’, users=[Users{id=1, username=‘yiibai’, mobile=‘13838009988’, groups=null}, Users{id=2, username=‘User-name-1’, mobile=‘13838009988’, groups=null}]}

注意点

1:检查xml文件所在的package名称是否和interface对应的package名称一一对应
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称能否对应上
4: 检查配置文件中mybatis.mapper-location或者mybatis-plus.mapper-locations有没有写

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 MyBatis Plus 实现一对多查询,你可以使用 MyBatis Plus 提供的 `@TableField` 注解和 `@TableName` 注解来定义关联关系。下面是一个示例: ```java // 定义主表实体类 @TableName("order") public class Order { @TableId private Long id; private String orderNo; // 定义关联字段 @TableField(exist = false) private List<OrderItem> orderItems; // getter 和 setter 方法 } // 定义关联表实体类 @TableName("order_item") public class OrderItem { @TableId private Long id; private Long orderId; private String productName; // getter 和 setter 方法 } ``` 然后,你可以使用 MyBatis Plus 提供的方法来进行一对多查询。下面是一个示例: ```java public List<Order> getOrdersWithItems() { return orderMapper.selectList(new QueryWrapper<Order>().lambda().list().stream() .map(order -> { order.setOrderItems(orderItemMapper.selectList(new QueryWrapper<OrderItem>() .lambda() .eq(OrderItem::getOrderId, order.getId()))); return order; }) .collect(Collectors.toList())); } ``` 在这个示例中,我们首先使用 `orderMapper.selectList()` 查询出所有的主表记录,并使用 Java 8 的流式操作进行处理。在流的 `map` 操作中,我们通过 `order.getId()` 获取当前订单的 ID,然后使用 `orderItemMapper.selectList()` 查询关联表的所有记录,并将其设置到 `order` 对象的 `orderItems` 属性中。最后,我们通过 `collect(Collectors.toList())` 方法将结果收集为一个 `List<Order>`。 这样,我们就可以在一对多查询中获取到所有主表记录以及对应的关联表记录。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值