最终代码结构
仓库地址
Entity文件
数据库表设计
entity层实现
文件创建
● 创建entity文件夹
● 在entity层创建Java类,名字为User (关键字不可使用)
代码实现
package com.example.drhtspringboot.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user")
public class User {
/**
* 主键ID
* */
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 用户名
* */
private String username;
/**
* 昵称
* */
private String nickname;
/**
* 密码
* */
private String password;
/**
* 性别
* */
private Integer gender;
/**
* 头像
* */
private String avatar;
/**
* 角色
* */
private Integer role;
/**
* 学历
* */
private Integer education;
/**
* 学校
* */
private String school;
/**
* 班级
* */
@TableField("banjiId")
private Integer banjiId;
/**
* 创建时间
* */
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField("createdAt")
private Date createdAt;
/**
* 更新时间
* */
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField("updatedAt")
private Date updatedAt;
}
注解解释
@JsonFormat
目的是为了在接口请求数据返回时修改时间的返回格式
@Data
● 由Lombok库提供
● 会自动为实体类生成getter、setter、equals、hashCode和toString方法。
@TableName
● 指定实体类映射到数据库的具体表名
@TableId
● 标记实体类中的主键字段
● 设置一个复合主键时,可以使用 @TableId 注解的属性type来指定主键生成策略
@TableField
● 标记实体类中的字段与数据库表中的字段的映射关系
● 如果字段名和数据库列名相同,可以不用写 @TableField 注解
驼峰字段
如果数据表中的字段是驼峰形式,在接口方法查询数据时候驼峰形式字段会变为下划线形式(createdAt 变为 created_at),所以需要通过@TableField注解来使其保持一致
Mapper文件
mapper层实现
文件创建
● 创建mapper文件夹
● 在mapper层创建Java接口,名字为UserMapper
代码实现
package com.example.drhtspringboot.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.drhtspringboot.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
注解解释
BaseMapper
● MyBatis-Plus提供的一个泛型接口,包含了基础的增删改查等CRUD操作
● 可以简化对数据访问的开发
@Mapper
● 省略了xml文件的配置过程
service文件
初版实现暂不补充
controller文件
文件创建
● 创建controller文件夹
● 在controller层创建Java接口,名字为UserController
代码实现
请求结果类封装
package com.example.drhtspringboot.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
private String code;
private String msg;
private T data;
public Result(T data) {
this.data = data;
}
public static Result success() {
Result result = new Result<>();
result.setCode("200");
result.setMsg("成功");
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>(data);
result.setCode("200");
result.setMsg("成功");
result.setData(data);
return result;
}
public static Result error(String code, String msg) {
Result result = new Result<>();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
查询所有
没有任何查询参数,查询表中所有数据
/**
* 获取用户列表
* 通过请求映射 getList,处理获取用户列表的请求
* 此方法使用 QueryWrapper 对象查询数据库中的所有用户,并返回查询结果
* 如果查询结果不为空,则返回成功结果和用户列表,否则返回错误信息
*/
@RequestMapping("getListAll")
public Result<?> getListAll(){
// 使用 QueryWrapper 进行查询,获取用户列表
List<User> userList = userMapper.selectList(new QueryWrapper<>());
// 判断查询结果是否为空
if(userList != null){
// 查询成功,返回用户列表
return Result.success(userList);
} else {
// 查询失败,返回错误信息
return Result.error("500", "查询失败");
}
}
分页查询
分页查询默认会出现一个问题: 查询出的数据records内容正常,但是total数量为0,需要进行一个插件的配置
- 插件配置
package com.example.drhtspringboot.common;
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 {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 分页接口实现
/**
* 根据条件获取用户列表
*
* @param page 页码,指定从哪一页开始查询
* @param size 每页大小,即每页返回的记录数
* @param username 用户名,用于模糊查询
* @param gender 性别,用于精确查询
* @param role 角色ID,用于精确查询
* @return 返回一个Result对象,包含查询结果或错误信息
*/
@RequestMapping("getList")
public Result<?> getList(Integer page,Integer size,String username,Integer gender,Integer role){
// 创建Page对象,用于分页查询
Page<User> userPage = new Page<>(page,size);
// 创建QueryWrapper对象,用于构建查询条件
QueryWrapper<User> qw = new QueryWrapper<>();
if(StringUtils.isNotBlank(username)) {
qw.like("username",username); // 模糊查询用户名
}
if(gender != null) {
qw.eq("gender",gender); // 精确查询性别
}
if(role != null) {
qw.eq("role", role); // 精确查询角色
}
// 执行分页查询
IPage<User> userPageList = userMapper.selectPage(userPage,qw);
// 判断查询结果是否为空
if(userPageList != null) {
return Result.success(userPageList); // 查询成功,返回结果
} else {
return Result.error("500", "查询失败"); // 查询失败,返回错误信息
}
}
新增用户
/**
* 添加新用户
*
* @param user 用户对象,包含用户的基本信息
* @return 插入操作的结果,成功或失败
*/
@PostMapping("addUser")
public Result<?> addUser(@RequestBody User user){
// 设置用户创建时间和更新时间为当前时间
user.setCreatedAt(new Date());
user.setUpdatedAt(new Date());
// 执行用户信息的插入操作
int i = userMapper.insert(user);
// 根据插入结果返回成功或失败的信息
if(i > 0) {
return Result.success();
} else {
// 查询失败,返回错误信息
return Result.error("500", "新增失败");
}
}
更新用户
/**
* 处理用户更新请求
* 该方法通过POST请求接收用户数据,并尝试在数据库中更新该用户的信息
*
* @param user 用户对象,包含要更新的用户信息
* @return 返回更新操作的结果,成功或失败
*/
@PostMapping("updateUser")
public Result<?> updateUser(@RequestBody User user){
// 根据用户ID更新用户信息
int i = userMapper.updateById(user);
// 判断更新操作是否成功
if(i > 0) {
// 如果更新成功,返回成功结果
return Result.success();
} else {
// 如果更新失败,返回错误信息
return Result.error("500", "更新失败");
}
}
删除用户
/**
* 删除用户信息
* 该方法通过POST请求接收用户信息,并根据用户ID删除用户
*
* @param user 用户对象,包含要删除的用户ID
* @return 删除操作的结果,如果删除成功返回成功结果,否则返回错误信息
*/
@PostMapping("delUser")
public Result<?> deleteUser(@RequestBody User user){
// 根据用户ID删除用户信息
int i = userMapper.deleteById(user.getId());
// 判断删除操作是否成功
if(i > 0) {
// 如果删除成功,返回成功结果
return Result.success();
} else {
// 如果删除失败,返回错误信息
return Result.error("500", "删除失败");
}
}
整体代码
package com.example.drhtspringboot.contoller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.drhtspringboot.common.Result;
import com.example.drhtspringboot.entity.User;
import com.example.drhtspringboot.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.Date;
import java.util.List;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserMapper userMapper;
/**
* 根据条件获取用户列表
*
* @param page 页码,指定从哪一页开始查询
* @param size 每页大小,即每页返回的记录数
* @param username 用户名,用于模糊查询
* @param gender 性别,用于精确查询
* @param role 角色ID,用于精确查询
* @return 返回一个Result对象,包含查询结果或错误信息
*/
@RequestMapping("getList")
public Result<?> getList(Integer page,Integer size,String username,Integer gender,Integer role){
// 创建Page对象,用于分页查询
Page<User> userPage = new Page<>(page,size);
// 创建QueryWrapper对象,用于构建查询条件
QueryWrapper<User> qw = new QueryWrapper<>();
if(StringUtils.isNotBlank(username)) {
qw.like("username",username); // 模糊查询用户名
}
if(gender != null) {
qw.eq("gender",gender); // 精确查询性别
}
if(role != null) {
qw.eq("role", role); // 精确查询角色
}
// 执行分页查询
IPage<User> userPageList = userMapper.selectPage(userPage,qw);
// 判断查询结果是否为空
if(userPageList != null) {
return Result.success(userPageList); // 查询成功,返回结果
} else {
return Result.error("500", "查询失败"); // 查询失败,返回错误信息
}
}
/**
* 获取用户列表
* 通过请求映射 getList,处理获取用户列表的请求
* 此方法使用 QueryWrapper 对象查询数据库中的所有用户,并返回查询结果
* 如果查询结果不为空,则返回成功结果和用户列表,否则返回错误信息
*/
@RequestMapping("getListAll")
public Result<?> getListAll(){
// 使用 QueryWrapper 进行查询,获取用户列表
List<User> userList = userMapper.selectList(new QueryWrapper<>());
// 判断查询结果是否为空
if(userList != null){
// 查询成功,返回用户列表
return Result.success(userList);
} else {
// 查询失败,返回错误信息
return Result.error("500", "查询失败");
}
}
/**
* 添加新用户
*
* @param user 用户对象,包含用户的基本信息
* @return 插入操作的结果,成功或失败
*/
@PostMapping("addUser")
public Result<?> addUser(@RequestBody User user){
// 设置用户创建时间和更新时间为当前时间
user.setCreatedAt(new Date());
user.setUpdatedAt(new Date());
// 执行用户信息的插入操作
int i = userMapper.insert(user);
// 根据插入结果返回成功或失败的信息
if(i > 0) {
return Result.success();
} else {
// 查询失败,返回错误信息
return Result.error("500", "新增失败");
}
}
/**
* 删除用户信息
* 该方法通过POST请求接收用户信息,并根据用户ID删除用户
*
* @param user 用户对象,包含要删除的用户ID
* @return 删除操作的结果,如果删除成功返回成功结果,否则返回错误信息
*/
@PostMapping("delUser")
public Result<?> deleteUser(@RequestBody User user){
// 根据用户ID删除用户信息
int i = userMapper.deleteById(user.getId());
// 判断删除操作是否成功
if(i > 0) {
// 如果删除成功,返回成功结果
return Result.success();
} else {
// 如果删除失败,返回错误信息
return Result.error("500", "删除失败");
}
}
/**
* 处理用户更新请求
* 该方法通过POST请求接收用户数据,并尝试在数据库中更新该用户的信息
*
* @param user 用户对象,包含要更新的用户信息
* @return 返回更新操作的结果,成功或失败
*/
@PostMapping("updateUser")
public Result<?> updateUser(@RequestBody User user){
// 根据用户ID更新用户信息
int i = userMapper.updateById(user);
// 判断更新操作是否成功
if(i > 0) {
// 如果更新成功,返回成功结果
return Result.success();
} else {
// 如果更新失败,返回错误信息
return Result.error("500", "更新失败");
}
}
}