主流程设计
提前测试准备Navicat创建数据库链接
数据库名称CRM_Test
字符集:
utf8mb4
排序规则
utf8mb4_0900_as_cs
创建用户表
CREATE TABLE user(
id INT NOT NULL AUTO_INCREMENT COMMENT '主键',
login_name VARCHAR(255) NOT NULL COMMENT '登录名(账号)',
password VARCHAR(255) NOT NULL COMMENT '密码',
name varchar(50) NOT NULL COMMENT '姓名',
sex char(1) NOT NULL COMMENT '性别',
phone VARCHAR(20) COMMENT '联系电话',
PRIMARY KEY(id)
)COMMENT '用户信息表';
SpringBoot后端
MySql环境整合 druid连接池
重新启动 Maven 构建
mvn clean install
yml格式文件添加注释方法
#注释
xml格式文件添加注释方法
<!--注释-->
1.添加jdbc依赖
org.springframework.boot spring-boot-starter-jdbc 2.添加druid依赖
com.alibaba druid-spring-boot-3-starter 1.2.20 3.配置端口号
配置项目端口号 server: port: 8099
4.配置数据源和druid连接池
spring: # 数据源 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/base_manage?serverTimezone=UTC username: root password: root
MyBatis-Plus环境整合 代码生成器整合
1.添加依赖
com.baomidou mybatis-plus-spring-boot3-starter 3.5.5 2.配置
# mybatis-plus mybatis-plus: configuration: # sql日志, 开发调试时开启 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto
3.配置代码生成器(作用看day3)
com.baomidou mybatis-plus-generator 3.5.5 org.springframework.boot spring-boot-starter-freemarker 4.添加代码生成器配置类
package com.buzhisuoyun.base_manage.utils; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import java.io.File; import java.sql.Types; import java.util.Collections; public class MybatisPlusGenerator { static final String url = "jdbc:mysql://127.0.0.1:3306/base_manage?serverTimezone=UTC"; // 数据库地址 static final String username = "root"; // 数据库用户名 static final String password = "root"; // 数据库密码 static final String authorName = "buzhisuoyun"; // 作者名 static final String parentPackageNameResource = "com/buzhisuoyun/base_manage"; // mapper.xml路径 static final String parentPackageNameJava = "com.buzhisuoyun.base_manage"; // java 文件父包名 // 要生成代码对应的数据表名 static final String tableName = "user"; public static void main(String[] args) { FastAutoGenerator.create(url, username, password) // 1.全局配置 .globalConfig(builder -> { builder.author(authorName) // 设置作者 .enableSpringdoc() // 开启 swagger 模式 // 获取当前工程路径并定位到项目java目录下 .outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录 }) // 2.数据源配置 .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> { int typeCode = metaInfo.getJdbcType().TYPE_CODE; if (typeCode == Types.SMALLINT) { // 自定义类型转换 return DbColumnType.INTEGER; } return typeRegistry.getColumnType(metaInfo); })) // 3.包名策略配置 .packageConfig(builder -> { builder.parent(parentPackageNameJava) // 设置父包名 .entity("entity") .mapper("mapper") .service("service") .serviceImpl("service.impl") .controller("controller") //.moduleName("system") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/" + parentPackageNameResource + "/mapper")); // 设置mapperXml生成路径 }) // 策略配置 .strategyConfig(builder -> { builder.addInclude(tableName) // 设置需要生成的表名 // 覆盖已生成文件 .entityBuilder().enableFileOverride() .mapperBuilder().enableFileOverride() .serviceBuilder().enableFileOverride().formatServiceFileName("%sService"); //.addTablePrefix("t_", "c_"); // 设置过滤表前缀 }) // 配置模板 .templateConfig(builder -> { //builder.controller(""); // 不生成controller }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }
5.配置分页插件(作用看DAY3)
package com.buzhisuoyun.base_manage.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("com/buzhisuoyun/base_manage/mapper") public class MybatisPlusConfig { /** * 添加分页插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加 //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType return interceptor; } }
Swagger3(knife4j)环境整合
1.引入依赖
com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.5.0 2.配置
# springdoc-openapi 配置 springdoc: swagger-ui: path: /swagger-ui.html tags-sorter: alpha operations-sorter: alpha api-docs: path: /v3/api-docs group-configs: - group: 'default' paths-to-match: '/**' packages-to-scan: com.buzhisuoyun.base_manage # knife4j 配置 knife4j: # 是否启用增强 enable: true # 开启生产环境屏蔽 production: false # 是否认证登录 basic: # basic是否开启,默认为false enable: true username: knife4j password: knife4j setting: language: zh_cn enable-version: true enable-swagger-models: true
在config下创建配置类
package com.buzhisuoyun.base_manage.config; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class Knife4jConfig { @Bean public OpenAPI springShopOpenApi() { return new OpenAPI() // 接口文档标题 .info(new Info().title("接口文档") .description("api接口文档") .version("1.0版本") ); } }
配置完后,启动项目,可访问路径http://localhost:8099/doc.html,用户名密码就是配置文件中的
数据交互处理
1.封装返回数据封装类,放到common包下
package com.buzhisuoyun.base_manage.common; import io.swagger.v3.oas.annotations.media.Schema; public class Result
{ @Schema(description = "业务状态码 0:成功 1: 失败") private int code; // 业务状态码 0:成功 1: 失败 @Schema(description = "提示信息") private String message; // 提示信息 @Schema(description = "返回数据") private T data; // 响应数据 public Result(int code, String message, T data) { this.code = code; this.message = message; this.data = data; } // 操作成功返回响应结果(带响应数据) public static Result success(E data) { return new Result<>(0, "操作成功", data); } public static Result success() { return new Result<>(0, "操作成功", null); } public static Result error(String message) { return new Result<>(1, message, null); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public String toString() { return "Result{" + "code=" + code + ", message='" + message + '\'' + ", data=" + data + '}'; } } 2.分页查询返回数据封装
package com.buzhisuoyun.base_manage.common; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; public class PageResultBean
{ @Schema(description = "数据总条数") private Long total; @Schema(description = "当前页数据集合") private List items; public PageResultBean() { } public PageResultBean(Long total, List items) { this.total = total; this.items = items; } public static PageResultBean getInstance(Long total, List items) { return new PageResultBean<>(total, items); } public Long getTotal() { return total; } public void setTotal(Long total) { this.total = total; } public List getItems() { return items; } public void setItems(List items) { this.items = items; } }
全局异常处理
创建xception包,在包下放全局异常处理类GlobalExceptionHandler.java
package com.buzhisuoyun.base_manage.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
// 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
public Result<String> handlerException(Exception e) {
logger.warn(e.getMessage());
return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
}
}
整合JWT,生成token(密码验证)
封装ThreadLocal 工具类
MD5封装
登录验证拦截
Radis整合
什么是Radis看DAY3
1.引入依赖
org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 2.6.0 2.配置文件
spring: redis: host: 自己的ip port: 自己的端口号 默认 6379 #Redis使用的数据库 database: 0 #连接超时事件毫秒 timeout: 18000 lettuce: pool: #连接池最大连接数 max-active: 20 #最大阻塞等待时间 max-idle: 5 #连接池最小空闲连接 min-idle: 0
3.RedisTemplate模版序列化配置
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { /** * redis序列化的工具配置类,下面这个请一定开启配置 * 127.0.0.1:6379 keys * * 1)"ord:102" 序列化过 * 2)"\xac\xed\x00\x05t\ord:102" 没有序列化过 * this.redisTemplate.opsForValue()//提供了操作String类型的所有方法 * this.redisTemplate.opsForList()//提供了操作List类型的所有方法 * this.redisTemplate.opsForSet()//提供了操作Set类型的所有方法 * this.redisTemplate.opsForHash()//提供了操作Hash类型的所有方法 * this.redisTemplate.opsForZSet()//提供了操作ZSet类型的所有方法 * * * @param lettuceConnectionFactory * @return */ @Bean public RedisTemplate
redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){ RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); //设置key序列化方式String redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认的序列化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
开发过程所用名称和密码记录
所用端口号8099
数据库用户名以及密码
用户名:root
密码:123456789
MyBatis-Plus代码生成器参数
- url : jdbc:mysql://127.0.0.1:3306/crm_test?serverTimezone=UTC数据库地址
- user:root 数据库用户名
- password : 123456789 数据库密码
- authorName:zjkoye 作者名 方便查看(无功能性作用)
- parentPackageNameResource: org/zjkoye/crm // mapper.xml路径
- parentPackageNameJava = "org.zjkoye.crm"; // java 文件父包名
- tableName = "user"要生成代码对应的数据表名
knife4j 用户名密码配置
username: knife4j
password: knife4j
设计参考
主流程设计参考:
从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用-CSDN博客
学习文件参考
Druid连接池的作用
MyBatis-plus的作用以及如何使用
使用:
MyBatis-Plus快速入门指南:零基础学习也能轻松上手 (baidu.com)
作用:
MybatisPlus代码生成器_mybatisplus 代码生成器-CSDN博客
Radis
DAY 3 重构整合后端
添加Druid连接池的作用
文献看上文
概要什么是Druid
Druid是阿里巴巴的开源连接池组件,是世界上最好的连接池之一。Druid能对数据库连接进行有效管理和重用,最大化程序执行的效率。连接池负责创建和管理连接,程序只负责取用与归还。
什么是连接池
1.数据库连接池是个容器,负责分配、管理数据库连接(Connection);
2.它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
3.释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏;
连接池的基本原理
Druid连接池的基本原理是通过创建一个连接池对象,该对象中包含了多个数据库连接对象。在需要使用数据库连接时,从连接池中获取一个连接对象,使用完毕后再将其归还给连接池。这样可以避免频繁地创建和销毁数据库连接对象,提高了数据库的性能和效率。
连接池的优点
1.资源重用
2.提升系统响应速度
3.避免数据库连接遗漏
我的总结
多个用户频繁链接和创建销毁数据库内存开销过大 所以使用连接池这个中间量来减小开销
MyBatis-Plus的作用
概要
MyBatis-Plus 是一个增强版的 MyBatis 框架,提供了一些非常有用的特性来简化开发,包括CRUD操作的简化、代码生成器、自定义SQL扩展、条件构造器等。它通过继承 MyBatis 的功能并进行扩展,减少了大量的样板代码,提高了开发效率。
使用步骤
1.编写实体类
2.编写Mapper接口
3.使用提供的Service接口
4.编写Controller类
使用详细实例
1.编写实体类
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId
private Long id;
private String loginName;
private String password;
private String name;
private String sex;
private String phone;
}
2.编写Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
}
3.创建 Service 接口和实现类:
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
4.编写Controller类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/all")
public List<User> getAllUsers() {
return userService.list();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
}
MyBatis-Plus代码生成器作用
MyBatis-Plus 代码生成器依赖:
- 依赖坐标:
com.baomidou:mybatis-plus-generator:3.5.5
- 作用: 提供了一个强大的代码生成工具,可以根据数据库表结构自动生成对应的实体类(Entity)、Mapper接口、Service接口、Controller等代码文件,极大地提升了开发效率和代码质量。
MyBatis-Plus 代码生成器模板引擎依赖:
- 依赖坐标:
org.springframework.boot:spring-boot-starter-freemarker
- 作用: MyBatis-Plus代码生成器使用Freemarker作为模板引擎,用来根据预定义的模板生成代码文件。Freemarker是一种模板引擎,通过在模板中定义变量和逻辑,可以动态地生成各种类型的文本文件,例如Java类、配置文件等。
我的总结
代码生成器依赖可以根据数据库自动编写java代码构建数据库类型
MyBatis-Plus分页插件作用
概要
分页查询方法是指在数据库查询中,根据指定的条件和分页参数,仅返回符合条件的部分数据结果,而不是全部数据。这种方法常用于处理大量数据的查询,并通过分页的方式展示在用户界面上,以避免一次性加载过多数据而导致性能问题或用户体验下降。
在数据库查询中,分页查询方法通常涉及以下几个关键点:
- 分页参数:
- 页码(Page Number):指定要查询的页数,通常从第1页开始。
- 每页大小(Page Size):指定每页显示的记录数。
- 查询条件:根据具体业务需求和数据库设计,指定查询的条件,如筛选条件、排序规则等。
- 数据库查询语句:根据分页参数和查询条件,构建相应的 SQL 查询语句。常见的数据库如 MySQL、PostgreSQL 等提供了类似的分页查询支持,可以使用
LIMIT
(MySQL)或OFFSET
(PostgreSQL)等语法实现分页效果。 - 返回结果:查询结果将按照分页参数返回指定页的数据,通常以列表或者分页对象的形式返回给调用者。
我的总结
当数据库存的数据很多时 用户查找的数据也很多时为了降低内存消耗不去数据库中查找全部数据而是根据参数选择部分数据查询。
Radis
简介 什么是Radis
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
-
基于内存运行,性能高效
-
支持分布式,理论上可以无限扩展
-
key-value存储系统4.
-
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
为什么要使用Redis
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度2.
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
- 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
哦吼,🐂