前述
本次微服务架构的构建过程以Mysql来作为关系型数据库,flyway进行数据库版本控制。
引入基础依赖
此微服务架构在设计上使用分服务分库的的模式,即每个服务都有一个单独的数据库模块,为减少代码冗余,将相关依赖引入到common中。
<!-- 集成mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mybatis-plus dao框架-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 集成flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
在相应的服务中的resources目录下创建db/migration目录,如果在创建服务时选择了flyway插件,会自动创建此目录。因为开发环境的数据库变动更频繁,但是生产环境的变动频率很低,所以在生产环境中没有必要创建很多的sql文件。所以可以再migration目录下创建各环境的目录:local、test、prod
配置相关连接
在yml文件中对Mysql连接数据、flyway基础配置进行配置
#在application.yml文件中配置
spring:
#设置flyway
flyway:
enabled: true
#执行文件夹位置
locations: classpath:db/migration/@spring.active@
# 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移
baseline-on-migrate: true
# 是否允许无序的迁移 开发环境最好开启, 生产环境关闭
out-of-order: true
# 关闭占位符替换,因为插入的sql里边可能包含${}关键字
placeholder-replacement: false
#在application-${profile}.yml文件中配置
spring:
#数据库链接
datasource:
url: jdbc:mysql://127.0.0.1:33062/micro-base?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true
username: root
password: root
# 连接池大小根据实际情况调整
max-active: 100
max-pool-prepared-statement-per-connection-size: 100
因为flyway文件配置对环境没有什么差异性配置,所以作为基础配置在application.yml文件中进行配置,但是不同的环境的数据库链接不同,所以在不同的环境文件中进行配置。
使用flyway进行数据库管理
V<VERSION>__<NAME>.sql」,在对应的文件中创建初始化sql语句。
创建 yl-base-moudle 用于存放请求体和结果返回体,避免多服务之间互相依赖,其创建步骤与common相同,不做赘述【SpringCloud基础架构构建过程(一)__构建基础服务架构_Black Michael的博客-CSDN博客】,在实体类之外创建 BaseRequest.java 用于存放请求时的一些公共字段.
package micro.model;
import lombok.Data;
import java.io.Serializable;
/**
* 请求基类,所有接口请求可继承此类
*
* @author Black Michael
* @date 2021/8/15
*/
@Data
public class BaseRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 开始时间
*/
private String searchBeginTime;
/**
* 结束时间
*/
private String searchEndTime;
/**
* 分页:每页大小(默认20)
*/
private Integer pageSize;
/**
* 分页:第几页(从1开始)
*/
private Integer pageNo;
/**
* 排序字段
*/
private String orderBy;
/**
* 正序或者倒序排列(asc 或 desc)
*/
private String sortBy;
}
创建一个空数据库 micro-base。
启动项目, 此时flyway会自动在数据库执行文件中的sql语句,并在第一次执行时生成 flyway_schema_history 表结构,用于存储flyway的版本数据以及文件校验的校验值。同时,通过控制台我们能够看到fkyway的具体执行步骤以及执行结果。
至此,flyway的简单集成已经完成。
集成MybatisPlus
下面开始集成MybatisPlus。
根据生成的表结构生成或手动创建文件SysUser.java 、SysUserParam.java 、SysUserResult .java、SysUserController.java 、SysUserService.java 、SysUserSserviceImpl.java 、SysUserMapper.java 、 SysUserMapper.xml。如下图:
具体代码如下:
package com.dgh.micro.model.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统用户
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
@Data
@TableName("sys_user")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "user_id", type = IdType.ID_WORKER)
private Long userId;
/**
* 集团id
*/
@TableField("group_id")
private Long groupId;
/**
* 姓名
*/
@TableField("real_name")
private String realName;
/**
* 昵称
*/
@TableField("nick_name")
private String nickName;
/**
* 账号
*/
@TableField("account")
private String account;
/**
* 工号
*/
@TableField("work_no")
private String workNo;
/**
* 密码,加密方式为BCrypt
*/
@TableField("password")
private String password;
/**
* 头像,存的为文件id
*/
@TableField("avatar")
private Long avatar;
/**
* 生日
*/
@TableField("birthday")
private Date birthday;
/**
* 性别:M-男,F-女
*/
@TableField("sex")
private String sex;
/**
* 邮箱
*/
@TableField("email")
private String email;
/**
* 手机
*/
@TableField("phone")
private String phone;
/**
* 电话
*/
@TableField("tel")
private String tel;
/**
* 是否是超级管理员:Y-是,N-否
*/
@TableField("super_admin_flag")
private String superAdminFlag;
/**
* 状态:1-正常,2-冻结
*/
@TableField("status_flag")
private Integer statusFlag;
/**
* 最后登陆IP
*/
@TableField("last_login_ip")
private String lastLoginIp;
/**
* 最后登陆时间
*/
@TableField("last_login_time")
private Date lastLoginTime;
/**
* 删除标记:Y-已删除,N-未删除
*/
@TableField("del_flag")
private String delFlag;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人
*/
@TableField(value = "create_user", fill = FieldFill.INSERT)
private Long createUser;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人
*/
@TableField(value = "update_user", fill = FieldFill.UPDATE)
private Long updateUser;
@Override
public String toString() {
return "SysUser{" +
"userId=" + userId +
", groupId=" + groupId +
", realName=" + realName +
", nickName=" + nickName +
", account=" + account +
", workNo=" + workNo +
", password=" + password +
", avatar=" + avatar +
", birthday=" + birthday +
", sex=" + sex +
", email=" + email +
", phone=" + phone +
", tel=" + tel +
", superAdminFlag=" + superAdminFlag +
", statusFlag=" + statusFlag +
", lastLoginIp=" + lastLoginIp +
", lastLoginTime=" + lastLoginTime +
", delFlag=" + delFlag +
", createTime=" + createTime +
", createUser=" + createUser +
", updateTime=" + updateTime +
", updateUser=" + updateUser +
"}";
}
}
package com.dgh.micro.model.vo.param;
import com.dgh.micro.model.BaseRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统用户
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
@Data
@ApiModel
public class SysUserParam extends BaseRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ApiModelProperty("主键")
private Long userId;
/**
* 集团id
*/
@ApiModelProperty("集团id")
private Long groupId;
/**
* 姓名
*/
@ApiModelProperty("姓名")
private String realName;
/**
* 昵称
*/
@ApiModelProperty("昵称")
private String nickName;
/**
* 账号
*/
@ApiModelProperty("账号")
private String account;
/**
* 工号
*/
@ApiModelProperty("工号")
private String workNo;
/**
* 密码,加密方式为BCrypt
*/
@ApiModelProperty("密码,加密方式为BCrypt")
private String password;
/**
* 头像,存的为文件id
*/
@ApiModelProperty("头像,存的为文件id")
private Long avatar;
/**
* 生日
*/
@ApiModelProperty("生日")
private Date birthday;
/**
* 性别:M-男,F-女
*/
@ApiModelProperty("性别:M-男,F-女")
private String sex;
/**
* 邮箱
*/
@ApiModelProperty("邮箱")
private String email;
/**
* 手机
*/
@ApiModelProperty("手机")
private String phone;
/**
* 电话
*/
@ApiModelProperty("电话")
private String tel;
/**
* 是否是超级管理员:Y-是,N-否
*/
@ApiModelProperty("是否是超级管理员:Y-是,N-否")
private String superAdminFlag;
/**
* 状态:1-正常,2-冻结
*/
@ApiModelProperty("状态:1-正常,2-冻结")
private Integer statusFlag;
/**
* 最后登陆IP
*/
@ApiModelProperty("最后登陆IP")
private String lastLoginIp;
/**
* 最后登陆时间
*/
@ApiModelProperty("最后登陆时间")
private Date lastLoginTime;
/**
* 删除标记:Y-已删除,N-未删除
*/
@ApiModelProperty(hidden = true)
private String delFlag;
/**
* 创建时间
*/
@ApiModelProperty(hidden = true)
private Date createTime;
/**
* 创建人
*/
@ApiModelProperty(hidden = true)
private Long createUser;
/**
* 更新时间
*/
@ApiModelProperty(hidden = true)
private Date updateTime;
/**
* 更新人
*/
@ApiModelProperty(hidden = true)
private Long updateUser;
}
package com.dgh.micro.model.vo.result;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统用户
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
@Data
@ApiModel
public class SysUserResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ApiModelProperty("主键")
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long userId;
/**
* 集团id
*/
@ApiModelProperty("集团id")
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long groupId;
/**
* 姓名
*/
@ApiModelProperty("姓名")
private String realName;
/**
* 昵称
*/
@ApiModelProperty("昵称")
private String nickName;
/**
* 账号
*/
@ApiModelProperty("账号")
private String account;
/**
* 工号
*/
@ApiModelProperty("工号")
private String workNo;
/**
* 密码,加密方式为BCrypt
*/
@ApiModelProperty("密码,加密方式为BCrypt")
private String password;
/**
* 头像,存的为文件id
*/
@ApiModelProperty("头像,存的为文件id")
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long avatar;
/**
* 生日
*/
@ApiModelProperty("生日")
private Date birthday;
/**
* 性别:M-男,F-女
*/
@ApiModelProperty("性别:M-男,F-女")
private String sex;
/**
* 邮箱
*/
@ApiModelProperty("邮箱")
private String email;
/**
* 手机
*/
@ApiModelProperty("手机")
private String phone;
/**
* 电话
*/
@ApiModelProperty("电话")
private String tel;
/**
* 是否是超级管理员:Y-是,N-否
*/
@ApiModelProperty("是否是超级管理员:Y-是,N-否")
private String superAdminFlag;
/**
* 状态:1-正常,2-冻结
*/
@ApiModelProperty("状态:1-正常,2-冻结")
private Integer statusFlag;
/**
* 最后登陆IP
*/
@ApiModelProperty("最后登陆IP")
private String lastLoginIp;
/**
* 最后登陆时间
*/
@ApiModelProperty("最后登陆时间")
private Date lastLoginTime;
/**
* 删除标记:Y-已删除,N-未删除
*/
@ApiModelProperty(hidden = true)
private String delFlag;
/**
* 创建时间
*/
@ApiModelProperty(hidden = true)
private Date createTime;
/**
* 创建人
*/
@ApiModelProperty(hidden = true)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long createUser;
/**
* 更新时间
*/
@ApiModelProperty(hidden = true)
private Date updateTime;
/**
* 更新人
*/
@ApiModelProperty(hidden = true)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long updateUser;
}
package com.dgh.micro.controller;
import com.dgh.micro.model.ResponseData;
import com.dgh.micro.model.SuccessResponseData;
import com.dgh.micro.model.vo.PageResult;
import com.dgh.micro.model.vo.param.SysUserParam;
import com.dgh.micro.model.vo.result.SysUserResult;
import com.dgh.micro.service.interf.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.List;
/**
* 系统用户控制器
*
* @author DGH DEMO
* @Date 2021-11-01 11:03:55
*/
@Slf4j
@RestController
@RequestMapping(name = "系统用户管理", path = "/sysUser")
@Api(tags = "系统用户")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
/**
* 新增系统用户
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "添加系统用户", path = "/add")
@ApiOperation("新增系统用户")
public ResponseData add(@RequestBody SysUserParam param) {
sysUserService.add(param);
return new SuccessResponseData();
}
/**
* 新增或修改[全字段更新,没有值的字段会被更新为null]
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "新增或修改系统用户", path = "/addOrUpdate")
@ApiOperation("新增或修改[全字段更新,没有值的字段会被更新为null]")
public ResponseData addOrUpdate(@RequestBody SysUserParam param) {
sysUserService.addOrUpdate(param);
return new SuccessResponseData();
}
/**
* 修改系统用户
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "修改系统用户", path = "/update")
@ApiOperation("修改系统用户")
public ResponseData update(@RequestBody SysUserParam param) {
sysUserService.update(param);
return new SuccessResponseData();
}
/**
* 删除系统用户
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "删除系统用户", path = "/delete")
@ApiOperation("删除系统用户")
public ResponseData delete(@RequestBody SysUserParam param) {
sysUserService.delete(param);
return new SuccessResponseData();
}
/**
* 查询单条系统用户详情
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "查询系统用户详情", path = "/queryDetail")
@ApiOperation(value = "查询系统用户详情", response = SysUserResult.class)
public ResponseData queryDetail(@RequestBody SysUserParam param) {
SysUserResult result = sysUserService.findBySpec(param);
return new SuccessResponseData(result);
}
/**
* 查询系统用户列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "查询系统用户列表", path = "/queryList")
@ApiOperation(value = "查询系统用户列表", response = SysUserResult.class)
public ResponseData queryList(@RequestBody SysUserParam param) {
List<SysUserResult> listBySpec = sysUserService.findListBySpec(param);
return new SuccessResponseData(listBySpec);
}
/**
* 分页查询系统用户列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
@PostMapping(name = "分页查询系统用户列表", path = "/queryListPage")
@ApiOperation(value = "分页查询系统用户列表", response = SysUserResult.class)
public ResponseData queryListPage(@RequestBody SysUserParam param) {
PageResult<SysUserResult> pageBySpec = sysUserService.findPageBySpec(param);
return new SuccessResponseData(pageBySpec);
}
}
package com.dgh.micro.service.interf;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dgh.micro.model.domain.SysUser;
import com.dgh.micro.model.vo.PageResult;
import com.dgh.micro.model.vo.param.SysUserParam;
import com.dgh.micro.model.vo.result.SysUserResult;
import java.util.List;
/**
* <p>
* 系统用户 服务类
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
public interface SysUserService extends IService<SysUser> {
/**
* 新增
*
* @author DGH DEMO
* @Date 2021-11-01
*/
void add(SysUserParam param);
/**
* 新增或更新
*
* @author DGH DEMO
* @Date 2021-11-01
*/
void addOrUpdate(SysUserParam param);
/**
* 删除
*
* @author DGH DEMO
* @Date 2021-11-01
*/
void delete(SysUserParam param);
/**
* 更新
*
* @author DGH DEMO
* @Date 2021-11-01
*/
void update(SysUserParam param);
/**
* 查询单条数据,Specification模式
*
* @author DGH DEMO
* @Date 2021-11-01
*/
SysUserResult findBySpec(SysUserParam param);
/**
* 查询列表,Specification模式
*
* @author DGH DEMO
* @Date 2021-11-01
*/
List<SysUserResult> findListBySpec(SysUserParam param);
/**
* 查询分页数据,Specification模式
*
* @author DGH DEMO
* @Date 2021-11-01
*/
PageResult<SysUserResult> findPageBySpec(SysUserParam param);
/**
* 根据主键全字段更新
*
* @author DGH DEMO
* @Date 2021-11-01
*/
Boolean updateByPrimaryKey(SysUserParam param);
}
package com.dgh.micro.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
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.dgh.micro.mapper.SysUserMapper;
import com.dgh.micro.model.PageResultFactory;
import com.dgh.micro.model.domain.SysUser;
import com.dgh.micro.model.vo.PageResult;
import com.dgh.micro.model.vo.param.SysUserParam;
import com.dgh.micro.model.vo.result.SysUserResult;
import com.dgh.micro.service.interf.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.List;
/**
* <p>
* 系统用户 服务实现类
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
@Slf4j
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
@Override
public void add(SysUserParam param) {
SysUser entity = getEntity(param);
this.save(entity);
}
@Override
public void addOrUpdate(SysUserParam param) {
SysUser entity = getEntity(param);
if (ObjectUtil.isNotEmpty(param.getUserId())) {
this.updateByPrimaryKey(param);
} else {
this.save(entity);
}
}
@Override
public void delete(SysUserParam param) {
this.removeById(getKey(param));
}
@Override
public void update(SysUserParam param) {
SysUser oldEntity = getOldEntity(param);
SysUser newEntity = getEntity(param);
BeanUtil.copyProperties(newEntity, oldEntity);
this.updateById(newEntity);
}
@Override
public SysUserResult findBySpec(SysUserParam param) {
return null;
}
@Override
public List<SysUserResult> findListBySpec(SysUserParam param) {
List<SysUserResult> results = this.baseMapper.customList(param);
return results;
}
@Override
public PageResult<SysUserResult> findPageBySpec(SysUserParam param) {
Page pageContext = getPageContext(param);
IPage<SysUserResult> page = this.baseMapper.customPageList(pageContext, param);
return PageResultFactory.createPageResult(page);
}
@Override
public Boolean updateByPrimaryKey(SysUserParam param) {
Integer count = this.baseMapper.updateByPrimaryKey(param);
return count > 0;
}
private Serializable getKey(SysUserParam param) {
return param.getUserId();
}
private Page getPageContext(SysUserParam param) {
int pageSize = 20;
int pageNo = 1;
//每页条数
Integer pageSizeString = param.getPageSize();
if (ObjectUtil.isNotEmpty(pageSizeString)) {
pageSize = pageSizeString;
}
//第几页
Integer pageNoString = param.getPageNo();
if (ObjectUtil.isNotEmpty(pageNoString)) {
pageNo = pageNoString;
}
return new Page<>(pageNo, pageSize);
}
private SysUser getOldEntity(SysUserParam param) {
return this.getById(getKey(param));
}
private SysUser getEntity(SysUserParam param) {
SysUser entity = new SysUser();
BeanUtil.copyProperties(param, entity);
return entity;
}
}
package com.dgh.micro.mapper;
import com.dgh.micro.model.domain.SysUser;
import com.dgh.micro.model.vo.param.SysUserParam;
import com.dgh.micro.model.vo.result.SysUserResult;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 系统用户 Mapper 接口
* </p>
*
* @author DGH DEMO
* @since 2021-11-01
*/
public interface SysUserMapper extends BaseMapper<SysUser> {
/**
* 获取列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
List<SysUserResult> customList(@Param("paramCondition") SysUserParam paramCondition);
/**
* 获取map列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
List<Map<String, Object>> customMapList(@Param("paramCondition") SysUserParam paramCondition);
/**
* 获取分页实体列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
Page<SysUserResult> customPageList(@Param("page") Page page, @Param("paramCondition") SysUserParam paramCondition);
/**
* 获取分页map列表
*
* @author DGH DEMO
* @Date 2021-11-01
*/
Page<Map<String, Object>> customPageMapList(@Param("page") Page page, @Param("paramCondition") SysUserParam paramCondition);
/**
* 根据主键全字段更新
*
* @author DGH DEMO
* @Date 2021-11-01
*/
Integer updateByPrimaryKey(@Param("paramCondition") SysUserParam paramCondition);
}
<?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.dgh.micro.mapper.SysUserMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.dgh.micro.model.domain.SysUser">
<id column="user_id" property="userId" />
<result column="group_id" property="groupId" />
<result column="real_name" property="realName" />
<result column="nick_name" property="nickName" />
<result column="account" property="account" />
<result column="work_no" property="workNo" />
<result column="password" property="password" />
<result column="avatar" property="avatar" />
<result column="birthday" property="birthday" />
<result column="sex" property="sex" />
<result column="email" property="email" />
<result column="phone" property="phone" />
<result column="tel" property="tel" />
<result column="super_admin_flag" property="superAdminFlag" />
<result column="status_flag" property="statusFlag" />
<result column="last_login_ip" property="lastLoginIp" />
<result column="last_login_time" property="lastLoginTime" />
<result column="del_flag" property="delFlag" />
<result column="create_time" property="createTime" />
<result column="create_user" property="createUser" />
<result column="update_time" property="updateTime" />
<result column="update_user" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
user_id AS "userId", group_id AS "groupId", real_name AS "realName", nick_name AS "nickName", account AS "account", work_no AS "workNo", password AS "password", avatar AS "avatar", birthday AS "birthday", sex AS "sex", email AS "email", phone AS "phone", tel AS "tel", super_admin_flag AS "superAdminFlag", status_flag AS "statusFlag", last_login_ip AS "lastLoginIp", last_login_time AS "lastLoginTime", del_flag AS "delFlag", create_time AS "createTime", create_user AS "createUser", update_time AS "updateTime", update_user AS "updateUser"
</sql>
<!-- 通用查询 -->
<sql id="Base_Query_Clause">
<if test="paramCondition.userId != null">
and <![CDATA[ user_id = #{paramCondition.userId} ]]>
</if>
<if test="paramCondition.groupId != null">
and <![CDATA[ group_id = #{paramCondition.groupId} ]]>
</if>
<if test="paramCondition.realName != null and paramCondition.realName != ''">
and <![CDATA[ real_name like CONCAT('%', #{paramCondition.realName} ,'%') ]]>
</if>
<if test="paramCondition.nickName != null and paramCondition.nickName != ''">
and <![CDATA[ nick_name like CONCAT('%', #{paramCondition.nickName} ,'%') ]]>
</if>
<if test="paramCondition.account != null and paramCondition.account != ''">
and <![CDATA[ account like CONCAT('%', #{paramCondition.account} ,'%') ]]>
</if>
<if test="paramCondition.workNo != null and paramCondition.workNo != ''">
and <![CDATA[ work_no like CONCAT('%', #{paramCondition.workNo} ,'%') ]]>
</if>
<if test="paramCondition.password != null and paramCondition.password != ''">
and <![CDATA[ password like CONCAT('%', #{paramCondition.password} ,'%') ]]>
</if>
<if test="paramCondition.avatar != null">
and <![CDATA[ avatar = #{paramCondition.avatar} ]]>
</if>
<if test="paramCondition.birthday != null">
and <![CDATA[ birthday = #{paramCondition.birthday} ]]>
</if>
<if test="paramCondition.sex != null and paramCondition.sex != ''">
and <![CDATA[ sex like CONCAT('%', #{paramCondition.sex} ,'%') ]]>
</if>
<if test="paramCondition.email != null and paramCondition.email != ''">
and <![CDATA[ email like CONCAT('%', #{paramCondition.email} ,'%') ]]>
</if>
<if test="paramCondition.phone != null and paramCondition.phone != ''">
and <![CDATA[ phone like CONCAT('%', #{paramCondition.phone} ,'%') ]]>
</if>
<if test="paramCondition.tel != null and paramCondition.tel != ''">
and <![CDATA[ tel like CONCAT('%', #{paramCondition.tel} ,'%') ]]>
</if>
<if test="paramCondition.superAdminFlag != null and paramCondition.superAdminFlag != ''">
and <![CDATA[ super_admin_flag like CONCAT('%', #{paramCondition.superAdminFlag} ,'%') ]]>
</if>
<if test="paramCondition.statusFlag != null">
and <![CDATA[ status_flag = #{paramCondition.statusFlag} ]]>
</if>
<if test="paramCondition.lastLoginIp != null and paramCondition.lastLoginIp != ''">
and <![CDATA[ last_login_ip like CONCAT('%', #{paramCondition.lastLoginIp} ,'%') ]]>
</if>
<if test="paramCondition.lastLoginTime != null">
and <![CDATA[ last_login_time = #{paramCondition.lastLoginTime} ]]>
</if>
<if test="paramCondition.delFlag != null and paramCondition.delFlag != ''">
and <![CDATA[ del_flag like CONCAT('%', #{paramCondition.delFlag} ,'%') ]]>
</if>
<if test="paramCondition.createTime != null">
and <![CDATA[ create_time = #{paramCondition.createTime} ]]>
</if>
<if test="paramCondition.createUser != null">
and <![CDATA[ create_user = #{paramCondition.createUser} ]]>
</if>
<if test="paramCondition.updateTime != null">
and <![CDATA[ update_time = #{paramCondition.updateTime} ]]>
</if>
<if test="paramCondition.updateUser != null">
and <![CDATA[ update_user = #{paramCondition.updateUser} ]]>
</if>
<!-- 排序 -->
<if test="paramCondition.sort != null">
<![CDATA[ order by #{paramCondition.sort} #{paramCondition.order} ]]>
</if>
</sql>
<select id="customList" resultType="com.dgh.micro.model.vo.result.SysUserResult" parameterType="com.dgh.micro.model.vo.param.SysUserParam">
select
<include refid="Base_Column_List"/>
from sys_user where 1 = 1
<include refid="Base_Query_Clause"/>
</select>
<select id="customMapList" resultType="map" parameterType="com.dgh.micro.model.vo.param.SysUserParam">
select
<include refid="Base_Column_List"/>
from sys_user where 1 = 1
<include refid="Base_Query_Clause"/>
</select>
<select id="customPageList" resultType="com.dgh.micro.model.vo.result.SysUserResult" parameterType="com.dgh.micro.model.vo.param.SysUserParam">
select
<include refid="Base_Column_List"/>
from sys_user where 1 = 1
<include refid="Base_Query_Clause"/>
</select>
<select id="customPageMapList" resultType="map" parameterType="com.dgh.micro.model.vo.param.SysUserParam">
select
<include refid="Base_Column_List"/>
from sys_user where 1 = 1
<include refid="Base_Query_Clause"/>
</select>
<update id="updateByPrimaryKey" parameterType="com.dgh.micro.model.vo.param.SysUserParam">
update sys_user
set
group_id = #{paramCondition.groupId},
real_name = #{paramCondition.realName},
nick_name = #{paramCondition.nickName},
account = #{paramCondition.account},
work_no = #{paramCondition.workNo},
password = #{paramCondition.password},
avatar = #{paramCondition.avatar},
birthday = #{paramCondition.birthday},
sex = #{paramCondition.sex},
email = #{paramCondition.email},
phone = #{paramCondition.phone},
tel = #{paramCondition.tel},
super_admin_flag = #{paramCondition.superAdminFlag},
status_flag = #{paramCondition.statusFlag},
last_login_ip = #{paramCondition.lastLoginIp},
last_login_time = #{paramCondition.lastLoginTime},
del_flag = #{paramCondition.delFlag},
create_time = #{paramCondition.createTime},
create_user = #{paramCondition.createUser},
update_time = #{paramCondition.updateTime},
update_user = #{paramCondition.updateUser}
where
user_id = #{paramCondition.userId}
</update>
</mapper>
集成 MybatisPlus最主要的实在service层继承 ServiceImpl<XxxxMapper, XxxxUser> 以此来使用MybatisPlus自带的已经集成的一些基础方法,比如saveBatch、saveOrUpdate、saveOrUpdateBatch等,同时在Mapper.java的类中继承BaseMapper<Xxxxx> 。这里出现了BaseMapper、ServiceImpl两个MybatisPlus接口和类,其中的区别是:BaseMapper 针对dao层的方法封装 CRUD,ServiceImpl 针对业务逻辑层的实现,需要指定Dao层类和对应的实体类,是在BaseMapper基础上的加强。
具体方法演示MybatisPlus的使用:
在Controller层创建一个方法 add
@PostMapping(name = "添加系统用户", path = "/add")
@ApiOperation("新增系统用户")
public ResponseData add(@RequestBody SysUserParam param) {
sysUserService.add(param);
return new SuccessResponseData();
}
在Service中创建接口方法
/**
* 新增
*
* @author DGH DEMO
* @Date 2021-11-01
*/
void add(SysUserParam param);
并在Impl中进行实现。注意,在实现类中使用的 this.save(entity); 方法便是MybatisPlus集成的方法,其使用的是BaseMapper中的方法。
@Override
public void add(SysUserParam param) {
SysUser entity = getEntity(param);
this.save(entity);
}
在启动类中配置包扫描的路径。
@SpringBootApplication(scanBasePackages = {"com.dgh.micro"})
@MapperScan("com.dgh.micro")
@Slf4j
public class MicroBaseServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MicroBaseServiceApplication.class, args);
log.info("项目启动成功");
}
}
在yml配置文件中配置MybatisPlus的配置数据
mybatis-plus:
mapper-locations: classpath*:com/dgh/**/mapping/*.xml
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
lazy-loading-enabled: true
multiple-result-sets-enabled: true
global-config:
banner: false
enable-sql-runner: true
db-config:
id-type: assign_id
table-underline: true
本章内容,到此结束,后续开始对redis以及mongoDB进行集成。