SpringBoot和Mybatis-Plus整合实现关联查询

一、搭建环境

1.创建Maven普通项目

2.添加依赖坐标

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.2.2.RELEASE</version>
</parent>

<dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <!-- 数据库驱动 -->
    <!--mysql驱动-->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
   <!-- <version>8.0.19</version>-->
    </dependency>

    <!-- lombok 简化set get toString -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

    <!-- mybatis-plus -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.4.3.1</version>
    </dependency>
  </dependencies>

3.导入SpringBoot的相关插件

<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

4.创建mapper包、pojo包和启动类Starter

mapper包: 

 在该包下定接口继承BaseMapper接口

pojo包:

在该包下定义实体类:客户类、商品类、订单类和订单详情类

Starter类:

用于SpringBoot项目启动运行

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//扫描mapper接口所在的包
@MapperScan("com.hs.mapper")
public class Starter {
    public static void main(String[] args) {
        SpringApplication.run(Starter.class);
    }
}

5.在resources文件下配置yml文件(数据库配置和日志配置)

#数据库配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm2?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: 123456

#添加日志配置项
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 6.在resources文件下创建mapper文件夹,在mapper下创建XML文件自定义数据库操作功能实现

<?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" >

二、实现订单表和用户表关联查询(一对一)

需求:关联查询其相关用户信息

订单表->用户表:一个订单只由一个用户创建,一对一关系

做法:1.在Orders类中加入Users属性,Users属性用于存储关联查询的用户信息。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Orders {
    private Integer id;
    private String orderNumber;
    private Double totalPrice;
    private String status;
    private Integer userId;
    /*
    *多表查询:一对一关系
    * 订单表关联查询用户表
    * */
    private Users users;
}

2.在OrderMapper接口中,自定义功能实现

@Mapper
public interface OrderMapper extends BaseMapper<Orders> {
    public List<Orders> selectUserResultMap();
}

3.在resources文件下mapper文件夹里,书写映射下XML文件UserMapper

resultMap:需要单独定义resultMap,使用 resultMap可以完成将关联查询映射到实体类的属性中。

association标签: 一对一关系映射描述。

  • property: 关系属性名称。
  • javaType: 关系属性类型。
 <resultMap id="selectUserResultMap" type="com.hs.pojo.Orders">
        <id column="id" property="id"/>
        <id column="order_number" property="orderNumber"/>
        <id column="total_price" property="totalPrice"/>
        <id column="status" property="status"/>
        <association property="users" javaType="com.hs.pojo.Users">
            <id column="user_id" property="id"/>
            <id column="username" property="username"/>
            <id column="password" property="password"/>
            <id column="realname" property="realname"/>
        </association>
    </resultMap>
    <select id="selectUserResultMap" resultType="com.hs.pojo.Orders">
        select o.*,u.username,u.password,u.realname from orders o,users u where o.user_id=u.id
    </select>

4.在测试类中进行测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes=Starter.class)
public class Test1 {
    @Resource
    private OrderMapper orderMapper;
    //多表查询:一对一关系
    //订单表关联查询用户表
    @Test
    public void selectOneByOne(){
        List<Orders> orders = orderMapper.selectUserResultMap();
        orders.forEach(System.out::println);
    }
}

三、实现订单表和订单详情表关联查询(一对多)

需求:

  • 关联查询其相关用户信息。
  • 关联查询其相关订单详情信息。

订单表->订单详情表:一对多 

具体做法同上。

1.在Orders类中加入属性ordersDetailList

 /*
     * 一对多关系属性:一个订单包含多个订单详情
     * */
    private List<OrderDetails> ordersDetailList;

 2.在OrderMapper接口中,自定义功能实现

    /*
    * 一对多:查询订单信息,
    * 一个订单对应多条详情信息,则是一对多
    * */

    public List<Orders> selectOrdersAndDetail();

3.在resources文件下mapper文件夹里,书写映射下XML文件UserMapper 

在Order类中加入ordersDetailList属性,details属性用于存储关联查询的订单详情。

collection标签: 一对多关系映射描述。

  • property: 关系属性名称。
  • ofType: 关系属性是一个List集合,集合中存放的元素类型。
    <!--
        collection:一对多
        property:订单实体类中的属性
        ofType:集合里面存储的类型
        -->

        <collection property="orderDetailList" ofType="com.hs.pojo.OrderDetails">
            <id column="detail_id" property="id"/>
            <id column="amount" property="amount"/>
            <id column="orders_id" property="ordersId"/>
            <id column="goods_id" property="goodsId"/>
        </collection>
    </resultMap>

    <select id="selectOrdersAndDetail" resultMap="detailResultMap">
        select
            o.*,u.username,u.password,u.realname,d.id detail_id,d.amount,d.orders_id,d.goods_id
        from orders o,users u,orders_detail d
        where o.user_id=u.id and o.id=d.orders_id
    </select>

 四、实现订单表和商品表关联查询(多对多)

中间表:订单详情表

需求:

  • 关联查询其相关用户信息。
  • 关联查询其相关订单详情信息。
  • 关联查询订单详情中的商品信息。

订单表->订单详情表:一对多     订单详情表->订单表:一对一

订单详情表->商品表:一对一      商品表->订单详情表:一对多

订单表->商品表:一对多                 商品表->订单表:多对一

做法:1.在OrderDetails类中加入属性goods

           2.在OrderMapper接口中,自定义功能实现

           3.在resources文件下mapper文件夹里,书写映射下XML文件UserMappe

 <resultMap id="goodsResultMap" type="com.hs.pojo.Orders">
        <id column="id" property="id"/>
        <id column="order_number" property="orderNumber"/>
        <id column="total_price" property="totalPrice"/>
        <id column="status" property="status"/>
        <!--
        collection:一对多映射
        property:订单实体类中的属性
        ofType:集合里面存储的类型
        -->
        <collection property="orderDetailList" ofType="com.hs.pojo.OrderDetails">
            <id column="detail_id" property="id"/>
            <id column="amount" property="amount"/>
            <id column="orders_id" property="ordersId"/>
            <id column="goods_id" property="goodsId"/>
            <association property="goods" javaType="com.hs.pojo.Goods">
                <id column="goods_id" property="id"/>
                <id column="goods_name" property="goodsName"/>
                <id column="description" property="description"/>
                <id column="price" property="price"/>
            </association>
        </collection>
    </resultMap>
    <select id="selectOrdersAndGoods" resultMap="goodsResultMap">
        select
            o.*,d.goods_id,g.goods_name,g.description,g.price
        from orders o,orders_detail d,goods g
        where o.id = d.orders_id and d.goods_id = g.id
    </select>

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值