前言
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」:
文章目录
- 前言
- Spring boot基本demo启动
- 常见错误——maven
- springboot连接MySQL
- 编辑application.yml配置文件
- SpringBoot 整合 MyBatis 操作 MySql
- SpringBoot 整合 MyBatis-Plus 实现分页查询
- 🎁清华出版社送书活动
根据上文 全栈开发流程——数据表的分析与创建详解实战演示(一)我们讨论了建立数据库的详细过程
再此篇文章讲述后端的启动以及数据源的连接,如下:
Spring boot基本demo启动
新建项目
添加依赖项
构建maven
基本项目完成
更改文件后缀
默认的文件类型是 .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文件
根据路径找到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应用程序上下文。
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.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));
}
}
测试接口
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框架提供的分页对象,它包含了查询结果的总数、当前页码、每页记录数等信息。
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参数。
🎁清华出版社送书活动
以上技术栈主要为spring boot
为了让大家更好地学习java全栈开发流程系列,文章开展送书环节