第三章:MyBatis-Plus跟pagehelper的配置
MyBatis-Plus
当我们使用了mybatis-plus过后,就不需要在去pom中引用mybatis了。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
这里没啥要说的,官网的文档已经提供的灰常的详细了:https://mp.baomidou.com/
为什么要使用这个呢,主要是他真的是简化了太多mybatis的使用了。非常棒的一个框架。
现在,我开始来配置他,主要是在yml里面新增配置:
# mybatis-plus配置
mybatis-plus:
# mapper.xml路径
mapper-locations: classpath*:mapper/**/*.xml
# 实体扫描,多个package用逗号或者分号分隔
type-aliases-package: com.hzw.code.fast.entity
global-config:
db-config:
# 驼峰下划线转换
table-underline: true
# id生成策略采用默认雪花
id-type: id_worker_str
configuration:
# 配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(如不开启,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
# 打印sql配置
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
这里的配置主要是指定我们mapper.xml的位置,跟实体类的位置,还有主键策略等
配置mybatis的mapper接口扫描
/**
* 程序入口
*/
@SpringBootApplication
@MapperScan("com.hzw.code.fast.mapper")
public class FastApplication {
public static void main(String[] args) {
ConfigurableApplicationContext application = SpringApplication.run(FastApplication.class, args);
CommonUtils.printSysInfo(application);
}
}
PageHelper
分页插件的集成,我们的分页都交给PageHelper来处理,这里就不贴上PageHelper的maven配置了,因为我们在第二章的时候,已经把所有的pom都引入了。下面我们直接开始上配置:
# 分页配置
pagehelper:
supportMethodsArguments: true
reasonable: false
helperDialect: mysql
params: count=countSql
万事俱备,我们开始弄数据库吧!
创建用户表
create table sys_user(
user_id varchar(64) comment '雪花主键',
real_name varchar(50) comment '账号',
user_pass varchar(64) comment '密码',
user_name varchar(50) comment '用户名称',
user_phone varchar(20) comment '手机号码',
user_email varchar(50) comment '邮箱',
user_status int comment '数据状态:1启用;2禁用',
create_time datetime comment '创建时间',
PRIMARY KEY (user_id)
) comment '用户表';
实体类SysUser
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.hzw.code.fast.entity.BaseEntity;
import lombok.Data;
import java.util.Date;
/**
* 用户实体
*/
@Data
@TableName("sys_user")
public class SysUser extends BaseEntity {
/**
* 用户编号
*/
@TableId
private String userId;
/**
* 登录账号
*/
private String userAccount;
/**
* 密码
*/
private String userPass;
/**
* 用户名称
*/
private String userName;
/**
* 手机号码
*/
private String userPhone;
/**
* 邮箱
*/
private String userEmail;
/**
* 数据状态:1启用;2禁用
*/
private Integer userStatus;
/**
* 创建时间
*/
private Date createTime;
}
这里的@TableName对应的表名,@TableId对应的主键,一定要记得加上
SysUserMapper.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.hzw.code.fast.mapper.sys.SysUserMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.hzw.code.fast.entity.sys.SysUserEntity">
<id column="user_id" property="userId" />
<result column="user_account" property="userAccount" />
<result column="user_pass" property="userPass" />
<result column="user_name" property="userName" />
<result column="user_phone" property="userPhone" />
<result column="user_email" property="userEmail" />
<result column="user_status" property="userStatus" />
<result column="create_time" property="createTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
user_id,user_account,user_pass,user_name,user_phone,user_email,user_status,create_time
</sql>
<!-- 分页查询 -->
<select id="findSysUserList" parameterType="com.hzw.code.fast.dto.sys.query.SysUserQueryDto"
resultType="com.hzw.code.fast.dto.sys.SysUserDto">
select <include refid="Base_Column_List" /> from sys_user
<where>
<if test="userName != null and userName != ''">
and user_name like concat('%',#{userName},'%')
</if>
<if test="userPhone != null and userPhone != null">
and user_phone = #{userPhone}
</if>
</where>
</select>
</mapper>
SysUserMapper接口
这里的接口需要继承一下BaseMapper,继承他以后就可以使用mybatisplus提供的一些便捷操作接口了
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzw.code.fast.dto.sys.SysUserDto;
import com.hzw.code.fast.dto.sys.query.SysUserQueryDto;
import com.hzw.code.fast.entity.sys.SysUserEntity;
import java.util.List;
/**
* 用户数据层接口
*/
public interface SysUserMapper extends BaseMapper<SysUserEntity> {
/**
* 列表查询
* @param queryDto
* @return
*/
List<SysUserDto> findSysUserList(SysUserQueryDto queryDto);
}
查询返回的参数SysUserDto
这里需要写一下dto,因为有一些参数我们不想直接返回给前端,也不想前端传上来的,所以需要多封装一些实体类来进行参数的接收跟返回。
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 用户返回实体
*/
@Data
@ApiModel("用户返回实体")
public class SysUserDto implements Serializable {
/**
* 用户编号
*/
@ApiModelProperty(value = "用户编号", name="userId")
private String userId;
/**
* 登录账号
*/
@ApiModelProperty(value = "登录账号", name="userAccount")
private String userAccount;
/**
* 用户名称
*/
@ApiModelProperty(value = "用户名称", name="userName")
private String userName;
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码", name="userPhone")
private String userPhone;
/**
* 邮箱
*/
@ApiModelProperty(value = "邮箱", name="userEmail")
private String userEmail;
/**
* 数据状态:1启用;2禁用
*/
@ApiModelProperty(value = "数据状态:1启用;2禁用", name="userStatus")
private Integer userStatus;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间", name="createTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
这里面要注意不需要返回给前端的数据就不要放在这里面。
还有查询条件参数SysUserQueryDto
import com.hzw.code.fast.constant.BaseQueryPageDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户查询参数
*/
@Data
@ApiModel("用户查询")
public class SysUserQueryDto extends BaseQueryPageDto {
/**
* 用户名称
*/
@ApiModelProperty(value = "用户名称参数", name="userName")
private String userName;
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码参数", name="userPhone")
private String userPhone;
}
这里的BaseQueryPageDto主要封装了分页需要的参数
里面的ApiModel跟ApiModelProperty的注解是swagger的,一个是实体类的一个是实体类的属性,在这里定义后,方便前端开放人员在swagger文档上查看到实体类跟属性的具体注释。
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 分页公共类
*/
@ApiModel("分页数据")
@Data
public class BaseQueryPageDto implements Serializable {
/**
* 当前页
*/
@ApiModelProperty(value = "当前页", name="pageNum")
private Integer pageNum;
/**
* 每页显示条目
*/
@ApiModelProperty(value = "每页显示条目", name="pageSize")
private Integer pageSize;
}
Service
在接口中继承IService,在实现类中继承ServiceImpl,这里就可以使用mybatisplus提供的骚操作了
记得在实现类中加上@Service(业务层标识)跟@Transactional(事务)的注解
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.hzw.code.fast.dto.sys.SysUserDto;
import com.hzw.code.fast.dto.sys.query.SysUserQueryDto;
import com.hzw.code.fast.entity.sys.SysUserEntity;
/**
* 用户业务层接口
*/
public interface SysUserService extends IService<SysUserEntity> {
/**
* 分页查询
* @param queryDto
* @return
*/
PageInfo<SysUserDto> findSysUserList(SysUserQueryDto queryDto);
/**
* 查询账号是否存在
* @param account
* @return
*/
int getCountByAccount(String account);
/**
* 查询账号是否存在
* @param account
* @return
*/
int getCountByPhone(String account);
}
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hzw.code.fast.dto.sys.SysUserDto;
import com.hzw.code.fast.dto.sys.query.SysUserQueryDto;
import com.hzw.code.fast.entity.sys.SysUserEntity;
import com.hzw.code.fast.mapper.sys.SysUserMapper;
import com.hzw.code.fast.service.sys.SysUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 用户业务层实现类
*/
@Service
@Transactional
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity> implements SysUserService {
private final SysUserMapper userMapper;
public SysUserServiceImpl(SysUserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public PageInfo<SysUserDto> findSysUserList(SysUserQueryDto queryDto) {
// 启用分页
PageHelper.startPage(queryDto.getPageNum(),queryDto.getPageSize());
PageInfo<SysUserDto> pageInfo = new PageInfo<>(userMapper.findSysUserList(queryDto));
return pageInfo;
}
@Override
public int getCountByAccount(String account) {
QueryWrapper<SysUserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_account",account);
return super.count(queryWrapper);
}
@Override
public int getCountByPhone(String phone) {
QueryWrapper<SysUserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_phone",phone);
return super.count(queryWrapper);
}
}
Test
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.hzw.code.fast.constant.CoreConstants;
import com.hzw.code.fast.dto.sys.SysUserDto;
import com.hzw.code.fast.dto.sys.query.SysUserQueryDto;
import com.hzw.code.fast.entity.sys.SysUserEntity;
import com.hzw.code.fast.service.sys.SysUserService;
import com.hzw.code.fast.utils.Md5Utils;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.List;
/**
* 用户单元测试
*/
@SpringBootTest
public class SysUserTests {
@Autowired
private SysUserService userService;
/**
* 新增
*/
@Test
public void addUser(){
System.out.println("====================用户新增开始===================");
SysUserEntity user = new SysUserEntity();
user.setUserAccount("fastAccount");
user.setUserPhone("11111111111");
user.setCreateTime(new Date());
user.setUserEmail("aaa@qq.com");
user.setUserName("胡汉三");
user.setUserPass(Md5Utils.md5("123456",null, CoreConstants.PASSWORD_MD5_SUFFIX));
user.setUserStatus(1);
int count = userService.getCountByAccount(user.getUserAccount());
if(count > 0){
System.out.println("账号:"+user.getUserAccount()+".已存在!请重新输入");
return;
}
count = userService.getCountByPhone(user.getUserPhone());
if(count > 0){
System.out.println("手机号码:"+user.getUserPhone()+".已存在!请重新输入");
return;
}
userService.save(user);
System.out.println("====================用户新增成功:"+user.getUserId()+"===================");
userId = user.getUserId();
}
/**
* 批量新增
*/
@Test
public void batchAdd(){
List<SysUserEntity> list = Lists.newArrayList();
for(int i = 0; i < 100; i++){
SysUserEntity user = new SysUserEntity();
user.setUserAccount("fastAccount"+i);
user.setUserPhone("11111"+i+"11111");
user.setCreateTime(new Date());
user.setUserEmail("hzw2312"+i+"@sina.com");
user.setUserName("胡汉三"+i);
user.setUserPass(Md5Utils.md5("123456"+i,null, CoreConstants.PASSWORD_MD5_SUFFIX));
user.setUserStatus(1);
list.add(user);
}
userService.saveBatch(list);
}
private String userId = "1255792358295744513";
/**
* 删除
*/
@Test
public void delUser(){
System.out.println("====================用户删除开始:"+userId+"===================");
userService.removeById(userId);
System.out.println("====================删除成功===================");
}
/**
* 修改
*/
@Test
public void editUser(){
SysUserEntity user = new SysUserEntity();
user.setUserId("1255795451725041665");
user.setUserAccount("admin");
userService.updateById(user);
}
/**
* 分页查询
*/
@Test
public void page(){
SysUserQueryDto queryDto = new SysUserQueryDto();
queryDto.setPageNum(1);
queryDto.setPageSize(10);
PageInfo<SysUserDto> pageInfo = userService.findSysUserList(queryDto);
String json = JSON.toJSON(pageInfo).toString();
System.out.println(json);
}
}
这样我们的mybatisPlus跟pageHelper都能正常的使用了,接下来我们将进行Spring Security的配置
----------------------------------------------------------
项目的源码地址:https://gitee.com/gzsjd/fast
----------------------------------------------------------
推荐阅读
-
Mybatis分页插件PageHelper的配置和简单使用方法(推荐)
-
Spring 学习指南 第三章 bean的配置 (未完结)
-
详解mybatis-plus的 mapper.xml 路径配置的坑
-
解决Mybatis-plus和pagehelper依赖冲突的方法示例
-
Springboot集成通用Mapper与Pagehelper,实现mybatis+Druid的多数据源配置
-
spring 攻略 - 笔记- 第三章 Spring中Bean的配置(1)
-
对于游戏玩家 4k跟2k显示器需要什么配置的主机才能带得动?
-
easycode配置成mybatis-plus模板的实现方法
-
druid作为数据库连接池的几种配置总结,通过debug去跟配置结果
-
java跟php异构系统的配置