以下缺少相关依赖的,比如 commons.lang 等包,则自行导入。
1、依赖
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 实体类工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
注:自行选择版本。相应的数据库等依赖自行添加,数据库以 mysql 8.0x 为例。
2、配置文件
2.1 application.properties
server.servlet.context-path=/model/
server.tomcat.uri-encoding=UTF-8
spring.application.name=model
# 使用开发环境配置‘dev’,如生产环境,则改为 ‘prod’
spring.profiles.active=prod
# 数据库连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://${datasource.host}:${datasource.port}/model?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
spring.datasource.initialization-mode=always
# 针对bean被重复定义,重复则覆盖
spring.main.allow-bean-definition-overriding=true
# 将所有数字转为 String 类型返回,避免前端处理数据不正确
spring.jackson.generator.write-numbers-as-strings=true
# 和数据库字段进行印射,最终成为驼峰命名
mybatis-plus.configuration.map-underscore-to-camel-case=true
# Jackson 设置时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
2.2 application-prod.properties
# 服务器端口
server.port=20000
# 服务地址
server.host=localhost
# 数据库地址、账号密码
datasource.host=localhost
datasource.port=3306
spring.datasource.username=root
spring.datasource.password=123456
3、实体类
3.1 po(对应数据库表)
package com.pky.model.commons.domain.po;
import java.io.Serializable;
import lombok.Data;
/**
* 用户基本信息表(user_info)实体
* @author pky
*/
@Data
public class UserInfo implements Serializable {
/**
* 用户ID
* (mybatis_plus 提供的主键生成策略(ASSIGN_ID/雪花算法主键;AUTO/自增主键;ASSIGN_UUID/排除中划线的UUID主键))
*/
@TableId(type = IdType.ASSIGN_ID)
private String userId;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
/**
* 邮箱
*/
private String email;
/**
* 手机号
*/
private String phone;
/**
* 创建时间
*/
private String created;
/**
* 修改时间
*/
private String updated;
private static final long serialVersionUID = 1894561L;
}
3.2 vo (接收前端参数实体)
package com.pky.model.commons.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
* 保存用户信息【接收】实体
* @author pky
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserSaveVo {
/**
* 用户ID
*/
private String userId;
/**
* 用户名
*/
@NotBlank(message = "用户名不可为空")
private String userName;
/**
* 联系电话
*/
@Email
private String email;
/**
* 手机号
*/
private String phone;
}
4、Mapper
package com.pky.model.commons.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pky.model.commons.domain.table.UserInfo;
/**
* 用户基本信息表(user_info)Mapper
* @author pky
*/
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
5、Service
5.1 接口
包括模糊搜索、分页、排序等接口。待完善
package com.pky.model.commons.services.po;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pky.model.commons.domain.po.UserInfo;
import com.pky.model.commons.domain.vo.UserSaveVo;
import java.util.List;
/**
* 用户基本信息表(user_info)业务接口
* @author pky
*/
public interface UserInfoService extends IService<UserInfo> {
/**
* 通过用户名获取用户列表
* @param userName 用户名
* @return 用户列表
*/
List<UserInfo> getByUserName(String userName);
/**
* 通过email获取用户信息
* @param email 邮箱(唯一)
* @return 用户信息
*/
UserInfo getByEmail(String email);
/**
* 保存用户信息
* @param userSaveVo 保存用户信息【接收】实体
* @return 保存后的用户信息
* @throws Exception 除了自定义的 ServiceException 外,其他都为代码错误
*/
UserInfo save(UserSaveVo userSaveVo) throws Exception;
/**
* 条件分页搜索排序用户信息
* @param keyword 关键字(用户名、手机号),为空表示全部
* @param sortType 排序类型:1/创建时间升序排序; 2/创建时间降序排序,为空则不指定排序
* @param pageNum 当前页
* @param pageSize 每页条数
* @return 分页后的用户信息
*/
IPage<UserInfo> getPageByConditional(String keyword, Integer sortType, int pageNum, int pageSize);
}
5.2 实现类
包括模糊搜索、分页、排序等实现。待完善
package com.pky.model.commons.services.po.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pky.model.commons.domain.po.UserInfo;
import com.pky.model.commons.domain.vo.UserSaveVo;
import com.pky.model.commons.mapper.UserInfoMapper;
import com.pky.model.commons.services.po.UserInfoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 用户基本信息表(user_info)业务逻辑,为了解耦,只操作本表,不涉及其他表逻辑,若需要联合其他表,则需要在上一层 Service 中添加【响应】的业务逻辑来整合。
* @author pky
*/
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
/**
* 通过用户名获取用户列表
* @param userName 用户名
* @return 用户列表
*/
@Override
public List<UserInfo> getByUserName(String userName) {
return lambdaQuery().eq(UserInfo::getUserName, userName).list();
}
/**
* 通过email获取用户信息
* @param email 邮箱(唯一)
* @return 用户信息
*/
@Override
public UserInfo getByEmail(String email) {
return lambdaQuery().eq(UserInfo::getEmail, email).one();
}
/**
* 保存用户信息
* @param userSaveVo 保存用户信息【接收】实体
* @return 保存后的用户信息
* @throws Exception 除了自定义的 ServiceException 外,其他都为代码错误
*/
@Override
public UserInfo save(UserSaveVo userSaveVo) throws Exception {
// 拷贝用户基本信息
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(userSaveVo, userInfo);
// 新增
if(userSaveVo.getUserId() == null) {
// 数据库表中的新增时间已默认当前时间,因此无需再设置
save(userInfo);
}
// 修改
else {
// 获取用户信息
UserInfo user = getById(userSaveVo.getUserId());
if(user == null) {
// TODO 抛异常,全局捕获(用户信息不存在)
}
userInfo.setUpdated(new Date());
updateById(userInfo);
}
return userInfo;
}
/**
* 条件分页搜索排序用户信息
* @param keyword 关键字(用户名、手机号),为空表示全部
* @param sortType 排序类型:1/创建时间升序排序; 2/创建时间降序排序,为空则默认按用户ID升序排序
* @param pageNum 当前页
* @param pageSize 每页条数
* @return 分页后的用户信息
*/
@Override
public IPage<UserInfo> getPageByConditional(String keyword, Integer sortType, int pageNum, int pageSize) {
IPage<UserInfo> pageInfo = new Page<>(pageNum, pageSize);
return lambdaQuery()
.func(condition -> {
if(StringUtils.isNotBlank(keyword)) {
condition.like(UserInfo::getUserName, keyword).or().like(UserInfo::getPhone, keyword);
}
})
.func(condition -> {
if(sortType == null) {
condition.orderByAsc(UserInfo::getUserId);
}
else if(sortType == 1) {
condition.orderByAsc(UserInfo::getCreated);
}
else {
condition.orderByDesc(UserInfo::getCreated);
}
})
.page(pageInfo);
}
}
6、配置类
package com.pky.model.commons.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* mybatis-plus 配置类
* @author pky
*/
@Configuration
@MapperScan("com.pky.model..*.mapper*")
public class MybatisPlusConfig {
/**
* mybatis-plus 配置
* @return MybatisPlus拦截器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页配置
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
7、Controller
package com.pky.model.commons.controller.user;
import com.pky.model.commons.domain.table.UserInfo;
import com.pky.model.commons.service.table.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 用户信息控制器
* @author pky
*/
@RestController
@RequestMapping(value = "api/commons/user/info")
public class UserInfoController {
private final UserInfoService userInfoService;
@Autowired
UserInfoController(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
/**
* 通过用户名获取用户信息
* @param userName 用户名
* @return 用户列表
*/
@GetMapping(value = "")
public List<UserInfo> getByUserName(String userName) {
return userInfoService.getByUserName(userName);
}
}
8、测试
浏览器输入对应 API 地址,如下通过用户名获取用户信息的 Json 结果:
[
{
"userId": "8964598465900",
"userName": "pky",
"email": "pkyShare@qq.com",
"phone": "13500000000",
"created": "2022-01-03 09:00:00",
"updated": null
},
{
"userId": "8964598465984",
"userName": "pky",
"email": "pkyShare2@qq.com",
"phone": "13600000000",
"created": "2022-01-04 13:52:07",
"updated": null
}
]
注:以上返回格式未处理,可自行定义返回结构。为 null 不返回的后续处理。