一、搭建环境
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>