SpringBoot 实战系列之二:SpringBoot+Mybatis的多对多高级映射

实战背景:用一篇文章能实战说明,SpringBoot+Mybatis的多对多高级映射,因为涉及到太多的知识点,从如下的10步法,构建一个多对多的工程,具体关系如下:

工程需求:查询订单信息,关联查询用户信息

业务分析:借助ResultMap,使用association和collection完成一对一和一对多高级映射。

  1. t_user和orders:t_user---->orders:一个用户可以创建多个订单,一对多
  2. orders和orderdetail:orders--->orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系
  3. orderdetail--> orders:一个订单明细只能包括在一个订单中,一对一
  4. orderdetail和items:orderdetail--->itesms:一个订单明细只对应一个商品信息,一对一;items--> orderdetail:一个商品可以包括在多个订单明细 ,一对多再分析数据库级别没有关系的表之间是否有业务关系:
  5. orders和items:orders和items之间可以通过orderdetail表建立关系。

准备工作一:构建Pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>MybatisCURD Page</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!-- 增加对PageHelper的支持 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>4.1.6</version>
		</dependency>
		<!--增加thymeleaf支持-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

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

</project>

准备工作二:application.properties文件

spring.datasource.url=jdbc:mysql://127.0.0.1/test2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
#´ËÏî¹ýʱ£¬ÇëÌ滻Ϊspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

#´ËÏî¹ýʱ£¬ÇëÌ滻Ϊspring.datasource.initialization-mode=always
spring.datasource.initialize=true
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:db/schema.sql

spring.thymeleaf.cache=false
server.port=8080

实战正式开始了!!!

1. 数据库构建

/*Table structure for table `t_user` */
CREATE TABLE t_user (
  id INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(32) NOT NULL COMMENT '用户名称',
  birthday DATE DEFAULT NULL COMMENT '生日',
  sex CHAR(1) DEFAULT NULL COMMENT '性别',
  address  VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

/*Table structure for table `items` */
CREATE TABLE items (
  id INT NOT NULL  AUTO_INCREMENT,
  itemsname VARCHAR(32) NOT NULL COMMENT '商品名称',
  price FLOAT(10,1) NOT NULL COMMENT '商品定价',
  detail TEXT COMMENT '商品描述',
  pic VARCHAR(64) DEFAULT NULL COMMENT '商品图片',
  createtime DATETIME NOT NULL COMMENT '生产日期',
  PRIMARY KEY (id)
)  DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */
CREATE TABLE orders (
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL COMMENT '下单用户id',
  number VARCHAR(30) NOT NULL COMMENT '订单号',
  createtime DATETIME NOT NULL COMMENT '创建订单时间',
  note VARCHAR(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)  DEFAULT CHARSET=utf8;

/*Table structure for table `orderdetail` */
CREATE TABLE orderdetail (
  id INT NOT NULL AUTO_INCREMENT,
 orders_id INT NOT NULL COMMENT '订单id',
  items_id INT NOT NULL COMMENT '商品id',
  items_num INT  DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (id),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)  DEFAULT CHARSET=utf8;

2. 基础业务数据加载

/*Data for the table `user` */
INSERT  INTO `t_user`(`username`,`birthday`,`sex`,`address`) VALUES 
('王五',NULL,'2',NULL),
('张三','2014-07-10','1','北京市'),
('张小明',NULL,'1','河南郑州'),
('陈小明',NULL,'1','河南郑州'),
('张三丰',NULL,'1','河南郑州'),
('陈小东',NULL,'1','河南郑州'),
('王五',NULL,NULL,NULL),
 ('小A','2015-06-27','2','北京'),
('小B','2015-06-27','2','北京'),
('小C','2015-06-27','1','北京'),
('小D','2015-06-27','2','北京');

/*Data for the table `items` */
INSERT  INTO items(itemsname,price,detail,pic,createtime) VALUES 
('台式机',3000.0,'该电脑质量非常好!',NULL,'2015-07-07 13:28:53'),
('笔记本',6000.0,'笔记本性能好,质量好!',NULL,'2015-07-08 13:22:57'),
('背包',200.0,'名牌背包,容量大质量好!',NULL,'2015-07-010 13:25:02');

/*Data for the table `orders` */
INSERT  INTO `orders`(`user_id`,`number`,`createtime`,`note`) VALUES 
(1,'1000010','2015-06-04 13:22:35',NULL),
(1,'1000011','2015-07-08 13:22:41',NULL),
(2,'1000012','2015-07-17 14:13:23',NULL),
(3,'1000013','2015-07-16 18:13:23',NULL),
(4,'1000014','2015-07-15 19:13:23',NULL),
(5,'1000015','2015-07-14 17:13:23',NULL),
(6,'1000016','2015-07-13 16:13:23',NULL);

/*Data for the table `orderdetail` */
INSERT  INTO `orderdetail`(`orders_id`,`items_id`,`items_num`) VALUES
 (1,1,1),
 (1,2,3),
 (2,3,4),
 (3,2,3);

3. 确定需求:查询订单信息,关联查询用户信息。

SELECT    t1.*,t2.username,t2.sex,t2.address
FROM  orders t1,t_user t2
WHERE t1.user_id=t2.id

4. 构建用户类

package com.mybatis.entity;

import java.util.Date;
import java.util.List;

/**
 * @ClassName: User
 * @Description: TODO(用户实体)
 * 
 */
public class User {
    // 属性名称和数据库字段名称保持一致
    private Integer id;
    // 姓名
    private String username;
    // 性别
    private String sex;
    // 地址
    private String address;
    // 生日
    private Date birthday;
    // 用户创建的订单列表
    private List<Orders> ordersList;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", address=" + address + ", birthday=" + birthday + "]";
    }

}

 5.构建订单类

package com.mybatis.entity;

import java.util.Date;
import java.util.List;

/**
 * @ClassName: Orders
 * @Description: TODO(订单实体)

 */
public class Orders {
    
    /** 主键订单Id */
    private Integer id;
    /** 下单用户id */
    //private Integer userid;
    /** 订单号 */
    private String number;
    /** 创建订单时间 */
    private Date createTime;
    /** 备注 */
    private String note;
    // 用户信息
    private User user;
    // 订单明细
    private List<OrderDetail> orderdetails;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
//    public Integer getUserid() {
//        return userid;
//    }
//    public void setUserid(Integer userid) {
//        this.userid = userid;
//    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<OrderDetail> getOrderdetails() {
        return orderdetails;
    }
    public void setOrderdetails(List<OrderDetail> orderdetails) {
        this.orderdetails = orderdetails;
    }

}

6. 构建商品类

package com.mybatis.entity;

import java.util.Date;

/**
 * @ClassName: Items
 * @Description: TODO(商品实体类)

 */
public class Items {
    
    /** 商品表主键Id */
    private Integer id;
    /** 商品名称 */
    private String itemsName;
    /** 商品定价 */
    private float price;
    /** 商品描述 */
    private String detail;
    /** 商品图片 */
    private String picture;
    /** 生产日期 */
    private Date createTime;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getItemsName() {
        return itemsName;
    }
    public void setItemsName(String itemsName) {
        this.itemsName = itemsName;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public String getDetail() {
        return detail;
    }
    public void setDetail(String detail) {
        this.detail = detail;
    }
    public String getPicture() {
        return picture;
    }
    public void setPicture(String picture) {
        this.picture = picture;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

}

7. 构建订单明细类

package com.mybatis.entity;

/**
 * @ClassName: OrderDetail
 * @Description: TODO(订单明细实体)

 */
public class OrderDetail {

    /** 主键,订单明细表Id */
    private Integer id;
    /** 订单Id */
    private Integer ordersId;
    /** 商品id */
    private Integer itemsId;
    /** 商品购买数量 */
    private Integer itemsNum;
    // 明细对应的商品信息
    private Items items;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getOrdersId() {
        return ordersId;
    }
    public void setOrdersId(Integer ordersId) {
        this.ordersId = ordersId;
    }
    public Integer getItemsId() {
        return itemsId;
    }
    public void setItemsId(Integer itemsId) {
        this.itemsId = itemsId;
    }
    public Integer getItemsNum() {
        return itemsNum;
    }
    public void setItemsNum(Integer itemsNum) {
        this.itemsNum = itemsNum;
    }
    public Items getItems() {
        return items;
    }
    public void setItems(Items items) {
        this.items = items;
    }
}

8. 第一步:构建查询接口OrdersCustomMapper.java


package com.orders.entity;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OrdersCustomMapper {
    
    /** 查询订单,关联查询用户信息 */
    public List<OrdersCustom> findOrdersUser();

	public List<Orders> findOrdersUserResultMap();

}

8. 第二步:构建对应的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">

<mapper namespace="com.orders.entity.OrdersCustomMapper">

<!-- 定义查询订单关联用户的 resultMap,将整个的查询结果映射到com.mybatis.entity.Orders中 -->
<resultMap type="com.orders.entity.Orders" id="OrdersUserResultMap">
    <!-- 1.配置映射的订单信息 -->
    <!-- id:查询列中的唯一标识,订单信息中的唯一标识,如果多列组成唯一标识(如:一般数据库设计中的字典表 使用联合主键),
        就需要配置多个id. 
        column:订单信息的唯一标识 列
        property:订单信息的唯一标识列所映射到orders中的那个属性(假如:数据库中orders表中的主键为orders_id,而实体属性名称
            为ordersId,则这个配置应为<id column="orders_id" property="ordersId"/>,类似hibernate实体映射文件配置)。
    -->
    <id column="id" property="id"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createTime"/>
    <result column="note" property="note"/>
    
    <!-- 2.配置映射的关联用户信息 -->
    <!--association:用于映射关联查询单个对象的信息
        property:要将关联查询的用户信息映射到Orders中那个属性
      -->
    <association property="user" javaType="com.orders.entity.User">
        <!-- id:关联查询用户的唯一标识 
            column:指定唯一标识用户信息的列
            property:映射到user的那个属性
        -->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
    </association>

</resultMap>


 <!-- 查询订单,关联查询用户信息 -->
 <select id="findOrdersUser" resultType="com.orders.entity.OrdersCustom">
     select t1.*,t2.username,t2.sex,t2.address from orders t1,t_user t2
     where t1.user_id = t2.id
 </select>

<!-- 查询订单,关联查询用户信息,使用resultMap实现 -->
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
    SELECT t1.*,t2.username,t2.sex,t2.address FROM orders t1,t_user t2
    WHERE t1.user_id=t2.id
</select>




</mapper>

9. 编写测试Controller类

package com.example.demo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.orders.entity.Orders;
import com.orders.entity.OrdersCustom;
import com.orders.entity.OrdersCustomMapper;

@RestController
@RequestMapping
public class OrderController {
	
	@Autowired
	private OrdersCustomMapper mapper;
   
   @RequestMapping("test")
   public void test(){
	   
	   List<OrdersCustom> findOrdersUser = mapper.findOrdersUser();
	   for (OrdersCustom orderCustom:findOrdersUser){
		   System.out.println(orderCustom);
	   }
	   System.out.println(findOrdersUser);
	   
	   List<Orders> findOrdersUserResultMap = mapper.findOrdersUserResultMap();
   }

}

10. 第一步:工程结构和启动类构建

第二步:构建启动类

package com;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class MybatisCurdApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisCurdApplication.class, args);
    }

}

11、测试结果


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2020-08-12 17:48:42.419  INFO 37484 --- [  restartedMain] com.MybatisCurdApplication               : Starting MybatisCurdApplication on LAPTOP-SKR0DDE6 with PID 37484 (started by cyb in D:\book\Spring-Boot-Book\08\MybatisCURD Page)
2020-08-12 17:48:42.422  INFO 37484 --- [  restartedMain] com.MybatisCurdApplication               : No active profile set, falling back to default profiles: default
2020-08-12 17:48:42.462  INFO 37484 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2020-08-12 17:48:42.462  INFO 37484 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2020-08-12 17:48:44.744  INFO 37484 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-08-12 17:48:44.773  INFO 37484 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-12 17:48:44.773  INFO 37484 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.16]
2020-08-12 17:48:44.784  INFO 37484 --- [  restartedMain] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Java\jdk1.8.0_211\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/Java/jre8/bin/server;D:/Java/jre8/bin;D:/Java/jre8/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Git\cmd;C:\Program Files\MySQL\MySQL Utilities 1.6\;D:\Java\jdk1.8.0_211\bin;D:\Java\jdk1.8.0_211\jre\bin;D:\mongoDB\Server\3.4\bin;C:\Users\cyb\AppData\Local\Microsoft\WindowsApps;;D:\soft\eclipse-jee-mars-2-win32-x86_64\eclipse-jee-mars-2-win32-x86_64\eclipse;;.]
2020-08-12 17:48:44.871  INFO 37484 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-12 17:48:44.871  INFO 37484 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2409 ms
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2020-08-12 17:48:45.029  INFO 37484 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-08-12 17:48:45.033  WARN 37484 --- [  restartedMain] com.zaxxer.hikari.util.DriverDataSource  : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.
2020-08-12 17:48:45.248  INFO 37484 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-08-12 17:48:45.281  INFO 37484 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2020-08-12 17:48:45.610  INFO 37484 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-08-12 17:48:45.943  INFO 37484 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-08-12 17:48:45.947  INFO 37484 --- [  restartedMain] com.MybatisCurdApplication               : Started MybatisCurdApplication in 3.795 seconds (JVM running for 4.139)
2020-08-12 17:48:49.309  INFO 37484 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-08-12 17:48:49.309  INFO 37484 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-08-12 17:48:49.314  INFO 37484 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
OrdersCustom [username=王五, sex=2, address=null]
OrdersCustom [username=王五, sex=2, address=null]
OrdersCustom [username=张三, sex=1, address=北京市]
OrdersCustom [username=张小明, sex=1, address=河南郑州]
OrdersCustom [username=陈小明, sex=1, address=河南郑州]
OrdersCustom [username=张三丰, sex=1, address=河南郑州]
OrdersCustom [username=陈小东, sex=1, address=河南郑州]
[OrdersCustom [username=王五, sex=2, address=null], OrdersCustom [username=王五, sex=2, address=null], OrdersCustom [username=张三, sex=1, address=北京市], OrdersCustom [username=张小明, sex=1, address=河南郑州], OrdersCustom [username=陈小明, sex=1, address=河南郑州], OrdersCustom [username=张三丰, sex=1, address=河南郑州], OrdersCustom [username=陈小东, sex=1, address=河南郑州]]
2020-08-12 21:03:14.347  WARN 37484 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=3h28s974ms927µs).
2020-08-13 09:41:24.264  WARN 37484 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=12h38m14s638ms642µs100ns).

实战总结:

1、resultType:

  作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。

  场合:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

2、resultMap

  使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

(1)association:

作用:将关联查询信息映射到一个pojo对象中。

场合:为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

(2)collection:

作用:将关联查询信息映射到一个list集合中。

场合:为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。如果使用resultType无法将查询结果映射到list集合中。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值