Mybatis-一对一查询

商品订单数据模型
 
/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `items` */

CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` 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`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Table structure for table `orderdetail` */

CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) 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
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) 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 `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Table structure for table `user` */

CREATE TABLE `user` (
  `id` int(11) 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`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
学会在企业中如何去分析陌生表的数据模型:
1 、学习单表记录了什么东西(去学习理解需求)
2 、学习单表重要字段的意义(优先学习不能为空的字段)
3 、学习表与表之间的关系(一对一、一对多、多对多)
通过表的外键分析表之间的关系
注意:分析表与表之间的关系时是要建立在具体 的业务意义基础之上
 
用户表 user
记录了购买商品的用户
 
 
订单表 orders
记录了用户所创建的订单信息
 
订单明细表orderdetail
记录了用户创建订单的详细信息
 
 
商品信息表items
记录了商家提供的商品信息
 
 
分析表与表之间的关系:
 
用户 user 和订单 orders
 
user---->orders :一个用户可以创建多个订单   一对多
orders-->user :一个订单只能由一个用户创建  一对一
 
订单 orders 和订单明细 orderdetail
orders-->orderdetail :一个订单可以包括多个订单明细  一对多
orderdetail-->orders :一个订单明细只属于一个订单  一对一
 
订单明细 orderdetail 和商品信息 items
 
orderdetail-->items :一个订单明细对应一个商品信息 一对一
items--> orderdetail :一个商品对应多个订单明细  一对多

一对一查询
1.1  需求
查询订单信息关联查询用户信息
 
1.2 sql 语句
查询语句:
先确定主查询表:订单信息表
再确定关联查询表:用户信息
通过 orders 关联查询用户使用 user_id 一个外键,只能关联查询出一条用户记录就可以使用内连接
SELECT
  orders.*,
  user.username,
  user.sex
FROM
  orders,
  USER
WHERE orders.user_id = user.id

1.3  使用 resultType 实现
 
1.3.1  创建 po
基础的单表的 po 类:

1.3.2  一对一查询映射的 pojo
 
创建 pojo 包括 订单信息和用户信息, resultType 才可以完成映射。
 
创建 OrderCustom 作为自定义 pojo ,继承 sql 查询列多的 po 类。

注意:记得提供set/get方法 
 
 
1.3.3 mapper.xml
定义 mapper.xml 文件,
 
1.3.4 mapper.java
 

1.4  使用 resultMap 实现一对一

1.4.1 resultMap 映射思路
resultMap 提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将关联查询的信息映射到 pojo 中,如下:
Orders 类中创建一个 User 属性,将关联查询的信息映射到 User 属性中。
注意:记得提供set/get方法 
 
1.4.2 mapper.xml


1.4.3 resultMap 定义

1.4.4 mapper.java
 
1.5  小结
resultType :要自定义 pojo 保证 sql 查询列和 pojo 的属性对应,这种方法相对较简单,所以应用广泛。
 
resultMap :使用 association 完成一对一映射需要配置一个 resultMap ,过程有点复杂,如果要 实现延迟加载就只能用 resultMap 实现 ,如果为了方便对关联信息进行解析,也可以用 association 将关联信息映射到 pojo 中方便解析。



MyBatis-Plus是一款MyBatis的增强工具,它提供了很多实用的功能,比如一对多的关联查询。在MyBatis-Plus中,一对多的关联查询可以通过使用@TableName注解和@TableField注解来实现。 假设我们有两张,一张是学生,另一张是课程,一个学生可以选多门课程,那么我们就可以用一对多关联查询查询某个学生选的所有课程。 首先,在学生中定义一个属性List<Course> courses,并使用@TableField注解将该属性与课程的外键关联起来: ``` public class Student { @TableId private Long id; private String name; @TableField(exist = false) private List<Course> courses; } ``` 然后,在课程中定义一个属性Long studentId,并使用@TableField注解将该属性与学生的主键关联起来: ``` public class Course { @TableId private Long id; private String name; @TableField("student_id") private Long studentId; } ``` 最后,我们使用MyBatis-Plus提供的wrapper类进行关联查询: ``` QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", studentId); List<Student> students = studentMapper.selectList(queryWrapper); for (Student student : students) { QueryWrapper<Course> courseQueryWrapper = new QueryWrapper<>(); courseQueryWrapper.eq("student_id", student.getId()); List<Course> courses = courseMapper.selectList(courseQueryWrapper); student.setCourses(courses); } ``` 以上就是MyBatis-Plus实现一对多关联查询的方法。如果您还有其他问题或需要进一步的帮助,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值