Spring Boot 多表关联查询实战(一对多 _ 多对一)

Spring boot jpa 多表关联查询 阅读详情

Spring Boot 多表关联查询实战(一对多 / 多对一)

在Spring Boot项目开发中,单表CRUD是基础操作,当掌握单表增删改查后,多表关联查询便成为核心重点——无论是毕业设计还是企业实际项目,多表查询都是高频需求,尤其一对多、多对一的关联场景,几乎贯穿所有业务模块(如用户与订单、商品与订单、部门与员工等)。本文将以最典型的「用户-订单」场景为例,完整实战一对多、多对一的实体设计、MyBatis-Plus两种核心查询方式,以及分页+多条件查询的落地实现,兼顾理论与实操,直接适配毕设和项目开发。

一、前置准备:环境搭建与核心场景说明

1.1 环境依赖

确保项目中引入以下核心依赖(Maven示例),重点是Spring Boot Starter、MyBatis-Plus、MySQL驱动,分页插件需额外引入MyBatis-Plus分页依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus 核心依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- MyBatis-Plus 分页插件 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- lombok 简化实体类 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

1.2 核心场景定义

本文以「用户-订单」为实战场景,明确一对多、多对一关系:

  • 多对一:订单 → 用户。多个订单可以属于同一个用户,订单是“多”的一方,用户是“一”的一方,订单表中需存在外键(user_id)关联用户表的主键(id)。

  • 一对多:用户 → 订单。一个用户可以拥有多个订单,用户是“一”的一方,订单是“多”的一方,用户表中无需额外添加字段,通过订单表的外键关联。

数据库表设计(MySQL):先创建用户表(user),再创建订单表(order),订单表通过user_id关联用户表,注意订单表名需规避MySQL关键字,此处用t_order命名。

-- 用户表(一的一方)
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `phone` varchar(11) DEFAULT NULL COMMENT '手机号',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 订单表(多的一方),外键关联用户表
CREATE TABLE `t_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单主键',
  `order_no` varchar(32) NOT NULL COMMENT '订单编号',
  `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
  `user_id` bigint(20) NOT NULL COMMENT '关联用户主键(外键)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  -- 外键约束:关联用户表的id
  CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

说明:外键约束中ON DELETE CASCADE表示删除用户时,自动删除该用户关联的所有订单,根据业务需求可调整为ON DELETE SET NULL(需user_id允许为null)。

二、核心实战一:一对多 / 多对一实体设计

实体设计是多表查询的基础,核心是通过注解(@TableName、@TableField、@TableId)映射数据库表,通过实体属性体现关联关系,无需手动编写映射文件(MyBatis-Plus自动适配)。

2.1 多对一实体设计(订单 → 用户)

订单(TOrder)是多的一方,关联用户(User),在订单实体中添加User类型的属性(user),用于存储关联的用户信息,通过@TableField(exist = false)说明该属性不对应数据库表字段(仅用于关联查询)。

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 订单实体(多的一方,多对一:订单→用户)
 */
@Data
@TableName("t_order") // 映射数据库表t_order
public class TOrder {
    // 订单主键,自增
    @TableId(type = IdType.AUTO)
    private Long id;

    // 订单编号
    private String orderNo;

    // 订单总金额
    private BigDecimal totalAmount;

    // 关联用户主键(外键,对应数据库user_id字段)
    private Long userId;

    // 关联的用户信息(多对一核心:订单关联一个用户)
    // exist = false:表示该属性不是数据库表的字段,仅用于接收关联查询结果
    @TableField(exist = false)
    private User user;

    // 创建时间,自动填充
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    // 自动填充配置(可选,简化代码)
    @Version
    private Integer version; // 乐观锁(可选)
}

/**
 * 用户实体(一的一方)
 */
@Data
@TableName("user") // 映射数据库表user
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;

    private String phone;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}

2.2 一对多实体设计(用户 → 订单)

用户(User)是一的一方,关联多个订单(TOrder),在用户实体中添加List类型的属性(orderList),用于存储该用户的所有订单,同样通过@TableField(exist = false)标识非数据库字段。

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户实体(一的一方,一对多:用户→订单)
 */
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;

    private String phone;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    // 关联的订单列表(一对多核心:一个用户拥有多个订单)
    // exist = false:非数据库字段,用于接收关联查询结果
    @TableField(exist = false)
    private List<TOrder> orderList;
}

关键注意点:关联属性(user、orderList)必须添加@TableField(exist = false),否则MyBatis-Plus会将其当作数据库表字段处理,导致查询报错;实体类属性名与数据库字段名不一致时,可通过@TableField(“数据库字段名”)手动映射(如userId对应数据库user_id,MyBatis-Plus默认支持驼峰命名,可省略该注解)。

三、核心实战二:MyBatis-Plus 多表查询两种方式

MyBatis-Plus实现多表查询主要有两种方式:① 基于@TableName关联(通过resultMap映射,无需编写SQL);② 自定义SQL(灵活适配复杂场景),两种方式按需选择,优先使用第一种(简化代码),复杂场景用第二种。

3.1 方式一:@TableName 关联(resultMap 映射)

核心原理:通过MyBatis的resultMap标签,手动定义实体与数据库表的关联关系,映射一对多、多对一的关联属性,无需编写完整SQL,仅需调用MyBatis-Plus的基础查询方法(如selectById、selectList)即可实现关联查询。

需创建Mapper接口(继承BaseMapper),并在对应的XML映射文件中定义resultMap。

3.1.1 多对一查询(订单 → 用户)

需求:查询订单信息时,同时查询出该订单所属的用户信息(如查询订单编号为“20260306001”的订单,同时返回用户名、手机号)。

  1. 创建TOrderMapper接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.TOrder;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TOrderMapper extends BaseMapper<TOrder> {
    // 无需额外编写方法,仅需在XML中定义resultMap
}
  1. 创建TOrderMapper.xml映射文件(resources/mybatis/mapper目录下),定义resultMap关联用户:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.TOrderMapper"&gt;
    <!-- 多对一:订单→用户,定义resultMap -->
    <resultMap id="orderUserMap" type="com.example.demo.entity.TOrder"><!-- 订单表自身字段映射 -->
        <id column="id" property="id"/>
        <result column="order_no" property="orderNo"/>
        <result column="total_amount" property="totalAmount"/>
        <result column="user_id" property="userId"/>
        <result column="create_time" property="createTime"/&gt;

        <!-- 关联用户表(多对一:association标签) -->
        <!-- property:订单实体中关联用户的属性名(user) -->
        <!-- javaType:关联的实体类(User) -->
        <association property="user" javaType="com.example.demo.entity.User">
            <id column="u_id" property="id"/&gt; <!-- u_id是关联查询时用户表id的别名,避免字段冲突 -->
            <result column="username" property="username"/>
            <result column="phone" property="phone"/>
            <result column="u_create_time" property="createTime"/>
        </association&gt;
    &lt;/resultMap&gt;

    <!-- 自定义查询方法,关联用户表,使用上面定义的resultMap -->
    <select id="selectOrderWithUser" resultMap="orderUserMap">
        SELECT 
            o.*, 
            u.id u_id, 
            u.username, 
            u.phone, 
            u.create_time u_create_time 
        FROM t_order o
        LEFT JOIN user u ON o.user_id = u.id
        <!-- 可添加条件,如根据订单编号查询 -->
        WHERE o.order_no = #{orderNo}
    </select>
</mapper>
  1. 测试多对一查询(Service层示例):
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.TOrder;
import com.example.demo.mapper.TOrderMapper;
import org.springframework.stereotype.Service;

@Service
public class TOrderService extends ServiceImpl<TOrderMapper, TOrder> {
    // 查询订单并关联用户
    public TOrder getOrderWithUser(String orderNo) {
        return baseMapper.selectOrderWithUser(orderNo);
    }
}

// 控制器测试(Controller)
@RestController
@RequestMapping("/order")
public class TOrderController {
    @Autowired
    private TOrderService orderService;

    @GetMapping("/{orderNo}")
    public Result<TOrder> getOrderWithUser(@PathVariable String orderNo) {
        TOrder order = orderService.getOrderWithUser(orderNo);
        return Result.success(order);
    }
}

测试结果:返回订单信息的同时,包含该订单所属用户的username、phone等信息,实现多对一关联查询。

3.1.2 一对多查询(用户 → 订单)

需求:查询用户信息时,同时查询出该用户的所有订单信息(如查询id为1的用户,同时返回该用户的所有订单列表)。

  1. 创建UserMapper接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 无需额外编写方法,XML中定义resultMap
}
  1. 创建UserMapper.xml映射文件,定义resultMap关联订单列表:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"&gt;
    <!-- 一对多:用户→订单,定义resultMap -->
    <resultMap id="userOrderMap" type="com.example.demo.entity.User"&gt;
        <!-- 用户表自身字段映射 -->
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="phone" property="phone"/>
        <result column="create_time" property="createTime"/>

        <!-- 关联订单表(一对多:collection标签) -->
        <!-- property:用户实体中关联订单列表的属性名(orderList) -->
        <!-- ofType:订单列表中元素的类型(TOrder) -->
        <collection property="orderList" ofType="com.example.demo.entity.TOrder">
            <id column="o_id" property="id"/&gt; <!-- o_id是订单表id的别名,避免冲突 -->
            <result column="order_no" property="orderNo"/>
            <result column="total_amount" property="totalAmount"/>
            <result column="user_id" property="userId"/>
            <result column="o_create_time" property="createTime"/>
        </collection>
    </resultMap>

<!-- 自定义查询方法,关联订单表 -->
    <select id="selectUserWithOrder" resultMap="userOrderMap">
        SELECT 
            u.*, 
            o.id o_id, 
            o.order_no, 
            o.total_amount, 
            o.user_id, 
            o.create_time o_create_time 
        FROM user u
        LEFT JOIN t_order o ON u.id = o.user_id
        <!-- 条件:根据用户id查询 -->
        WHERE u.id = #{userId}
    </select>
</mapper>
  1. 测试一对多查询(Service层示例):
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    // 查询用户并关联其所有订单
    public User getUserWithOrder(Long userId) {
        return baseMapper.selectUserWithOrder(userId);
    }
}

// 控制器测试
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{userId}")
    public Result<User> getUserWithOrder(@PathVariable Long userId) {
        User user = userService.getUserWithOrder(userId);
        return Result.success(user);
    }
}

测试结果:返回用户信息的同时,包含该用户的所有订单列表,实现一对多关联查询。

3.2 方式二:自定义 SQL(灵活适配复杂场景)

当关联关系复杂(如多表联查、多条件筛选)时,@TableName关联方式不够灵活,此时可通过MyBatis-Plus的@Select注解直接编写自定义SQL,或在XML中编写复杂SQL,两种形式均可,以下以@Select注解为例(简化代码)。

3.2.1 多条件多表查询(示例)

需求:查询指定用户(username包含“张”)的所有订单,且订单总金额大于100元,返回订单编号、总金额、用户名、手机号。

// 在TOrderMapper接口中添加自定义SQL方法
@Mapper
public interface TOrderMapper extends BaseMapper<TOrder> {
    // 自定义SQL,多表联查+多条件
    @Select("SELECT o.order_no, o.total_amount, u.username, u.phone " +
            "FROM t_order o " +
            "LEFT JOIN user u ON o.user_id = u.id " +
            "WHERE u.username LIKE CONCAT('%', #{username}, '%') " +
            "AND o.total_amount > #{minAmount}")
    List<Map<String, Object>> selectOrderByCondition(
            @Param("username") String username,
            @Param("minAmount") BigDecimal minAmount
    );
}

测试:调用该方法,传入username=“张”、minAmount=100,即可返回满足条件的订单及关联用户信息,适合不需要映射完整实体、仅需部分字段的场景。

3.2.2 自定义 SQL 注意点
  • 多表联查时,需给表名、字段名添加别名,避免字段冲突(如用户表和订单表都有create_time,需分别别名u_create_time、o_create_time)。

  • 参数传递使用@Param注解,明确参数名,避免SQL中参数无法识别。

  • 返回结果可选择Map<String, Object>(灵活接收部分字段),或自定义DTO实体(接收指定字段,更规范)。

四、核心实战三:分页 + 多条件查询实战

在实际项目中,多表查询往往需要结合分页(避免数据量过大)和多条件筛选(满足业务查询需求),MyBatis-Plus的分页插件可直接适配多表查询,以下是完整实战案例。

4.1 分页插件配置

首先配置MyBatis-Plus分页插件,全局生效,无需重复配置:

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {
    // 分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加MySQL分页拦截器(根据数据库类型选择)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

4.2 分页 + 多条件多表查询实现

需求:分页查询订单列表,支持多条件筛选(用户名模糊查询、订单金额范围查询、创建时间范围查询),同时关联查询订单所属用户信息,返回分页结果(总条数、总页数、当前页数据)。

4.2.1 定义查询条件DTO(接收前端参数)
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 订单分页查询条件DTO
 */
@Data
public class OrderQueryDTO {
    // 分页参数(当前页、每页条数)
    private Integer current = 1; // 默认第1页
    private Integer size = 10; // 默认每页10条

    // 多条件筛选参数
    private String username; // 用户名模糊查询
    private BigDecimal minAmount; // 最小订单金额
    private BigDecimal maxAmount; // 最大订单金额
    private LocalDateTime startCreateTime; // 开始创建时间
    private LocalDateTime endCreateTime; // 结束创建时间

    // 转换为MyBatis-Plus分页对象
    public IPage<TOrder> toPage() {
        return new Page<>(current, size);
    }
}
4.2.2 Mapper接口编写分页查询方法
@Mapper
public interface TOrderMapper extends BaseMapper<TOrder> {
    // 分页+多条件+多表关联查询,使用XML编写SQL(更清晰)
    IPage<TOrder> selectOrderPage(
            Page<TOrder> page, // 分页参数,MyBatis-Plus自动识别
            @Param("dto") OrderQueryDTO dto // 查询条件
    );
}
4.2.3 XML中编写分页关联SQL
<!-- 在TOrderMapper.xml中添加分页查询SQL -->
<select id="selectOrderPage" resultMap="orderUserMap">
    SELECT 
        o.*, 
        u.id u_id, 
        u.username, 
        u.phone, 
        u.create_time u_create_time 
    FROM t_order o
    LEFT JOIN user u ON o.user_id = u.id
    <where>
        <!-- 多条件筛选,动态拼接SQL -->
        <if test="dto.username != null and dto.username != ''">
            AND u.username LIKE CONCAT('%', #{dto.username}, '%')
        </if>
        <if test="dto.minAmount != null">
            AND o.total_amount >= #{dto.minAmount}
        </if>
        <if test="dto.maxAmount != null">
            AND o.total_amount <= #{dto.maxAmount}
        </if>
        <if test="dto.startCreateTime != null">
            AND o.create_time >= #{dto.startCreateTime}
        </if>
        <if test="dto.endCreateTime != null">
            AND o.create_time <= #{dto.endCreateTime}
        </if>
    &lt;/where&gt;
    <!-- 排序:按订单创建时间倒序 -->
    ORDER BY o.create_time DESC
</select>
4.2.4 Service层与Controller层实现
// Service层
@Service
public class TOrderService extends ServiceImpl<TOrderMapper, TOrder> {
    // 分页查询订单(关联用户+多条件)
    public IPage<TOrder> getOrderPage(OrderQueryDTO dto) {
        // 转换为分页对象
        Page<TOrder> page = (Page<TOrder>) dto.toPage();
        // 调用Mapper方法,返回分页结果
        return baseMapper.selectOrderPage(page, dto);
    }
}

// Controller层
@RestController
@RequestMapping("/order")
public class TOrderController {
    @Autowired
    private TOrderService orderService;

    // 分页查询订单
    @PostMapping("/page")
    public Result<IPage<TOrder>> getOrderPage(@RequestBody OrderQueryDTO dto) {
        IPage<TOrder> page = orderService.getOrderPage(dto);
        return Result.success(page);
    }
}
4.2.5 测试结果说明

前端传入查询条件(如current=1、size=10、username=“张”、minAmount=50),后端返回分页结果,包含:

  • 分页基础信息:total(总条数)、pages(总页数)、current(当前页)、size(每页条数)。

  • 当前页数据:每条订单信息包含关联的用户username、phone等信息,满足多条件筛选需求。

关键注意点:分页查询时,分页参数(Page对象)必须作为Mapper方法的第一个参数,MyBatis-Plus才能自动识别并进行分页;动态条件使用标签,自动处理AND/OR拼接,避免SQL语法错误。

五、常见问题与解决方案

  1. 关联查询时,关联属性(user、orderList)为null?

       解决方案:① 检查XML中resultMap的association/collection标签配置,确保property、javaType/ofType正确;② 检查SQL是否正确左连接(LEFT JOIN),避免内连接(INNER JOIN)导致无关联数据时返回null;③ 确认@TableField(exist = false)是否添加。
    
  2. 分页查询无数据,或分页参数不生效?

       解决方案:① 检查分页插件是否配置正确,确保数据库类型(DbType)与项目使用的数据库一致;② 确认Mapper方法中分页参数(Page对象)是第一个参数;③ 检查SQL是否有语法错误,可通过打印SQL日志排查(在application.yml中配置mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl)。
    
  3. 多表联查字段冲突,导致查询结果错误?
    解决方案:给冲突的字段添加别名(如用户表id别名u_id,订单表id别名o_id),并在resultMap中正确映射别名与实体属性。

六、总结

本文围绕Spring Boot + MyBatis-Plus实现一对多、多对一关联查询,从实体设计、两种核心查询方式,到分页+多条件查询实战,完整覆盖毕设和项目中最常用的多表查询场景。核心要点:

  • 实体设计:通过@TableField(exist = false)定义关联属性,多对一用association标签,一对多用collection标签。

  • 查询方式:简单场景用@TableName关联(resultMap映射),复杂场景用自定义SQL,按需选择。

  • 分页实战:配置分页插件,结合动态SQL实现多条件分页,适配实际项目需求。

掌握本文内容后,可轻松应对毕设中的多表查询需求,同时适配企业项目中常见的关联查询场景,后续可进一步学习多对多关联查询、级联操作等进阶内容。

【Spring Boot 3】【JPA】一对一中间表关联 存储一对一关联关系可以使用主从双数据表或带有中间关联关系表的三数据表,在《【Spring Boot 3】【JPA】一对一单向关联》和《【Spring Boot 3】【JPA】一对一双向关联》中说明了基于主从双数据表的实现,本文介绍带有中间关联关系表的三数据表实现。本文定义了房屋(House)、地址(Address)、房产证()三个实体,其中房屋(House)与地址(Address)一对一单向关联,房屋(House)与房产证()一对一双向关联,关系主控方(即关系拥有方)都是房屋(House。 阅读详情

相关推荐

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1571

springboot 联表查询

springboot 联表查询

hupei 1万+

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 992

用spring boot实现一个多表查询功能

在使用 Spring Boot 实现多表查询功能时,首先需要建立相应的实体类来映射数据库中的表。然后可以使用 JPA 来完成对多个表的查询。 下面是一个示例,假设有两张表:用户表(user)和订单表(order),并且在用户表中有一个外键 user_id 关联到订单表中的 user_id 字段。 首先,需要建立实体类 User 和 Order,其中 User 实体类中包含一个 OneToMany ...

weixin_35755434的博客 1622

关于笔记本测试的面试准备 2021-10-11

** 关于笔记本测试的面试准备 ** 一、根据JD分析,工作内容以软测为主,硬件知识需要了解一点。 以下几个问题为主要: 1.了解VGA、audio、wlan、bt、TP 、camera等driver,BIOS和image测试。 2.了解性能测试工具?压力测试相关设置? 3.了解preload流程? 二、解决 VGA: video graphics array ——笔记本上外接显示器的接口。 【VGA接口兼容性更强,但是不支持高分辨率。 支持高分辨率:HDMI、DIV、TP】 bt【Bluetooth

xw_009的博客 1865

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

springboot +mybatis实现多表一对一查询

这篇文章是联合了数据库中的person表和idcard表进行一对一查询。从0开始一步一步教你写。包含视频演示!!解释一些名词含义: ==**一对一查询**==,就是指的是表关系,比如我这里的是学生表和学生卡表就是一对一的,一个学生只有一张学生卡,一张学生卡必然也对应着一个学生; ==**一对多**==:可以理解为一个母亲有多个孩子,或者一个部门有多个员工。一就是母亲或者部门,多就是孩子和员工; ==**多对多**==:可以理解为一个学生可以选择很多门课程,一门课程可以有很多个学生去选择。此时两者的关系

H-rosy的博客 3924

SE80 Repository Information System 在 SAP CRM WebClient UI 组件分析中的实战指南

在 SAP CRM WebClient UI 开发过程中,如何快速定位组件、视图、上下文节点以及各类运行时对象,一直是调试效率的关键。(后文简称RIS)正是隐藏在SE80里的瑞士军刀,帮助开发者按照组件集、数据元素、上下文节点属性等多维条件进行交叉检索。官方博客将它描述为本文结合多年项目经验,系统梳理RIS的功能脉络与实战技巧,同时引入真实案例,示范如何借助它在几分钟内完成以往动辄数小时的排查任务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2万+

SpringBoot实战:多表联查

请求数据的结构Controller层Service层。

2301_79526467的博客 1788

【GameFramework框架】三、快速启动

这篇文章就带领大家如何快速启动GameFramework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 4421

2、探索谷歌云平台(GCP):入门指南

本文全面介绍了谷歌云平台(GCP)的入门知识,涵盖其全球基础设施、核心服务和使用方法。内容包括GCP区域与可用区结构、创建免费账户、配置计算资源(如GCE虚拟机)、存储类型(PD、Filestore、GCS)、网络架构(VPC)、组织与项目管理、身份访问控制(IAM),以及计算、存储、数据库、大数据和人工智能等各类云服务。文章还提供了资源规划、安全管理和成本控制等实用建议,帮助用户快速上手并高效利用GCP构建可扩展的云解决方案。

uber9的博客 254

SpringBoot学习记录(三)之多表查询

sql的多表查询

LB_Wuyanzu的博客 1746

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6433

Spring Data JPA的一对一多表查询

一、简单聊聊 我在写自己的课程设计的时候,用的持久层API就是JPA。整个项目给我带来的感受就是:低SQL语句开发,甚至是零SQL语句开发,使得我在开发过程中,不再关注SQL语句的书写问题与逻辑问题。这使得我在开发过程中,更加专注于自己的业务逻辑,而不在拘泥于SQL表和Java实体之间的映射。尤其在多表查询这一块,JPA以其超简洁的语法规则,给我们实现了表一对一乃至一对多的关系。那么今天想给大家分享的是,一对一的多表查询。 二、简单认识JPA 以下引用了网上对JPA的介绍: ...

m0_66884848的博客 6344

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MyBatis 中的一对多、多对一、多对多映射深度解析(含 Spring Boot 示例)

本文将带你从零开始,手把手实现 MyBatis 中常见的三种关系映射,并结合 Spring Boot 给出完整示例,助你轻松应对面试与实战!

小小菜鸟的博客 1118

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spring boot 2使用Mybatis多表关联查询

模拟业务关系: 一个用户user有对应的一个公司company,每个用户有多个账户account。 spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一、mysql创表和模拟数据sql CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name...

gdjlc的专栏 2万+

SpringBoot整合Mybatis-Plus----多表关联查询(使用注解)

多表关联查询(使用注解)一、创建两张表二、编写实体类三、使用 @One 注解实现一对一关联四、使用 @Many 注解实现一对一关联五、Controller层六、测试 继续在 SpringBoot整合Mybatis-Plus 基础上修改项目 一、创建两张表 用户表(User)、区域表(Area),其中用户表里通过 area_id 字段关联区域表的 id 主键 二、编写实体类 User package org.spring.springboot.entity; import com.baomidou.

jike11231的博客 5万+

mybatis-plus 多表关联条件分页查询

mybatis-plus 多表关联分页 条件查询

huangchong0107的博客 1万+

Spring Boot JPA级联查询【一对多、多对一】

一、数据准备 在管理系统中,角色和用户是典型一对多关系,一个角色可以分配给多个用户,一个用户对应一个角色。准备两个实体类TestRole、TestUser类,并在数据库建好对应表结构z_test_roles、z_test_users两张表。 @Entity @Getter @Setter @Table(name = "z_test_roles") public class TestRole implements Serializable { @Id @Column(na...

u014713873的博客 9307

Spring Boot 整合 MyBatis 进行多表查询

Spring Boot 整合 MyBatis 实现多表查询的核心是通过resultMap中的(多对一)和collection(一对多 / 多对多)标签处理关联关系。简单关联查询推荐使用嵌套结果查询,减少 SQL 执行次数复杂关联或大数据量场景可考虑嵌套查询 + 延迟加载,按需加载数据多对多关系需通过中间表进行关联,并在 resultMap 中正确配置映射关系通过合理设计实体类、Mapper 接口和 XML 映射文件,可以高效实现各种复杂的多表查询需求。

2502_92141759的博客 1054

Java Spring Boot中Model与Entity的区别与联系及多表关联查询的实现

Java Spring Boot中Model与Entity的区别与联系及多表关联查询的实现

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1266

spring boot mybatis查询关联表数据,一对一,一对多快速查询

查询主表对应的一对一关联表数据,以及主表对应的关联表一对多数据 以下列场景为例: 标准奖励制度表——标准制度Id 唯一主键 申报一项奖励——关联标准制度Id 申报奖励附件表——关联 申报奖励表Id 需求:查询出某一条申报的奖励的所有资料和附件信息,同时查出标准制度的详细内容 实现: 标准奖励表VO所继承实体类文件 PointsStandard.java(省去get、set 方法) ** * 制...

zb2741747581的博客 1078

springboot整合mybatis 多对一以及一对多的处理

1.导入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.s

qq_40576635的博客 1076

java jpa自身关联查询_spring data jpa关联查询(一对一、一对多、多对多)

在实际过往的项目中,常用的查询操作有:1、单表查询,2、一对一查询(主表和详情表)3、一对多查询(一张主表,多张子表)4、多对多查询(如权限控制,用户、角色多对多)。做个总结,所以废话不多说。使用idea构建springboot项目,引入依赖如下:dependencies>org.springframework.bootspring-boot-starter-data-jpa<depe...

weixin_42363874的博客 1034

Java使用mongodb进行数据存储及多表关联,多条件查询

前言: 在开发的过程中,由于持久层使用的是非关系型数据库mongodb,涉及到列表查询的多表关联查询,在实现此功能的过程中出现了不少问题,做下记录方便以后遇到此类问题可以快速的解决,同时为遇到此类问题的小伙伴提供一点帮助。 注: Java操作mongodb数据库存储数据,数据访问层需继承 MongoRepository 接口,本实例为Spring boot项目 impor...

xiao雷博客 8138

关于Mongodb + java + 多表关联查询(MongoTemplate)

其实我也是第一次用,花了一天时间,总结下,自己算是留下文档,有问题的朋友也可以看看!废话不说,直接上代码 package com.hollysys.tn.service; import java.util.Date; import java.util.List; import java.util.Map; import org.springframework.beans.factory.ann...

qq_37870582的博客 7848
上一篇: Spring Boot 项目打包成 JAR 并部署运行(实战完整版)
下一篇: Spring Boot 接口权限控制:登录 + JWT 实战
码客日记
博客等级 码龄6年 149粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值