前言
「作者主頁(yè)」:雪碧有白泡泡
「?jìng)€(gè)人網(wǎng)站」:雪碧的個(gè)人網(wǎng)站
「推薦專欄」:
★java一站式服務(wù) ★
★ React從入門到精通★
★前端炫酷代碼分享 ★
★ 從0到英雄,vue成神之路★
★ uniapp-從構(gòu)建到提升★
★ 從0到英雄,vue成神之路★
★ 解決算法,一個(gè)專欄就夠了★
★ 架構(gòu)咱們從0說(shuō)★
★ 數(shù)據(jù)流通的精妙之道★
★后端進(jìn)階之路★
當(dāng)我們拿到項(xiàng)目需求后,有時(shí)候可能會(huì)感到迷茫,不知道整體流程和接下來(lái)該做什么。為了能夠不斷實(shí)戰(zhàn)并快速提高自己,我們需要找到適合自己的一套開發(fā)流程。這樣我們就能夠有條不紊地進(jìn)行項(xiàng)目開發(fā),并且及時(shí)發(fā)現(xiàn)和修正自己的不足之處。
以最常用的java全棧開發(fā)為例,這個(gè)系列以MySQL數(shù)據(jù)庫(kù),后端以SpringBoot,MybatisPlus,Redis,Spring security,前端以vue,微信小程序的技術(shù)棧組合,進(jìn)行步驟細(xì)化。
根據(jù)上文 全棧開發(fā)流程——數(shù)據(jù)表的分析與創(chuàng)建詳解實(shí)戰(zhàn)演示(一)我們討論了建立數(shù)據(jù)庫(kù)的詳細(xì)過(guò)程
再此篇文章講述后端的啟動(dòng)以及數(shù)據(jù)源的連接,如下:
Spring boot基本demo啟動(dòng)
新建項(xiàng)目
添加依賴項(xiàng)
構(gòu)建maven
基本項(xiàng)目完成
更改文件后綴
新建 Spring Boot 項(xiàng)目后,resources 目錄下有一個(gè)默認(rèn)的全局配置文件 application.properties(空文件),Spring Boot 在底層已經(jīng)自動(dòng)配置好了默認(rèn)配置。
默認(rèn)的文件類型是 .properties,我們這邊修改為 .yml,原因是 .yml 更加靈活、簡(jiǎn)潔!
添加基礎(chǔ)依賴項(xiàng) ——配置文件提示與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>
再引入一個(gè)常用的工具包依賴
<!-- hutool 工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
常見錯(cuò)誤——maven
1.未正確配置setting.xml文件
打開Maven文件下conf/setting.xml文件,找到如圖所示位置,如若未設(shè)置本地庫(kù)的位置,則如黃色路徑所示,在C:\Users\用戶名.m2。設(shè)置了路徑,則采用的是紅色默認(rèn)位置。(IDEA下使用Maven,未在全局設(shè)置中設(shè)置Maven Home Dictionary,則使用默認(rèn)位置)
根據(jù)路徑找到repository,刪除庫(kù)中對(duì)應(yīng)的包文件,重新導(dǎo)入。
2.未配置阿里云國(guó)內(nèi)鏡像
嘗試多次重新導(dǎo)入仍然無(wú)法運(yùn)行,原因是此時(shí)網(wǎng)段無(wú)法訪問(wèn)maven.org網(wǎng)站,可采用阿里云鏡像操作,打開maven安裝文件夾的conf文件夾下的settings.xml文件,在如圖所示位置配置如下:
完成后,先執(zhí)行第一步操作后,重新導(dǎo)入包。
復(fù)制代碼
<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 項(xiàng)目全部過(guò)程
springboot連接MySQL
新建項(xiàng)目
連接數(shù)據(jù)庫(kù)
添加依賴
<!-- 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配置文件
數(shù)據(jù)源和連接池
# 數(shù)據(jù)源
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:
# 連接池最大連接數(shù)
maximum-pool-size: 12
# 空閑時(shí)保持最小連接數(shù)
minimum-idle: 5
# 空閑連接存活時(shí)間
idle-timeout: 300000
# 連接超時(shí)時(shí)間
connection-timeout: 20000
# 測(cè)試sql
connection-test-query: select 1
成功運(yùn)行
測(cè)試一下是是否鏈接成功
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());
}
}
成功連接數(shù)據(jù)庫(kù)
代碼中使用了Spring Boot的注解@SpringBootTest來(lái)標(biāo)注測(cè)試類,表明這是一個(gè)Spring Boot的測(cè)試類,并且會(huì)加載整個(gè)Spring應(yīng)用程序上下文。
通過(guò)@Autowired注解,將名為dataSource的DataSource實(shí)例自動(dòng)注入進(jìn)來(lái)。DataSource是一個(gè)接口,它是Spring提供的用于創(chuàng)建和管理數(shù)據(jù)庫(kù)連接的工具,并且可以處理數(shù)據(jù)庫(kù)連接的打開、關(guān)閉和連接池管理等操作。在@Test注解的方法testConnection中,通過(guò)調(diào)用getConnection()方法來(lái)獲取一個(gè)數(shù)據(jù)庫(kù)連接,并將其打印出來(lái)。如果一切正常,將會(huì)打印出一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象。
SpringBoot 整合 MyBatis 操作 MySql
先給出數(shù)據(jù)庫(kù)
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, '可樂(lè)');
添加依賴項(xiàng)
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
修改 SpringBoot 配置文件
除數(shù)據(jù)源和連接池外,還有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:
# 連接池最大連接數(shù)
maximum-pool-size: 12
# 空閑時(shí)保持最小連接數(shù)
minimum-idle: 5
# 空閑連接存活時(shí)間
idle-timeout: 300000
# 連接超時(shí)時(shí)間
connection-timeout: 20000
# 測(cè)試sql
connection-test-query: select 1
# mybatis 配置
mybatis:
mapper-locations:
- classpath:mapper/*.xml
- classpath*:com/**/mapper/*.xml
創(chuàng)建實(shí)體類
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;
}
創(chuàng)建 Mapper 接口
package com.example.mybatisdemo.mapper;
import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysUserMapper {
/**
* 根據(jù)用戶ID查詢用戶信息
*
* @param userId 用戶ID
* @return 用戶信息
*/
User queryUserById(Long userId);
}
這段代碼是一個(gè)MyBatis的Mapper接口,被注解為@Mapper表示該接口是MyBatis的映射器接口。
Mapper接口是定義與數(shù)據(jù)庫(kù)交互的方法的接口,通過(guò)MyBatis配置文件與SQL語(yǔ)句進(jìn)行映射。其中,SysUserMapper接口定義了一個(gè)查詢用戶信息的方法queryUserById,該方法接受一個(gè)userId參數(shù),返回一個(gè)User對(duì)象。
該接口的實(shí)現(xiàn)是由MyBatis框架自動(dòng)創(chuàng)建,并且會(huì)根據(jù)接口方法的注解和參數(shù)類型來(lái)動(dòng)態(tài)生成SQL語(yǔ)句,以實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。## 創(chuàng)建 Mapper 映射文件
根據(jù) mybatis.mapper-locations 配置地址創(chuàng)建 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">
<!-- 通用查詢映射結(jié)果 -->
<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>
創(chuàng)建 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;
/**
* 根據(jù)用戶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));
}
}
這段代碼是一個(gè)基于Spring Boot的RESTful風(fēng)格的控制器類。它使用@RestController注解標(biāo)識(shí)該類為一個(gè)控制器,并將返回的數(shù)據(jù)直接作為HTTP響應(yīng)體進(jìn)行返回。
@RequiredArgsConstructor是一個(gè)Lombok注解,它會(huì)為控制器類生成一個(gè)包含所有final修飾的成員變量的構(gòu)造函數(shù)。@RequestMapping(“/user”)用于映射URL路徑,即指定該控制器的基本URL路徑為/user。UserController類的構(gòu)造函數(shù)接受一個(gè)UserService類型的參數(shù),并使用final修飾符標(biāo)識(shí)為成員變量,表示該類依賴于UserService。
@GetMapping(“/{userId}”)用于映射GET請(qǐng)求的URL路徑。{userId}是一個(gè)路徑變量,表示一個(gè)具體的用戶ID。public ResponseEntityqueryUserById(@PathVariable Long userId)方法是該控制器的處理方法,用于根據(jù)用戶ID查詢用戶信息。它使用@PathVariable注解將URL路徑中的路徑變量userId綁定到方法的參數(shù)上。該方法使用UserService調(diào)用queryUserById方法查詢用戶信息,并將結(jié)果包裝成ResponseEntity對(duì)象返回ResponseEntity.ok(UserService.queryUserById(userId))表示請(qǐng)求成功,響應(yīng)狀態(tài)碼為200,并將用戶信息作為響應(yīng)體返回。
測(cè)試接口
案例成功
SpringBoot 整合 MyBatis-Plus 實(shí)現(xiàn)分頁(yè)查詢
構(gòu)建查詢數(shù)據(jù)
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, '可樂(lè)');
-- 創(chuàng)建崗位信息表
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 '創(chuàng)建時(shí)間',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '創(chuàng)建人',
`update_time` datetime DEFAULT NULL COMMENT '更新時(shí)間',
`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='崗位信息表';
-- 向崗位信息表插入數(shù)據(jù)
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', '董事長(zhǎng)', -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 數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<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>
實(shí)體類
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 {
/**
* 創(chuàng)建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 創(chuàng)建時(shí)間
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新時(shí)間
*/
@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);
}
其中定義了一個(gè)selectPageSql方法,用于分頁(yè)查詢Post表的數(shù)據(jù)。方法參數(shù)使用了@Param注解來(lái)給參數(shù)取別名,方便在SQL語(yǔ)句中使用。
其中,@Param(“page”)表示分頁(yè)參數(shù),@Param(“query”)表示查詢條件。方法返回值類型為IPage,表示查詢結(jié)果的分頁(yè)對(duì)象。IPage是MybatisPlus框架提供的分頁(yè)對(duì)象,它包含了查詢結(jié)果的總數(shù)、當(dāng)前頁(yè)碼、每頁(yè)記錄數(shù)等信息。
這段代碼可以實(shí)現(xiàn)根據(jù)指定的分頁(yè)參數(shù)和查詢條件,查詢Post表的數(shù)據(jù),并返回分頁(yè)對(duì)象。
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>
<!-- 動(dòng)態(tài)排序 -->
<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;
/**
* 根據(jù)用戶ID查詢用戶信息
*
* @param userId 用戶ID
* @return 用戶信息
*/
public User queryUserById(Long userId) {
log.info("根據(jù)用戶ID查詢用戶信息");
return sysUserMapper.selectById(userId);
}
}
提供分頁(yè)查詢接口
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));
}
}
新增分頁(yè)攔截器
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 {
/**
* 分頁(yè)插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
這是一個(gè)用于配置MyBatis Plus的配置類。在這個(gè)類中,我們定義了一個(gè)名為MyBatisPlusConfig的@Configuration注解,表示它是一個(gè)配置類。
該配置類中定義了一個(gè)名為mybatisPlusInterceptor的@Bean注解方法,用于創(chuàng)建一個(gè)MybatisPlusInterceptor對(duì)象。MybatisPlusInterceptor是MyBatis Plus提供的分頁(yè)插件,它可以用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)分頁(yè)查詢的功能。在mybatisPlusInterceptor方法中,我們創(chuàng)建了一個(gè)MybatisPlusInterceptor對(duì)象,并向其中添加了一個(gè)PaginationInnerInterceptor內(nèi)部攔截器。內(nèi)部攔截器用于處理分頁(yè)查詢的邏輯,這里選擇使用MySQL數(shù)據(jù)庫(kù)作為數(shù)據(jù)源,所以傳入DbType.MYSQL參數(shù)。
通過(guò)這個(gè)配置,我們可以將該分頁(yè)插件集成到我們的MyBatis Plus配置中,從而實(shí)現(xiàn)分頁(yè)查詢的功能。
由于篇幅問(wèn)題,剩余緩存內(nèi)容在下一篇完成,剩余內(nèi)容為:
此篇文章的全部代碼為,可以私信獲取
??清華出版社送書活動(dòng)
以上技術(shù)棧主要為spring boot
當(dāng)談?wù)揝pring Boot時(shí),不可忽視的是它構(gòu)建在Java之上。Java是一種廣泛使用的編程語(yǔ)言,具有跨平臺(tái)性和強(qiáng)大的生態(tài)系統(tǒng)。Spring Boot的出現(xiàn)為Java開發(fā)者提供了更方便、更高效的方式來(lái)構(gòu)建應(yīng)用程序。
此外,Java也是一種廣泛使用的編程語(yǔ)言,具有豐富的開發(fā)人員社區(qū)和大量的開源資源。通過(guò)學(xué)習(xí)和了解Java,你將能夠更好地理解Spring Boot框架的工作原理和內(nèi)部機(jī)制,并能夠利用Java的強(qiáng)大功能來(lái)解決應(yīng)用程序開發(fā)中的各種挑戰(zhàn)。???????
為了讓大家更好地學(xué)習(xí)java全棧開發(fā)流程系列,文章開展送書環(huán)節(jié)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-696721.html
出版日期: 2023/6/1最新版 京東鏈接 當(dāng)當(dāng)網(wǎng)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696721.html
- ??本次送書1-3本【取決于閱讀量,閱讀量越多,送的越多】??
- ??活動(dòng)時(shí)間:截止到2023-9月13號(hào)
- ??參與方式:關(guān)注博主+三連
- 評(píng)論:人生苦短,我愛java(最多可評(píng)論三條)
到了這里,關(guān)于【文末送書】全棧開發(fā)流程——后端連接數(shù)據(jù)源(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!