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

news2024/11/25 2:41:30

前言

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

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: root
    password: 123456
    url: jdbc:mysql://localhost:3306/schooldb?useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      # 连接池最大连接数
      maximum-pool-size: 12
      # 空闲时保持最小连接数
      minimum-idle: 5
      # 空闲连接存活时间
      idle-timeout: 300000
      # 连接超时时间
      connection-timeout: 20000
      # 测试sql
      connection-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;

    @Test
    public 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.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/schooldb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    hikari:
      # 连接池最大连接数
      maximum-pool-size: 12
      # 空闲时保持最小连接数
      minimum-idle: 5
      # 空闲连接存活时间
      idle-timeout: 300000
      # 连接超时时间
      connection-timeout: 20000
      # 测试sql
      connection-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
@AllArgsConstructor

public 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_user
        where 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 {

    @TableId

    private 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.remark
        FROM 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 {
    /**
     * 分页插件
     */
    @Bean
    public 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(最多可评论三条)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#项目实战】控制台游戏 勇士斗恶龙(2)——游戏场景的设置以及玩家战斗逻辑

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…

【web开发】2、css基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、CSS是什么&#xff1f;二、使用步骤2.1.css的存放位置2.2.选择器2.3.常用CSS样式介绍与示例 一、CSS是什么&#xff1f; 层叠样式表(英文全称&#xff1a;Casc…

vue2+element-ui批量导入方法并判断上传的文件是否为xls或xlsx

业务需求: 代码结构: <el-dialogtitle"批量导入":close-on-click-modal"true"close"close()":visible"true"width"35%":center"true"><div class"el-dialog-div"><!-- 头部区域布局 -…

万物互联:软件与硬件的协同之道

在当今数字化时代&#xff0c;我们身边的一切似乎都与计算机和互联网有关。从智能手机到智能家居设备&#xff0c;从自动驾驶汽车到工业生产线&#xff0c;无论我们走到哪里&#xff0c;都能看到软件和硬件的协同作用。本文将探讨这种协同作用&#xff0c;解释软件和硬件如何相…

R语言机器学习之caret包详解(二:模型的训练以及调参)

R语言机器学习之caret包详解&#xff08;二&#xff1a;模型的训练以及调参&#xff09; 前言caret包模型调优的策略、示例、以及一些小tips 前言 在之前的博客中我们详细介绍过了数据的拆分策略、各种数据处理的方法、各种交叉验证的方法&#xff0c;并且以示例介绍了R函数cre…

传统文化,运用好了,能生财!

千年以来&#xff0c;五行是中华民族文化的瑰宝&#xff0c;历代先贤智慧的结晶。五行学说是中国传统文化重要组成部分&#xff0c;是中国古代哲学思想的重要内容。古人认为&#xff0c;万物由五种相关的基本物质木、火、土、 金、水构成&#xff0c;这就是五行。 五行思想强调…

NFTScan 浏览器再升级:优质数据服务新体验来袭

当前&#xff0c;高质量的 NFT 数据服务已成为区块链用户和开发者的必需。为满足用户数据需求&#xff0c;NFTScan 主站近日进行全面升级&#xff0c;优化了数据服务板块的页面结构&#xff0c;实现更清晰简洁的布局和交互。 NFTScan 的改版充分考虑用户和开发者的数据体验&am…

【python】TCP socket服务器 Demo

目录 一、单线程服务器 二、多线程服务器 三、多线程服务器&#xff08;发送和接收分离&#xff09; 一、单线程服务器 说明&#xff1a;只能连接一个客户端 import socket,binascii# 创建一个 TCP 套接字 server_socket socket.socket(socket.AF_INET, socket.SOCK_STRE…

【C++基础】4、变量

文章目录 【 1、变量的定义 】【 2、变量的声明 】示例 【 3、左值和右值 】 变量&#xff1a;相当于是程序可操作的数据存储区的名称。在 C 中&#xff0c;有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&am…

文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式&#xff0c;并给…

python3

#安装python3 brew install python3 看到下图表示安装python3成功: #将python3 加入环境变量 export PATH$PATH:/opt/homebrew/bin/#查看python 版本 python3 --version#查看pip 版本 pip3 --version#更新python源 pip3 config set global.index-url https://pypi.tuna.tsing…

免费电商api接口,分享给你「建议收藏」

API&#xff08;应用程序编程接口&#xff09; ​ API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…

高忆管理;三天翻倍!地产“三仙”狂飙

9月6日&#xff0c;一度全部成为“仙股”的三家闻名香港上市房企&#xff0c;融创我国、我国恒大、碧桂园大涨。其间两家已顺利摘掉“仙股”帽子。 截至发稿&#xff0c;融创我国涨20.25%&#xff0c;报1.9港元/股&#xff0c;总市值报104亿港元&#xff0c;不到三个交易日股价…

[LeetCode周赛复盘] 第 361 场周赛20230906

[LeetCode周赛复盘] 第 361 场周赛20230906 一、本周周赛总结2843. 统计对称整数的数目1. 题目描述2. 思路分析3. 代码实现 2844. 生成特殊数字的最少操作1. 题目描述2. 思路分析3. 代码实现 2845. 统计趣味子数组的数目1. 题目描述2. 思路分析3. 代码实现 2846. 边权重均等查…

提升客户体验,你只需要做到这一点

自动回复是指由特定事件或操作触发的自动响应&#xff0c;例如在即时通讯工具上接收消息&#xff0c;它用于通知发件人他们的消息已被收到。不仅可以在WhatsApp&#xff0c;Messenger等渠道上设置自动回复&#xff0c;如果您使用了像SaleSmartly&#xff08;SS客服&#xff09;…

任意文件读取及漏洞复现

文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

PG 的状态机和peering过程

首先来解释下什么是pg peering过程&#xff1f; 当最初建立PG之后&#xff0c;那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候&#xff0c;这个osd上所有的pg都要进行peering过程&#xff0c;同步pg的状态。peering过程结…

【K 均值聚类】02/5:简介

一、说明 k-mean算法是一种聚类算法&#xff0c;它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。 无监督机器学习是在没…

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群&#xff0c;其中有三个master 节点&#xff0c;这三个节点的标签名称为etcd 三个master节点的ip 分别为&#xff1a;192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库&#xff0c; 数据库的ip 为&#xff1a;192.165.187.180 用户…