Appearance
添加依赖
在 /pom.xml 文件中写入以下代码
xml
<!-- MySQL 官方新版驱动(适配 5.7+/8.0+) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<scope>runtime</scope> <!-- 仅运行时依赖,符合 Spring Boot 最佳实践 -->
</dependency>
<!-- MyBatis-Plus 核心起步依赖(自动整合 MyBatis + 核心功能) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version> <!-- 稳定版 -->
</dependency>mysql连接配置 +
yml
spring:
# 数据库 + 连接池(HikariCP)配置(Spring Boot 默认连接池,性能最优)
datasource:
# 驱动类名(新版 MySQL 8.x 固定)
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/xys1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: root
# HikariCP 连接池自定义配置(核心!生产环境必须调优)
hikari:
minimum-idle: 5 # 最小空闲连接数(默认5,根据业务调整)
maximum-pool-size: 20 # 最大连接数(默认10,高并发场景可调大)
auto-commit: true # 自动提交事务
idle-timeout: 300000 # 空闲连接超时时间(5分钟,默认600000)
pool-name: DemoHikariCP # 连接池名称(便于监控)
max-lifetime: 1800000 # 连接最大存活时间(30分钟,默认1800000)
connection-timeout: 30000 # 连接超时时间(30秒,默认30000)
# 连接测试(确保获取的连接可用)
connection-test-query: SELECT 1
# MyBatis-Plus 完整配置(核心!体现 MyBatis-Plus 特性)
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml # 1. 映射文件位置(如果有 XML 自定义 SQL,需配置)
type-aliases-package: com.example.xys1.entity.** # 2. 实体类包名(自动扫描,简化别名)
global-config:
db-config:
# 主键策略(MySQL 自增主键)
id-type: auto
# 表名前缀(如果表名统一加前缀,如 t_user,实体类是 User,可配置)
# table-prefix: t_
# 逻辑删除配置(MyBatis-Plus 核心特性)
# logic-delete-field: isDeleted # 全局逻辑删除字段名
# logic-delete-value: 1 # 逻辑删除值(表示已删除)
# logic-not-delete-value: 0 # 逻辑未删除值
# 关闭 Banner 打印(可选)
banner: false
# 4. 配置项(开发调试必备)
configuration:
map-underscore-to-camel-case: true # 驼峰转换(默认开启,可省略)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开发环境用这个org.apache.ibatis.logging.stdout.StdOutImpl 生产环境改成这个 org.apache.ibatis.logging.nologging.NoLoggingImpl
default-statement-timeout: 30 # 设置超时时间(避免慢 SQL 阻塞)
local-cache-scope: SESSION # 推荐 SESSION,除非你明确知道需要 STATEMENT创建文件 (controller,entity,mapper,service,dto5个,vo2个)
controller
package com.example.xys1.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.xys1.dto.article.*;
import com.example.xys1.entity.ArtiCleEntity;
import com.example.xys1.service.ArticleService;
import com.example.xys1.utils.MysqlLimitStrUtil;
import com.example.xys1.utils.res.PageVo;
import com.example.xys1.utils.res.ResUtil;
import com.example.xys1.vo.article.ArticleInfoVo;
import com.example.xys1.vo.article.ArticleItemVo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
// 标识为控制器,且所有方法返回值直接转为 JSON(无需视图解析)
@RestController
@RequestMapping("/article")
public class ArticleController {
@Resource
private ArticleService articleService;
@PostMapping("/articleAdd")
public ResUtil<String> articleAdd(@RequestBody ArticleAddDto dto) {
ArtiCleEntity addEntity = new ArtiCleEntity();
addEntity.setCreateBy(1001L);
addEntity.setCreateAt(System.currentTimeMillis());
addEntity.setTitle(dto.getTitle());
addEntity.setContent(dto.getContent());
addEntity.setCoverImg(dto.getCoverImg());
articleService.save(addEntity);
return ResUtil.ok(String.valueOf(addEntity.getId()));
}
@PostMapping("/articleDelete")
public ResUtil<?> articleDelete(@RequestBody ArticleDeleteDto dto) {
articleService.removeByIds(dto.getIds());
return ResUtil.ok(null);
}
@PostMapping("/articleUpdate")
public ResUtil<?> articleUpdate(@RequestBody ArticleUpdateDto dto) {
ArtiCleEntity updateEntity = new ArtiCleEntity();
updateEntity.setUpdateBy(1001L);
updateEntity.setUpdateBy(System.currentTimeMillis());
updateEntity.setId(dto.getId());
updateEntity.setTitle(dto.getTitle());
updateEntity.setContent(dto.getContent());
updateEntity.setCoverImg(dto.getCoverImg());
articleService.updateById(updateEntity);
return ResUtil.ok(null);
}
@PostMapping("/articleList")
public ResUtil<PageVo<ArticleItemVo>> articleList(@RequestBody ArticleListDto dto) {
// queryWrapper
LambdaQueryWrapper<ArtiCleEntity> queryWrapper = getQueryWrapper(dto);
// total
long total = articleService.count(queryWrapper);
// list
List<ArtiCleEntity> list = new ArrayList<>();
if (total > 0L) {
queryWrapper.last(MysqlLimitStrUtil.getLimitStr(dto.getPageNum(), dto.getPageSize()));
list = articleService.list(queryWrapper);
}
// newList
List<ArticleItemVo> newList = list.stream().map(item -> {
ArticleItemVo vo = new ArticleItemVo();
vo.setId(item.getId());
vo.setTitle(item.getTitle());
vo.setCoverImg(item.getCoverImg());
vo.setCreateAtStr("a");
vo.setUpdateAtStr("b");
return vo;
}).collect(Collectors.toList());
// return
PageVo<ArticleItemVo> pageVo = new PageVo<>();
pageVo.setTotal(Convert.toLong(total));
pageVo.setRows(newList);
return ResUtil.ok(pageVo);
}
private LambdaQueryWrapper<ArtiCleEntity> getQueryWrapper(ArticleListDto dto) {
// where
LambdaQueryWrapper<ArtiCleEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dto.getTitle()), ArtiCleEntity::getTitle, dto.getTitle());
// 排序
queryWrapper.orderByDesc(ArtiCleEntity::getId);
return queryWrapper;
}
@PostMapping("/articleInfo")
public ResUtil<ArticleInfoVo> articleInfo(@RequestBody ArticleInfoDto dto) {
ArtiCleEntity find = articleService.getById(dto.getId());
if (Objects.isNull(find)) {
return ResUtil.fail("'信息不存在'");
}
ArticleInfoVo vo = new ArticleInfoVo();
BeanUtil.copyProperties(find, vo);
return ResUtil.ok(vo);
}
}entity
package com.example.xys1.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
@Data
@TableName("article")
public class ArtiCleEntity {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("remark")
private String remark;
@TableField("create_by")
private Long createBy;
@TableField("delete_by")
private Long deleteBy;
@TableField("update_by")
private Long updateBy;
@TableField("create_at")
private Long createAt;
@TableField("delete_at")
private Long deleteAt;
@TableField("update_at")
private Long updateAt;
// -------------------
@TableField("title")
private String title;
@TableField("content")
private String content;
@TableField("cover_img")
private String coverImg;
}mapper
package com.example.xys1.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.xys1.entity.ArtiCleEntity;
@Mapper
public interface ArticleMapper extends BaseMapper<ArtiCleEntity> {
}service
package com.example.xys1.service;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.xys1.mapper.ArticleMapper;
import com.example.xys1.entity.ArtiCleEntity;
@Service
public class ArticleService extends ServiceImpl<ArticleMapper, ArtiCleEntity> {
}dto.add
package com.example.xys1.dto.article;
import lombok.Data;
@Data
public class ArticleAddDto {
private String title;
private String content;
private String coverImg;
}dto.delete
package com.example.xys1.dto.article;
import lombok.Data;
import java.util.List;
@Data
public class ArticleDeleteDto {
private List<Long> ids;
}dto.update
package com.example.xys1.dto.article;
import lombok.Data;
@Data
public class ArticleUpdateDto {
private Long id;
private String title;
private String content;
private String coverImg;
}dto.list
package com.example.xys1.dto.article;
import lombok.Data;
@Data
public class ArticleListDto {
private Long pageNum = 1L;
private Long pageSize = 10L;
private String title;
}dto.info
package com.example.xys1.dto.article;
import lombok.Data;
@Data
public class ArticleInfoDto {
private Long id;
}vo.list
package com.example.xys1.vo.article;
import lombok.Data;
@Data
public class ArticleItemVo {
private Long id;
private String title;
private String coverImg;
private String createAtStr;
private String updateAtStr;
}vo.info
package com.example.xys1.vo.article;
import lombok.Data;
@Data
public class ArticleInfoVo {
private Long id;
private String remark;
private Long createBy;
private Long createAt;
private Long deleteBy;
private Long deleteAt;
private Long updateBy;
private Long updateAt;
private String title;
private String content;
private String coverImg;
}ResUtil
PageVo
