当前位置: 首页 > news >正文

【文末送书】全栈开发流程——后端连接数据源(二)

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
★ 从0到英雄,vue成神之路★
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★
★后端进阶之路★

请添加图片描述

文章目录

  • 前言
  • Spring boot基本demo启动
    • 新建项目
    • 添加依赖项
    • 构建maven
    • 基本项目完成
    • 更改文件后缀
    • 添加基础依赖项 ——配置文件提示与lombok
  • 常见错误——maven
    • 1.未正确配置setting.xml文件
    • 2.未配置阿里云国内镜像
    • pom.xml文件
  • springboot连接MySQL
    • 新建项目
    • 连接数据库
    • 添加依赖
  • 编辑application.yml配置文件
    • 成功运行
    • 测试一下是是否链接成功
  • SpringBoot 整合 MyBatis 操作 MySql
    • 先给出数据库
    • 添加依赖项
    • 修改 SpringBoot 配置文件
    • 创建实体类
    • 创建 Mapper 接口
    • 创建 Service 与接口
    • 测试接口
  • SpringBoot 整合 MyBatis-Plus 实现分页查询
    • 构建查询数据
    • 添加依赖
    • 实体类
    • Mapper 接口
    • 编写 Mapper.xml
    • Service
    • 提供分页查询接口
    • 新增分页拦截器
  • 🎁清华出版社送书活动

当我们拿到项目需求后,有时候可能会感到迷茫,不知道整体流程和接下来该做什么。为了能够不断实战并快速提高自己,我们需要找到适合自己的一套开发流程。这样我们就能够有条不紊地进行项目开发,并且及时发现和修正自己的不足之处
在这里插入图片描述

以最常用的java全栈开发为例,这个系列以MySQL数据库后端以SpringBoot,MybatisPlus,Redis,Spring security,前端以vue,微信小程序的技术栈组合,进行步骤细化。

根据上文 全栈开发流程——数据表的分析与创建详解实战演示(一)我们讨论了建立数据库的详细过程
再此篇文章讲述后端的启动以及数据源的连接,如下:

Spring boot基本demo启动

新建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加依赖项

在这里插入图片描述

构建maven

在这里插入图片描述

基本项目完成

在这里插入图片描述

更改文件后缀

新建 Spring Boot 项目后,resources 目录下有一个默认的全局配置文件 application.properties(空文件),Spring Boot 在底层已经自动配置好了默认配置。

默认的文件类型是 .properties,我们这边修改为 .yml,原因是 .yml 更加灵活、简洁!

在这里插入图片描述

添加基础依赖项 ——配置文件提示与lombok

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
<!--lombok依赖-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

再引入一个常用的工具包依赖

    <!-- hutool 工具包  --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency>

常见错误——maven

1.未正确配置setting.xml文件

打开Maven文件下conf/setting.xml文件,找到如图所示位置,如若未设置本地库的位置,则如黄色路径所示,在C:\Users\用户名.m2。设置了路径,则采用的是红色默认位置。(IDEA下使用Maven,未在全局设置中设置Maven Home Dictionary,则使用默认位置)

根据路径找到repository,删除库中对应的包文件,重新导入。

在这里插入图片描述

2.未配置阿里云国内镜像

尝试多次重新导入仍然无法运行,原因是此时网段无法访问maven.org网站,可采用阿里云镜像操作,打开maven安装文件夹的conf文件夹下的settings.xml文件,在如图所示位置配置如下:

完成后,先执行第一步操作后,重新导入包。

在这里插入图片描述

复制代码

<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url><mirrorOf>central</mirrorOf></mirror></mirrors>

3.爆红
在这里插入图片描述
如图修改即可

pom.xml文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring boot-demo</name><description>spring boot-demo</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- hutool 工具包  --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

以上为 springboot 的 demo 项目全部过程

springboot连接MySQL

新建项目

在这里插入图片描述

连接数据库

在这里插入图片描述

添加依赖

        <!-- mysql  --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.17</version><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>

编辑application.yml配置文件

数据源和连接池

# 数据源
spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/schooldb?useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driverhikari:# 连接池最大连接数maximum-pool-size: 12# 空闲时保持最小连接数minimum-idle: 5# 空闲连接存活时间idle-timeout: 300000# 连接超时时间connection-timeout: 20000# 测试sqlconnection-test-query: select 1

成功运行

在这里插入图片描述

测试一下是是否链接成功

在这里插入图片描述

import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class DataSourceTests {@Autowired private DataSource dataSource;@Testpublic void testConnection() throws Exception {System.out.println(dataSource.getConnection());}
}

在这里插入图片描述
成功连接数据库

代码中使用了Spring Boot的注解@SpringBootTest来标注测试类,表明这是一个Spring Boot的测试类,并且会加载整个Spring应用程序上下文。

通过@Autowired注解,将名为dataSource的DataSource实例自动注入进来。DataSource是一个接口,它是Spring提供的用于创建和管理数据库连接的工具,并且可以处理数据库连接的打开、关闭和连接池管理等操作。在@Test注解的方法testConnection中,通过调用getConnection()方法来获取一个数据库连接,并将其打印出来。如果一切正常,将会打印出一个数据库连接对象。

SpringBoot 整合 MyBatis 操作 MySql

先给出数据库

CREATE DATABASE `mydemo`;USE `mydemo`;DROP TABLE IF EXISTS `sys_user`;CREATE TABLE `sys_user` (`user_id` bigint NOT NULL,`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',PRIMARY KEY (`user_id`),KEY `user_idx1_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表';INSERT INTO `sys_user` (`user_id`, `username`) VALUES (1, '雪碧');
INSERT INTO `sys_user` (`user_id`, `username`) VALUES (2, '可乐');

添加依赖项

        <!--  mybatis  --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>

修改 SpringBoot 配置文件

除数据源和连接池外,还有mybatis的mapper和mapper.xml位置

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://127.0.0.1:3306/schooldb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTChikari:# 连接池最大连接数maximum-pool-size: 12# 空闲时保持最小连接数minimum-idle: 5# 空闲连接存活时间idle-timeout: 300000# 连接超时时间connection-timeout: 20000# 测试sqlconnection-test-query: select 1# mybatis 配置
mybatis:mapper-locations:- classpath:mapper/*.xml- classpath*:com/**/mapper/*.xml

创建实体类

package com.example.mybatisdemo.model;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructorpublic class User {private Long userId;private String username;
}

创建 Mapper 接口

package com.example.mybatisdemo.mapper;import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface SysUserMapper {/*** 根据用户ID查询用户信息** @param userId 用户ID* @return 用户信息*/User queryUserById(Long userId);
}

这段代码是一个MyBatis的Mapper接口,被注解为@Mapper表示该接口是MyBatis的映射器接口。
Mapper接口是定义与数据库交互的方法的接口,通过MyBatis配置文件与SQL语句进行映射。其中,SysUserMapper接口定义了一个查询用户信息的方法queryUserById,该方法接受一个userId参数,返回一个User对象。

该接口的实现是由MyBatis框架自动创建,并且会根据接口方法的注解和参数类型来动态生成SQL语句,以实现数据库操作。## 创建 Mapper 映射文件

根据 mybatis.mapper-locations 配置地址创建 Mapper 映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisdemo.mapper.SysUserMapper"><!-- 通用查询映射结果 --><resultMap id="baseResultMap" type="com.example.mybatisdemo.model.User"><id column="user_id" property="userId"/><result column="username" property="username"/></resultMap><select id="queryUserById" resultMap="baseResultMap">select *from sys_userwhere user_id = #{userId}</select>
</mapper>

创建 Service 与接口

  • Service
package com.example.mybatisdemo.service;import com.example.mybatisdemo.mapper.SysUserMapper;
import com.example.mybatisdemo.model.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;@Service
@RequiredArgsConstructor
public class UserService {private final SysUserMapper sysUserMapper;/*** 根据用户ID查询用户信息** @param userId 用户ID* @return 用户信息*/public User queryUserById(Long userId) {return sysUserMapper.queryUserById(userId);}
}
  • 接口
package com.example.mybatisdemo.controller;import com.example.mybatisdemo.model.User;
import com.example.mybatisdemo.service.UserService;import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
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;@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {private final UserService UserService;@GetMapping("/{userId}")public ResponseEntity<User> queryUserById(@PathVariable Long userId) {return ResponseEntity.ok(UserService.queryUserById(userId));}
}

这段代码是一个基于Spring Boot的RESTful风格的控制器类。它使用@RestController注解标识该类为一个控制器,并将返回的数据直接作为HTTP响应体进行返回。
@RequiredArgsConstructor是一个Lombok注解,它会为控制器类生成一个包含所有final修饰的成员变量的构造函数。@RequestMapping(“/user”)用于映射URL路径,即指定该控制器的基本URL路径为/user。UserController类的构造函数接受一个UserService类型的参数,并使用final修饰符标识为成员变量,表示该类依赖于UserService。
@GetMapping(“/{userId}”)用于映射GET请求的URL路径。{userId}是一个路径变量,表示一个具体的用户ID。public ResponseEntityqueryUserById(@PathVariable Long userId)方法是该控制器的处理方法,用于根据用户ID查询用户信息。它使用@PathVariable注解将URL路径中的路径变量userId绑定到方法的参数上。该方法使用UserService调用queryUserById方法查询用户信息,并将结果包装成ResponseEntity对象返回ResponseEntity.ok(UserService.queryUserById(userId))表示请求成功,响应状态码为200,并将用户信息作为响应体返回。

测试接口

在这里插入图片描述

案例成功

SpringBoot 整合 MyBatis-Plus 实现分页查询

在这里插入图片描述

构建查询数据

CREATE DATABASE `mydemo`;USE `mydemo`;DROP TABLE IF EXISTS `sys_user`;CREATE TABLE `sys_user` (`user_id` bigint NOT NULL,`username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',PRIMARY KEY (`user_id`),KEY `user_idx1_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表';INSERT INTO `sys_user` (`user_id`, `username`) VALUES (1, '雪碧');
INSERT INTO `sys_user` (`user_id`, `username`) VALUES (2, '可乐');-- 创建岗位信息表
CREATE TABLE `sys_post` (`post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',`post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位编码',`post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位名称',`post_sort` int NOT NULL COMMENT '岗位排序',`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '创建人',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '更新人',`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注信息',PRIMARY KEY (`post_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='岗位信息表';-- 向岗位信息表插入数据
INSERT INTO `sys_post` VALUES (11, 'user8', '员工8', 10, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '打工人');
INSERT INTO `sys_post` VALUES (2, 'cto', 'cto', 0, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '秃头大佬');
INSERT INTO `sys_post` VALUES (3, 'user', '董事长', -1, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '资本家');
INSERT INTO `sys_post` VALUES (4, 'user1', '员工1', 3, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '打工人');
INSERT INTO `sys_post` VALUES (5, 'user2', '员工2', 4, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '打工人');
INSERT INTO `sys_post` VALUES (6, 'user3', '员工3', 5, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '打工人');
INSERT INTO `sys_post` VALUES (7, 'user4', '员工4', 6, '0', '2023-03-16 13:14:20', 'admin', '2023-06-26 13:14:20', 'admin', '打工人');
sys_user

添加依赖

<!--  Mysql 数据库驱动  -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
<!--  mybatis-plus  -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

实体类

在这里插入图片描述

package com.example.mybatisplusdemo.model;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;import lombok.Getter;
import lombok.Setter;import java.io.Serializable;
import java.time.LocalDateTime;@Getter
@Setter
public class BaseEntity implements Serializable {/*** 创建者*/@TableField(fill = FieldFill.INSERT)private String createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;/*** 更新者*/@TableField(fill = FieldFill.INSERT_UPDATE)private String updateBy;/*** 更新时间*/@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;}
package com.example.mybatisplusdemo.model;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;
import lombok.EqualsAndHashCode;/*** 岗位管理** @author Strive* @date 2022-03-15 17:18:40*/
@Data
@TableName("sys_post")
@EqualsAndHashCode(callSuper = true)public class Post extends BaseEntity {private static final long serialVersionUID = -8744622014102311894L;/*** 岗位ID*/@TableId(type = IdType.ASSIGN_ID)private Long postId;/*** 岗位编码*/private String postCode;/*** 岗位名称*/private String postName;/*** 岗位排序*/private Integer postSort;/*** 是否删除 -1:已删除 0:正常*/private String delFlag;/*** 备注信息*/private String remark;}
package com.example.mybatisplusdemo.model;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;/** @author Strive */
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor@TableName("sys_user")
public class User {@TableIdprivate Long userId;private String username;
}

Mapper 接口

在这里插入图片描述

package com.example.mybatisplusdemo.mapper;import cn.hutool.db.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.mybatisplusdemo.model.Post;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;@Mapper
public interface PostMapper extends BaseMapper<Post> {IPage<Post> selectPageSql(@Param("page") Page page, @Param("query") Post mingYuePost);
}

其中定义了一个selectPageSql方法,用于分页查询Post表的数据。方法参数使用了@Param注解来给参数取别名,方便在SQL语句中使用。
其中,@Param(“page”)表示分页参数,@Param(“query”)表示查询条件。方法返回值类型为IPage,表示查询结果的分页对象。IPage是MybatisPlus框架提供的分页对象,它包含了查询结果的总数、当前页码、每页记录数等信息。

这段代码可以实现根据指定的分页参数和查询条件,查询Post表的数据,并返回分页对象。

package com.example.mybatisplusdemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.mybatisplusdemo.model.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {}

编写 Mapper.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisplusdemo.mapper.PostMapper"><resultMap id="PostMap" type="com.example.mybatisplusdemo.model.Post"><id property="postId" column="post_id"/><result property="postCode" column="post_code"/><result property="postName" column="post_name"/><result property="postSort" column="postSort"/><result property="delFlag" column="del_flag"/><result property="createTime" column="create_time"/><result property="createBy" column="create_by"/><result property="updateTime" column="update_time"/><result property="updateBy" column="update_by"/><result property="remark" column="remark"/></resultMap><select id="selectPageSql" resultMap="PostMap">SELECT p.post_id,p.post_name,p.post_code,p.post_sort as postSort,p.del_flag,p.create_time,p.update_time,p.update_by,p.create_by,p.remarkFROM sys_post p<where>p.del_flag = '0'<if test="query.postName != null and query.postName != ''"><bind name="postNameLike" value="'%' + query.postName + '%'" />and p.post_name LIKE  #{postNameLike}</if></where><if test="null != page.orders"><include refid="dynamicOrder"></include></if></select><!-- 动态排序 --><sql id="dynamicOrder">ORDER BY<choose><when test="page.orders != null and page.orders.size > 0"><foreach collection="page.orders" item="order" separator=",">${order.column}<choose><when test="order.asc == true">asc</when><otherwise>desc</otherwise></choose></foreach></when></choose></sql>
</mapper>

Service

在这里插入图片描述

package com.example.mybatisplusdemo.service;import cn.hutool.db.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.example.mybatisplusdemo.mapper.PostMapper;
import com.example.mybatisplusdemo.model.Post;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
@RequiredArgsConstructor
public class PostService extends ServiceImpl<PostMapper, Post> {private final PostMapper PostMapper;public IPage<Post> pageSql(Page page, Post Post) {return PostMapper.selectPageSql(page, Post);}
}
package com.example.mybatisplusdemo.service;import com.example.mybatisplusdemo.mapper.UserMapper;
import com.example.mybatisplusdemo.model.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper sysUserMapper;/*** 根据用户ID查询用户信息** @param userId 用户ID* @return 用户信息*/public User queryUserById(Long userId) {log.info("根据用户ID查询用户信息");return sysUserMapper.selectById(userId);}
}

提供分页查询接口

在这里插入图片描述

package com.example.mybatisplusdemo.controller;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mybatisplusdemo.model.Post;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequiredArgsConstructor
@RequestMapping("/post")
public class PostController {private final com.example.mybatisplusdemo.service.PostService PostService;@GetMapping("/page")public ResponseEntity<IPage<Post>> page(Page<Post> page) {return ResponseEntity.ok(PostService.page(page));}@GetMapping("/pageSql")public ResponseEntity<IPage<Post>> pageSql(cn.hutool.db.Page page, Post Post) {return ResponseEntity.ok(PostService.pageSql(page, Post));}}
package com.example.mybatisplusdemo.controller;import com.example.mybatisplusdemo.model.User;
import com.example.mybatisplusdemo.service.UserService;import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
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;/** @author Strive */@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {private final UserService UserService;@GetMapping("/{userId}")public ResponseEntity<User> queryUserById(@PathVariable Long userId) {return ResponseEntity.ok(UserService.queryUserById(userId));}
}

新增分页拦截器

在这里插入图片描述

package com.example.mybatisplusdemo.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {/*** 分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

这是一个用于配置MyBatis Plus的配置类。在这个类中,我们定义了一个名为MyBatisPlusConfig的@Configuration注解,表示它是一个配置类。
该配置类中定义了一个名为mybatisPlusInterceptor的@Bean注解方法,用于创建一个MybatisPlusInterceptor对象。MybatisPlusInterceptor是MyBatis Plus提供的分页插件,它可以用于实现数据库分页查询的功能。在mybatisPlusInterceptor方法中,我们创建了一个MybatisPlusInterceptor对象,并向其中添加了一个PaginationInnerInterceptor内部拦截器。内部拦截器用于处理分页查询的逻辑,这里选择使用MySQL数据库作为数据源,所以传入DbType.MYSQL参数。

通过这个配置,我们可以将该分页插件集成到我们的MyBatis Plus配置中,从而实现分页查询的功能。

由于篇幅问题,剩余缓存内容在下一篇完成,剩余内容为:
在这里插入图片描述
此篇文章的全部代码为,可以私信获取
在这里插入图片描述

🎁清华出版社送书活动

以上技术栈主要为spring boot

当谈论Spring Boot时,不可忽视的是它构建在Java之上。Java是一种广泛使用的编程语言,具有跨平台性和强大的生态系统。Spring Boot的出现为Java开发者提供了更方便、更高效的方式来构建应用程序。

此外,Java也是一种广泛使用的编程语言,具有丰富的开发人员社区和大量的开源资源。通过学习和了解Java,你将能够更好地理解Spring Boot框架的工作原理和内部机制,并能够利用Java的强大功能来解决应用程序开发中的各种挑战。🌱👨‍💻

为了让大家更好地学习java全栈开发流程系列,文章开展送书环节

请添加图片描述

出版日期: 2023/6/1最新版 京东链接 当当网

  • 🎁本次送书1-3本【取决于阅读量,阅读量越多,送的越多】👈
  • ⌛️活动时间:截止到2023-9月13号
  • ✳️参与方式:关注博主+三连
  • 评论人生苦短,我爱java(最多可评论三条)

相关文章:

【文末送书】全栈开发流程——后端连接数据源(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

leetcode_27_最小栈

class MinStack { public:MinStack() {}void push(int val) {//只要是压栈&#xff0c;先将元素保存到_elem中_elem.push(val);//如果x小于_min中栈顶的元素&#xff0c;将x再压入_min中if(_min.empty() || val < _min.top()){_min.push(val);}}void pop() {//如果——min栈…...

01-ZooKeeper快速入门

1 Zookeeper概念 Zookeeper是Apache Hadoop项目下的一个子项目&#xff0c;是一个树形目录服务。 zookeeper翻译过来就是 动物园管理员&#xff0c;它是用来管理Hadoop&#xff08;大象&#xff09;、Hive&#xff08;蜜蜂&#xff09;、Pig&#xff08;小猪&#xff09;的管…...

[经典面试题]JS的typeof和instanceof区别

一、typeof typeof 是一个一元操作符不是函数&#xff0c;所以不需要传递参数&#xff0c;使用方法非常简单&#xff1a;typeof A 对于基本类型 let s "Nicholas"; let b true; let i 22; let u; let sb undefined; console.log(typeof s); // string console.…...

C++内存区堆和栈

在C中&#xff0c;内存分成5个区&#xff0c;堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆&#xff0c;就是那些…...

QT中闹钟的设置

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮 #include <QTextEdit> //文本 #include <QLabel> //标签 #include <QLineEdit> //行编辑器#include <QTimerEvent> //定时器事件类头文件 #…...

【Redis】几款redis可视化工具(推荐Another Redis Desktop Manager)

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。不过它公自带一个最小化的命令行式的数据库管理工具&#xff0c;有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理…...

肖sir__设计测试用例方法之因果图07_(黑盒测试)

设计测试用例方法之因果图 一、定义&#xff1a;因果图提供了一个把规格转化为判定表的系统化方法&#xff0c;从该图中可以产生测试数据。其 中&#xff0c;原因是表示输入条件&#xff0c;结果是对输入执 行的一系列计算后得到的输出。 二、因果图方法最终生成的就是判定表。…...

李宏毅-21-hw3:对11种食物进行分类-CNN

一、代码慢慢阅读理解总结内化&#xff1a; 1.关于torch.nn.covd2d()的参数含义、具体用法、功能&#xff1a; &#xff08;1&#xff09;参数含义&#xff1a; 注意&#xff0c;里面的“padding”参数&#xff1a;《both》side所以是上下左右《四》边都会加一个padding数量…...

成集云 | 飞书审批同步金蝶云星空销售订单 | 解决方案

源系统成集云目标系统 方案介绍 飞书是字节跳动于2016年自研的新一代一站式协作平台&#xff0c;将即时沟通、日历、云文档、云盘和工作台深度整合&#xff0c;通过开放兼容的平台&#xff0c;让成员在一处即可实现高效的沟通和流畅的协作&#xff0c;全方位提升企业效率。 …...

06 科技英语|控制与优化学科词汇

maneuver n 策略&#xff1b;v 操控、调遣 manipulate vt 熟练控制 scalability n 可扩展性 leverage n 杠杆&#xff1b;v 促使...改变 flexibility n 弹性 dispatch n 急件&#xff1b;v 调度&#xff1b;派遣 leverage …...

【网络教程】GitHub搜索技巧大揭秘

文章目录 1. 使用关键词优化搜索2. 结合布尔运算符3. 利用星号扩展搜索4. 高级搜索语法5. 按照星标数量搜索6. 使用文件类型搜索7. 在特定分支上搜索8. 使用文件名搜索9. 搜索贡献者10. 使用标签筛选仓库在开发过程中,我们经常需要在GitHub上查找代码、库或相关文档。本文将介…...

AUTOSAR LIN: LDF(LIN Description File)文件解析

LDF文件示例 LIN_description_file "lin_example.ldf" { LIN_protocol_version "2.0";LIN_language_version "2.0";nodes {master: MasterNode;slaves: SlaveNode1, SlaveNode2;};signals {Signal1: MasterNode, SlaveNode1;Signal2: Maste…...

Vue.js 报错:Cannot read property ‘validate‘ of undefined“

错误解决 起因&#xff0c;是我将elemnt-ui登录&#xff0c;默认放在mounted()函数里面&#xff0c;导致vue初始化就调用这个函数。 找了网上&#xff0c;有以下错误原因&#xff1a; 1.一个是你ref写错了&#xff0c;导致获取不了这个表单dom&#xff0c;我这显然不是。 2.…...

vue使用wangEditor

vue版本2.0&#xff1b;editor5.1.23版本&#xff1b;editor-for-vue&#xff1a;1.0.2版本 api文档入口 效果图 安装步骤入口 npm install wangeditor/editor --savenpm install wangeditor/editor-for-vue --save代码 <template><div><div style"bor…...

网络编程、socket编程、多进程并发服务器

网络编程 一、TCP编程的API socket: int socket(int domain, int type, int protocol); 返回值&#xff1a;> 0 代表函数调用成功&#xff0c;这个值是一个文件描述符< 0 代表函数调用失败 int domain&#xff1a;地址簇 AF_INET&#xff1a;IPv4 AF_INET6: IPv6 ​ i…...

Elasticsearch:自动使用服务器时间设置日期字段并更新时区

在大多数情况下&#xff0c;你的数据包含一个以 create_date 命名的字段。 即使没有日期字段&#xff0c;处理各种格式和时区的日期对数据仓库来说也是一个重大挑战。 与此类似&#xff0c;如果要检测变化的数据&#xff0c;则必须准确设置日期字段。 在 Elasticsearch 中还有…...

网络技术三:局域网基本原理

局域网基本原理 使用的协议及线缆 物理层 双绞线 同轴电缆 光纤 无线电 数据链路层 以太网 唯一事实标准 令牌环 淘汰 FDDI 光纤分布式接口 网络层 IP 唯一的事实标准 IPX 淘汰 Apple talk 淘汰 局域网设备 集线器 内部为总线型拓扑 任意时间只能由一台主机占用总线&a…...

Fine-tuning Large Enterprise Language Models via Ontological Reasoning

本文是LLM系列文章&#xff0c;针对《Fine-tuning Large Enterprise Language Models via Ontological Reasoning》的翻译。 基于本体论推理的大型企业语言模型微调 摘要1 引言2 微调LLM的神经符号管道3 通过概念证明进行初步验证4 结论 摘要 大型语言模型&#xff08;LLM&am…...

2023年全国职业院校技能大赛 高等职业教育组(信息安全管理与评估)正式赛题

全国职业院校技能大赛 高等职业教育组 qq:2366046367 q群:670610200信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 一、 比赛时间 本阶段比赛时长为180分钟。 二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 …...

基于SSM的校园驿站管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

分布式实时仿真系统-反射内存的应用

为了使分布式实时仿真系统(一个典型代表就行飞行模拟器)达到逼真的仿真效果&#xff0c;在系统内部&#xff0c;往往不仅需要对各种数据模型进行实时解算&#xff0c;而且需要一个延迟时间极低的确定性网络在系统之间传递数据&#xff0c;这样才能让各个子系统之间协调一致地工…...

【python技巧】替换文件中的某几行

【python技巧】替换文件中的某几行 1. 背景描述2. 单行修改-操作步骤3. 多行修改-操作步骤 1. 背景描述 最近在写一个后端项目&#xff0c;主要的操作就是根据用户的前端数据&#xff0c;在后端打开项目中的代码文件&#xff0c;修改对应位置的参数&#xff0c;因为在目前的后…...

内网建自己的pip源

内网建自己的pip源 一. 下载数据包二. 建立索引三. 安装nginx四. 配置nginx五.展示 一. 下载数据包 以清华源为示例 import requests import bs4 import re import wget a requests.get("https://pypi.tuna.tsinghua.edu.cn/simple").text b bs4.BeautifulSoup(a…...

Vue 3的Diff算法相比Vue 2有哪些具体的改进?

Vue 3的Diff算法相比Vue 2进行了一些具体的改进&#xff0c;主要包括以下几个方面&#xff1a; Patch flag&#xff1a;Vue 3引入了Patch flag的概念&#xff0c;用于标记组件在更新过程中的一些特殊情况&#xff0c;例如组件的props发生变化或只需要强制更新等。这样可以在Dif…...

网络面试题整理

TCP通讯原理&#xff1a;三次握手&#xff0c;四次挥手 TCP&#xff08;Transmission Control Protocol&#xff09;通信中的"三次握手"和"四次挥手"是建立和终止TCP连接时的标准过程&#xff0c;用于确保数据的可靠传输和连接的正确关闭。 三次握手&…...

Liquid Studio 2023.2 Crack

Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说&#xff0c;直观的界面和全面的功能将帮助您节省…...

企业架构LNMP学习笔记8

1、 运维人员需要考虑安全性、稳定性。 安装&#xff1a; 解压进入到目录&#xff1a; shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件&#xff1a; yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…...

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …...

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用&#xff1a; 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用&#xff1a; 注意&#xff01;&#xff01;在这个…...