1.商品分类表设计
1.需求分析
2.数据库表设计
1.数据库sunliving_commodity,商品分类表commodity_category
create database sunliving_commodity;
use sunliving_commodity;
CREATE TABLE `commodity_category`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` CHAR(50) NOT NULL COMMENT '名称',
`parent_id` BIGINT NOT NULL COMMENT '父分类 id',
`cat_level` INT NOT NULL COMMENT '层级',
`is_show` TINYINT NOT NULL COMMENT '0 不显示,1 显示]',
`sort` INT NOT NULL COMMENT '排序',
`icon` CHAR(255) NOT NULL COMMENT '图标',
`pro_unit` CHAR(50) NOT NULL COMMENT '统计单位',
`pro_count` INT NOT NULL COMMENT '商品数量',
PRIMARY KEY (`id`)
) CHARSET = utf8mb4 COMMENT ='商品分类表';
SELECT *
FROM commodity_category;
2.测试数据
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (1, '家用电器', 0, 1, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (21, '大 家 电', 1, 2, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (22, '厨卫大电', 1, 2, 1, 0, '', '', 0);
INSERT INTO `commodity_category` (`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (201, '燃气灶', 22, 3, 1, 0, '', '', 0),
(202, '油烟机', 22, 3, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (301, '平板电视', 21, 3, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (2, '家居家装', 0, 1, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (41, '家纺', 2, 2, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (601, '桌布/罩件', 41, 3, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (602, '地毯地垫', 41, 3, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (42, '灯具', 2, 2, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (651, '台灯', 42, 3, 1, 0, '', '', 0);
INSERT INTO `commodity_category`(`id`, `name`, `parent_id`, `cat_level`, `is_show`, `sort`, `icon`, `pro_unit`,
`pro_count`)
VALUES (652, '节能灯', 42, 3, 1, 0, '', '', 0);
select * from commodity_category;
2.代码生成器生成crud
1.解压到sunliving下并聚合管理
1.解压
2.修改sunliving的pom.xml进行聚合管理
3.刷新maven报错 parent.relativePath
- 这个问题的原因是将这个模块交给了sunliving进行聚合管理,但是并没有设置parent为它
4.将这个代码生成器模块的pom.xml的parent替换为跟sunliving-commodity一致的
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/>
</parent>
5.再次刷新,没有报错
2.对代码生成器进行配置
1.修改application.yml的mysql配置信息
- 这里连接sunliving_commodity数据库,也就是家居分类表所在的数据库
driverClassName: com.mysql.cj.jdbc.Driver
url:
username: root
password: root
2.修改generator.properties的配置信息
#主路径
mainPath=com.sun
#代码生成的包
package=com.sun.sunliving
#模块名字
moduleName=commodity
#作者
author=sun
#邮箱
email=sunxiansehng@gmail.com
#表的前缀
tablePrefix=commodity_
3.启动代码生成器的服务
1.由于端口冲突所以application.yml修改端口为81
2.启动成功之后访问 http://localhost:81/ 可以看到刚才配置的表
4.配置services
1.点击加号
2.选择springboot
3.出现仪表盘管理微服务
3.生成crud代码
1.选中表,点击生成代码
2.会生成一个压缩包
3.解压到桌面,里面有一个main文件夹
4.将这个main替换sunliving-commodity模块的main目录
5.查看生成的代码,此时有报错是正常的
4.梳理MyBatisPlus的结构
1.entity层
1.位置
2.解析
- @Data:生成 getter setter toString 方法,也包含默认的无参构造
- @TableName(“commodity_category”):实体类的名字跟表名不一样,所以需要映射
- @TableId:指定主键,这里其实不指定也可以,因为MyBatisPlus会默认按照id或者Id来寻找主键
- 注意:MyBatisPlus是默认开启驼峰命名法的,所以如果数据表是带下划线的就可以在entity中按照驼峰来映射
- MyBatis与MyBatisPlus有一个区别就是,MyBatisPlus生成的CRUD代码都需要依赖于实体类与表字段的映射,而MyBatis只有查询才需要映射,因为增删改都是直接指定的数据库字段
2.dao层
1.位置
2.Mapper接口解析
- @Mapper:注入容器
- extends BaseMapper:继承BaseMapper并指定实体类型,则继承的接口方法全是对实体类型进行操作的
- 方法使用方式:依赖注入针对CategoryDao接口的代理对象,则在调用方法时会自动调用MyBatisPlus中实现CategoryDao接口的方法
- 如果有需要自定义的方法,就在这里增加然后去Mapper.xml里实现即可,使用方式不变
3.Mapper.xml解析
- 需要在application.yml中配置扫描这个xml文件
- namespace:指定要实现的Mapper接口
- resultMap:指定查询后的结果映射到实体类
- 如果在Mapper接口中有自定义的方法,可以在这里实现,然后通过依赖注入针对Mapper接口的代理对象,调用自定义的方法,就会自动找到这里实现的方法并且执行
3.service层
1.位置
2.service接口解析
- extends IService:继承IService并制指定实体类型,则继承的接口方法全是对实体类型进行操作的
- 方法使用方式:依赖注入针对CategoryService接口的实现类的对象,则在调用方法时会自动调用MyBatisPlus中实现CategoryService接口的方法
- 如果有需要自定义的方法,就在这里增加然后去实现类里实现即可,使用方式不变
3.service实现类解析
- @Service(“categoryService”):注入容器bean的名字是categoryService,其实不指定名字也不影响,因为在使用的时候是根据接口类型找到这个实现类的bean对象的
- implements CategoryService:实现service接口的方法,但是目前这个实现类是空的
- extends ServiceImpl<CategoryDao, CategoryEntity>:继承ServiceImpl的方法,并指定dao层Mapper接口的类型和实体类型,表示这个实现类要实现对实体类型操作的方法,并且还需要依赖注入Mapper接口的代理对象来调用dao层的方法,只是进行了扩展而已
- 如果在service接口中有自定义的方法,可以在这里实现,可以依赖注入Mapper接口的代理对象,调用dao层的方法,然后通过依赖注入针对service接口的实现类对象,调用自定义的方法,就会自动找到这里实现的方法并且执行
4.controller层
1.位置
2.解析
- controller层的核心就是 url,参数,返回值
- @RestController:注入容器,使返回类型为json类型
- @RequestMapping(“commodity/category”):url的前缀
- @Autowired:依赖注入service接口的实现类对象,可以调用service层的方法
- @RequestMapping(“/list”):指定url
- @RequestParam Map<String, Object> params:可以使用表单或者url的形式传递参数
- 需要注意的是在微服务中@RequestParam或者@RequestBody至少添加一个,一般:
- @GetMapping添加@RequestParam,接受请求方式为url或表单
- @PostMapping添加@RequestBody,接受请求方式为json类型
- 当然,@GetMapping还可以添加@PathVariable路径参数
- 返回的R就对应之前写过的Result,封装了返回的对象
5.创建公共模块
1.创建新模块 sunliving-common
2.检查父子pom.xml
3.删除不必要的两个文件夹
4.创建基本结构
5.从renren-fast提取以下几个文件放到 sunliving-common 对应位置
1.src/main/java/io/renren/common
2.放到src/main/java/com/sun/common
3.注意:每次粘贴完成之后都要检查一下是不是指向的当前包,比如
6.pom.xml 引入公共模块需要的依赖
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.12</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
7.检查公共模块报错,依次处理
1.Query.java报错,是包引的不对,删除,自动引入
2.SQLFilter.java也是
3.Query.java报错,语言级别的问题
4.修改java的编译版本为1.8
5.修改modules的语言级别,但是需要注意,只要重新编译还是要设置,只是临时解决方案
6.R.java报错,缺少@Override注解,加上即可
7.最后重新检查这个公共模块确保没有报错
6.sunliving-commodity 引入公共模块 sunliving-common
1.pom.xml引入公共模块,然后刷新maven
<dependency>
<groupId>com.sun.sunliving</groupId>
<artifactId>sunliving-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.此时sunliving-commodity模块的CategoryController.java报错
1.Cannot resolve symbol ‘RequiresPermissions’
2.这个是shiro的注解,我们不使用,全部注销
3.刷新maven,此时没有任何错误(其实sunliving-common的那个语言级别还有问题,暂时不管)
3.整合sunliving-commodity和MyBatisPlus
1.在sunliving-common 模块引入mysql驱动(因为多个模块都要用)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
2.刷新maven,renren-fast报错,还是因为父项目不是sunliving,添加一个属性即可
3.配置application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url:
username: root
password: root
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
server:
port: 9090
4.创建主启动类 com/sun/sunliving/commodity/SunlivingCommodityApplication.java
package com.sun.sunliving.commodity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SunlivingCommodityApplication {
public static void main(String[] args) {
SpringApplication.run(SunlivingCommodityApplication.class, args);
}
}
5.启动测试
1.报错 java: -source 1.5 中不支持 diamond 运算符
- 这个报错一看就是刚才没处理完全的语言级别的问题
- 如果使用之前的方式处理,只要maven刷新就失效了
2.在sunliving-common模块修改pom.xml来彻底解决编译版本问题,顺便把sunliving-commodity的也改了
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
然后再检查一下
3.再次启动,报错,9090端口被占用
4.修改application.yml的端口为9091
5.再次启动,成功
6.使用postman测试
1.测试 http://localhost:9091/commodity/category/list
2.测试 http://localhost:9091/commodity/category/info/1
3.测试 http://localhost:9091/commodity/category/save
{
"name": "Sample Category",
"parentId": 4,
"catLevel": 1,
"isShow": 1,
"sort": 1,
"icon": "sample-icon.png",
"proUnit": "pcs",
"proCount": 100
}
4.测试 http://localhost:9091/commodity/category/update
{
"name": "Sample Category",
"parentId": 4,
"catLevel": 1,
"isShow": 1,
"sort": 1,
"icon": "sample-icon.png",
"proUnit": "pcs====================",
"proCount": 100
}
5.测试 http://localhost:9091/commodity/category/delete
6.提交代码:家居分类表设计以及代码生成器的使用!