Part02 ☀️

YangeIT大约 23 分钟JDKIdeaMavenMySQLSpringBootMybatisPlus

Part02 ☀️

课程内容

  • 使用MybatisPlus操作完成数据的增删改查Java操作数据库
  • 完成商品检索服务
  • 了解微服务架构和单体架构的区别以及SpringCloud的含义
  • 创建购物车微服务

1. SpringBoot集成MybatisPlus

MybatisPlus框架

代码操作

  1. 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>

  1. 创建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', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');

  1. 在application.yml配置文件下,配置数据库信息(驱动、链接、用户名、密码)

点击查看详细步骤open in new window

# 顶格写哦
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

  1. 按照下图,连接数据库 image

5.根据图解创建controller service mapper domain包,并且将对应的类移动一下,如下图:👇

image
image

三层架构就是为了符合高内聚,低耦合 思想,把各个功能模块划分为表现层 业务逻辑层 数据访问层 三层架构,各层之间采用接口相互访问,并通过对象模型的实体类作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致image

6.使用MybatisX小鸟插件,生成对应的service mapper 实体类的MybatisPlus代码

  • 选择user表,右击选择MybatisX,弹出对话框步骤1-5image

  • 点击下一步后,继续完成步骤6-9image

  • 点击完成后,左侧的文件目录如下对应三层架构,找找对应的文件image

总结

课堂作业

  1. 参考MybatisPlus的需求1-3,完成对应的代码,将截图发群里哦 有加分的哦🎤

2. 完善商品服务

2.1 初始化项目环境

初始化项目环境

image
image

黑马商城是基于当下最流行的微服务架构开发的电商商城系统,旨在给用户一个高效,流畅的购物体验。

🎯 接下来,导入初始化工程,并且部署前端服务器,测试已有的登录接口,无问题后,开始微服务的学习!

已有的资料说明:

image
image

代码操作

相关信息

  1. 运行前端服务器代码,访问http://localhost:18080进行测试,观察是否有页面
  2. 导入后端代码到idea中,运行后,测试登录(用户名:Jack 密码:123456)
  3. 导入hmall.sql数据库脚本,初始化数据库

项目整体的架构:👇

image
image

从上图可以发现,这个项目的前端和后端是分离的,各自有对应的服务器,前端代码已经提前写好,直接运行nginx服务器即可

Nginx服务器:高性能的反向代理服务器,一般用来部署前端资源。

第一步: 将hmall-nginx.zip 压缩包解压到,全路径都是非中文的文件夹下

image
image

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

image
image

如上图显示,说明运行成功!! 接下来可以导入数据库操作了。。。

总结

课堂作业

  1. 参考上述步骤,完成项目的导入!,并且完成登录测试!!🎤

2.1 完成商品检索模块

完成商品检索模块

image
image

点击首页的搜索,进入搜索页面,可以输入 关键字 进行检索,如下图:

所有的接口文档如下: image

点击查看接口文档

代码操作

步骤

  1. 使用MybatisX插件,生成对应的service和mapper层以及实体类代码
  2. 在Controller包下,创建SearchController接收检索请求,并参考接口文档的要求,书写一个方法,接受前端参数,并且返回响应
  3. 重新启动程序,测试检索产品
  1. 使用MybatisX插件,生成对应的service和mapper层以及实体类代码

商品展示的数据在数据库中是item表,因此要根据item表,生成对应的service和mapper层以及实体类代码,操作如下:👇

第一步: 右边选择item表,选择使用MybatisX插件,自动生成代码

image
image
image
image

点击完成后,生成的代码如上,接下来,可以写SearchController了

3. 认识微服务3

截止到现在,我们安装了环境,也导入了初始单体项目,并且还写了一个接口

接下来,我们来了解下单体架构、微服务 以及SpringCloud等相关概念吧!!

认识微服务

单体架构(monolithic structure)

顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。

image
image
  1. 当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。

  2. 但随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题

    • 团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。
    • 系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。
    • 系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。

总结

课堂提问

  1. 单体架构的优缺点是什么?🎤

  2. 微服务架构有什么特点?他是怎么解决单体架构的存在的问题的?🎤

  3. 微服务架构虽然能解决单体架构的各种问题,但在拆分的过程中,还会面临哪些问题?🎤

  4. SpringCloud是什么? 🎤

  5. SpringCloudAlibaba是什么,和SpringCloud有什么关系?是哪家公司开发的? 🎤

4. 构建购物车微服务

构建购物车微服务

黑马商城是类似京东open in new window的电商商城系统,旨在给用户一个高效,流畅的购物体验,

主要模块:image

本节完成购物车模块的构建

代码操作

步骤

  1. 在hmall父工程下,创建一个新的模块,名字为:cart-service
  2. cart-service模块中的pom文件中,添加依赖
  3. 在java包下,创建com.hmall.cart包,并创建启动类CartApplication,并且在类上添加MapperScan注解,并且创建配置文件application.yaml
  4. 在CartApplication启动类的同级目录分别创建controller、service、mapper,以及domain包
  5. 使用Mybatis代码生成器,生成service、mapper和实体类等代码
  6. 在controller包中创建CartController类,写一个方法获取查看购物车的请求。
  7. 运行测试,观察是否能查询到userId=1的用户的购物车列表

第一步:创建微服务

与商品服务类似,在 hmall 下创建一个新的 module,起名为 cart-service:

image
image
image
image

添加依赖,可以直接复制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);
    }
}
创建购物车服务_2
创建购物车服务_2

第四步: 是配置文件,同样可以拷贝自 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}"





 


 






















总结

课堂作业

  1. 参考上述步骤,完成购物车模块的创建和代码编写!!,bing🎤

思考?

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