Part02 ☀️
Part02 ☀️
课程内容
- 使用
MybatisPlus
操作完成数据的增删改查Java操作数据库 - 完成商品检索服务
- 了解微服务架构和单体架构的区别以及SpringCloud的含义
- 创建购物车微服务
1. SpringBoot集成MybatisPlus
MybatisPlus框架

为什么要学习MybatisPlus框架:
- 提高开发效率:MybatisPlus框架提供了丰富的功能和工具,能够简化开发过程,减少样板代码的编写,从而提高开发效率。less code and less bug
- 优化数据库操作:MybatisPlus框架提供了一系列的优化策略和技巧能说出若干吗?,可以优化数据库操作性能,提升系统的响应速度和吞吐量。
- 社区支持和生态系统中国人写的,中文文档杠杠的!:MybatisPlus框架拥有庞大的用户社区和活跃的开发者群体,提供了大量的学习资源和技术支持。
应用场景:
- 数据库访问层:MybatisPlus框架主要用于简化数据库访问层的开发,提供了灵活的SQL映射配置和便捷的CRUD操作。 代码生成器:MybatisPlus框架内置了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper接口和XML映射文件,极大地提升了开发效率。
分页查询分页助手:MybatisPlus框架提供了方便的分页查询支持,可以轻松处理大量数据的分页查询需求。
逻辑删除假删除:MybatisPlus框架支持逻辑删除功能,可以方便地标记和查询已删除的数据,避免物理删除导致的数据丢失。
接下来,我们将在SpringBoot下集成Mybatis的使用完成需求1、需求2、需求3 👇 👇
代码操作
- SpringBoot项目工程创建完成后,在pom.xml文件中的dependencies标签内,导入Mybatis的起步依赖和MySQL驱动依赖
springboot parent版本:2.5+ 版本
<!-- lombok的依赖,能免除get和set方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!-- mybatisplus的起步依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mysql驱动包依赖 版本根据mysql安装版本:常见的5.1.47 和8.0.23 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 创建mybatis数据库,设置编码为utf-8mb4,创建user表,并导入一下假数据
-- 创建数据库 mybatis
create database if not exists mybatis;
-- 删除原有的user表
DROP TABLE IF EXISTS `user`;
-- 创建user表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL UNIQUE,
`password` varchar(32) NOT NULL DEFAULT '12345678',
`age` int(10) NOT NULL,
`hobby` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`department` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');
- 在application.yml配置文件下,配置数据库信息(驱动、链接、用户名、密码)
# 顶格写哦
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
#MybatisPlus配置 日志,驼峰,id策略
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
4.Idea链接Mysql
- 按照下图,连接数据库
5.根据图解创建controller service mapper domain包,并且将对应的类移动一下,如下图:👇

三层架构就是为了符合高内聚,低耦合 思想,把各个功能模块划分为表现层 、业务逻辑层 和数据访问层 三层架构,各层之间采用接口相互访问,并通过对象模型的实体类作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致
6.使用MybatisX小鸟插件,生成对应的service mapper 实体类的MybatisPlus代码
选择user表,右击选择MybatisX,弹出对话框步骤1-5
点击下一步后,继续完成步骤6-9
点击完成后,左侧的文件目录如下对应三层架构,找找对应的文件
需求1:查询id为20的用户,输出在控制台可以先自己分析
在UserController中直接导入对应的Service,就可以了
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/user")
public User getUserById(Integer id){
//模拟数据库查询,是假数据
// User user = new User();
// user.setId(id);
// user.setName("张三");
// user.setAge(20);
// user.setDescription("张三很帅");
// user.setDepartment("研发部");
// user.setHobby("打篮球");
//来自数据库中的真数据
User user = userService.getById(id);
return user;
}
}
运行截图

思考:对应的sql语句是什么?虽然不需要写sql,但是能够帮助理清思路哦!mybatisplus是全中文注释,可以找找对应的service中的有没有此类方法
思考:对应的sql语句是什么?虽然不需要写sql,但是能够帮助理清思路哦!mybatisplus是全中文注释,可以找找对应的service中的有没有此类方法
总结
课堂作业
- 参考MybatisPlus的需求1-3,完成对应的代码,将截图发群里哦 有加分的哦🎤
2. 完善商品服务
2.1 初始化项目环境
初始化项目环境

黑马商城是基于当下最流行的微服务架构开发的电商商城系统,旨在给用户一个高效,流畅的购物体验。
🎯 接下来,导入初始化工程,并且部署前端服务器,测试已有的登录接口,无问题后,开始微服务的学习!
已有的资料说明:

代码操作
相关信息
- 运行前端服务器代码,访问http://localhost:18080进行测试,观察是否有页面
- 导入后端代码到idea中,运行后,测试登录(用户名:Jack 密码:123456)
- 导入hmall.sql数据库脚本,初始化数据库
项目整体的架构:👇

从上图可以发现,这个项目的前端和后端是分离的,各自有对应的服务器,前端代码已经提前写好,直接运行nginx服务器即可
Nginx服务器:高性能的反向代理服务器,一般用来部署前端资源。
第一步: 将hmall-nginx.zip 压缩包解压到,全路径都是非中文的文件夹下

第二步 : 打开浏览器后,访问http://localhost:18080进行测试,观察是否有页面

如上图显示,说明运行成功!! 接下来可以导入数据库操作了。。。
本节的任务是导入黑马商城的初始化项目,并检查Maven配置,在完成下一步的数据库操作后,运行程序,完成登录操作
测试用户名:Jack 密码:123456
第一步: 将idea关闭project,进入欢迎页面(建议此时,检查maven设置)

第二步 :将资料中的hmall.zip 解压到全路径都是非中文目录中,然后点击idea的Open按钮,导入工程后




如果导入后,最终呈现上图的效果,说明已经导入成功了,解下来,修改数据库名字和密码等信息
第三步 :修改application.yaml配置文件中的数据库信息
修改成功后,不要急着运行,等待数据库导入完成!
本节的任务是导入hmall.sql到数据库中,数据库脚本文件较大大概有30多兆,主要里面有很多的商品
第一步: idea链接数据库mysql

第二步: 点击sql执行页面,输入图中的sql语句,创建hmall数据库


第三步: 导入hmall.sql数据库


第四步: 运行HMallApplication,启动类,在访问http://localhost:18080访问,点击左上角的登录,跳转到登录页,登录试试
测试用户名:Jack 密码:123456

发现可以登录哦,接下来开始完成商品模块功能
总结
课堂作业
- 参考上述步骤,完成项目的导入!,并且完成登录测试!!🎤
2.1 完成商品检索模块
完成商品检索模块
代码操作
步骤
- 使用MybatisX插件,生成对应的service和mapper层以及实体类代码
- 在Controller包下,创建SearchController接收检索请求,并参考接口文档的要求,书写一个方法,接受前端参数,并且返回响应
- 重新启动程序,测试检索产品
- 使用MybatisX插件,生成对应的service和mapper层以及实体类代码
商品展示的数据在数据库中是item表,因此要根据item表,生成对应的service和mapper层以及实体类代码,操作如下:👇
第一步: 右边选择item表,选择使用MybatisX插件,自动生成代码


点击完成后,生成的代码如上,接下来,可以写SearchController了
参考接口文档,完成Controller代码的书写,其中阅读接口注意事项为:
- 请求方式--> @GetMapping
- 请求参数--> ItemPageQuery实体类
- 返回值类型-->PageDTO数据传输对象
// 搜索请求的控制类
@RestController
public class SearchController {
@Autowired
private ItemService itemService;
@GetMapping("/search/list")
public PageDTO<Item> search(ItemPageQuery query) {
// 分页查询
Page<Item> result = itemService.lambdaQuery()
// 模糊查询 产品名字
.like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
// 精确查询 品牌
.eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
// 精确查询 分类
.eq(StrUtil.isNotBlank(query.getCategory()), Item::getCategory, query.getCategory())
// 状态 1为启用
.eq(Item::getStatus, 1)
// 价格区间
.between(query.getMaxPrice() != null, Item::getPrice, query.getMinPrice(), query.getMaxPrice())
// 排序
.page(query.toMpPage("update_time", false));
// 封装并返回
return PageDTO.of(result, Item.class);
}
}
注意,全称没写一条sql语句,但是运行成功后,请在控制台观察是否有sql语句的生成!!体会mp的特性!!
重新运行程序,开始测试

在输入框输入 硬盘,点击搜索,观察结果!!

如果结果如上,恭喜你,没有写任何的sql ,却完成了数据库的查询,你自己说,牛逼不牛逼!
3. 认识微服务3
截止到现在,我们安装了环境,也导入了初始单体项目,并且还写了一个接口
接下来,我们来了解下单体架构、微服务 以及SpringCloud等相关概念吧!!
认识微服务
单体架构(monolithic structure)
顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。

当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。
但随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:
- 团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。
- 系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。
- 系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。
微服务架构
首先是服务化,就是将单体架构中的功能模块从单体应用中拆分 出来,独立部署 为多个服务。
同时要满足下面的一些特点:
- 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。
- 团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过 10 人
- 服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响
例如,黑马商城项目,我们就可以把商品、用户、购物车、交易
等模块拆分,交给不同的团队去开发,并独立部署(如下图👇)

那么,单体架构存在的问题有没有解决呢?
团队协作成本高?
- 由于服务拆分,每个服务代码量大大减少,参与开发的后台人员在1~3名,协作成本大大降低👌
系统发布效率低?
- 每个服务都是独立部署,当有某个服务有代码变更时,只需要打包部署该服务即可 👌
系统可用性差?
- 每个服务独立部署,并且做好服务隔离,使用自己的服务器资源,不会影响到其它服务。 👌
综上所述,微服务架构解决了单体架构存在的问题,特别适合大型互联网项目的开发,因此被各大互联网公司普遍采用。🀄🀄
微服务拆分以后碰到的各种问题 都有对应的解决方案和微服务组件,而 SpringCloud
框架可以说是目前Java 领域最全面的微服务
组件的集合。
官网:https://spring.io/projects/spring-cloud

Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、熔断器、智能路由、微代理)

SpringCloud 依托于 SpringBoot 的
自动装配
能力,大大降低
了其项目搭建、组件使用的成本
。对于没有自研微服务组件能
力的中小型企业
,使用 SpringCloud全家桶来实现微服务开发可以说是最合适
的选择!
Alibaba 的微服务产品 SpringCloudAlibaba
目前也成为了 SpringCloud 组件中的一员,我们也会使用其中的部分组件。

阿里的官网:https://sca.aliyun.com/zh-cn/ 👈 打开速度快
在我们的父工程 hmall
中已经配置了 SpringCloud 以及 SpringCloudAlibaba
的依赖:

我们使用阿里巴巴提供的解决方案来解决微服务项目中的各类问题!!
总结
课堂提问
单体架构的优缺点是什么?🎤
微服务架构有什么特点?他是怎么解决单体架构的存在的问题的?🎤
微服务架构虽然能解决单体架构的各种问题,但在拆分的过程中,还会面临哪些问题?🎤
SpringCloud是什么? 🎤
SpringCloudAlibaba是什么,和SpringCloud有什么关系?是哪家公司开发的? 🎤
4. 构建购物车微服务
构建购物车微服务
代码操作
步骤
- 在hmall父工程下,创建一个新的模块,名字为:
cart-service
- 在
cart-service
模块中的pom文件中,添加依赖 - 在java包下,创建com.hmall.cart包,并创建启动类CartApplication,并且在类上添加MapperScan注解,并且创建配置文件application.yaml
- 在CartApplication启动类的同级目录分别创建controller、service、mapper,以及domain包
- 使用Mybatis代码生成器,生成service、mapper和实体类等代码
- 在controller包中创建CartController类,写一个方法获取查看购物车的请求。
- 运行测试,观察是否能查询到userId=1的用户的购物车列表
第一步:创建微服务
与商品服务类似,在 hmall 下创建一个新的 module
,起名为 cart-service
:


添加依赖,可以直接复制item-service中的依赖dependencies和插件build
第二步:添加依赖
<?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>com.heima</groupId>
<artifactId>hmall</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>cart-service</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--加密-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-rsa</artifactId>
<version>1.0.9.RELEASE</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第三步:创建启动类
package com.hmall.cart;
@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
public class CartApplication {
public static void main(String[] args) {
SpringApplication.run(CartApplication.class, args);
}
}

第四步: 是配置文件,同样可以拷贝自 item-service
,不过其中的 application.yaml
需要修改:
# 顶格写
server:
port: 8081
spring:
application:
name: cart-service
datasource:
url: jdbc:mysql://localhost:3306/hmall?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null # 修改字段策略
id-type: auto # 主键策略
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
第五步 :选择Idea右边的database数据库,选择cart表,点击生成对应的service mapper 和实体类这是上一个案例的技法
本案例我们使用代码生成器生成所需的代码
5.1 导入自动生成代码所需的依赖到 cart-service下的pom文件
<!-- 生成器,版本和mp一致 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!--velocity模板-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<!--freemarker模板-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
5.2 导入代码生成类到启动类的同名目录,代码如下: 👇
/**
根据下列的注释,点击启动,可以生成代码
*/
public class MybatisPlusG {
public static void main(String[] args) {
// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create("jdbc:mysql://localhost:3306/hmall?serverTimezone=GMT%2B8", "root", "1234")
.globalConfig(builder -> {
builder.author("yangeit") // 设置作者
.outputDir("D:\\itcast\\subject_java\\taishanschool\\day02\\hmall\\cart-service\\src\\main\\java"); // 输出目录
})
.packageConfig(builder -> {
builder.parent("com.hmall.cart") // 设置父包名
.entity("domain.po") // 设置实体类包名
.mapper("mapper") // 设置 Mapper 接口包名
.service("service") // 设置 Service 接口包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
.xml("mapper");
})
.strategyConfig(builder -> {
builder.addInclude("cart") // 设置需要生成的表名
.entityBuilder()
.enableLombok() // 启用 Lombok
.enableTableFieldAnnotation() // 启用字段注解
.controllerBuilder()
.enableRestStyle(); // 启用 REST 风格
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
.execute(); // 执行生成
}
}

箭头对应的是映射文件夹
第六步:在controller包中创建CartController类,写一个方法接受前端查看购物车的请求
前端的请求:

@RestController
public class CartController {
@Autowired
private ICartService cartService;
@GetMapping("/carts")
public List<Cart> queryMyCarts(){
// 1.查询我(JacK的Id为1)的购物车列表
List<Cart> carts = cartService.lambdaQuery().eq(Cart::getUserId, 1L).list();
if (CollUtil.isEmpty(carts)) {
return CollUtil.newArrayList();
}
return carts;
}
}
运行CartApplication启动类,访问链接 http://localhost:8081/carts
测试是否能查到jack的购物车数据?

可以看到,可以访问!!
总结
课堂作业
- 参考上述步骤,完成购物车模块的创建和代码编写!!,bing🎤
思考?

- 为什么cart-service和item-service不能同时使用一个端口8080?
- 前端访问的端口是18080,怎么后端是8080,这个流程是怎样的?
- cart-service展示的购物车数据万一商品服务的商品价格变了,或者已经卖光了咋办?
- 目前购物车和商品服务分别是1台服务器,随着双十一的来临,请问哪一种服务器的数量上升的最多???