Commit 66de6d3d authored by matianhao's avatar matianhao

整合mp

依赖调整

mybatis plus通用字段自动填充
parent a3cd3433
This diff is collapsed.
......@@ -31,4 +31,45 @@
## 用户密码
- admin/admin123
\ No newline at end of file
- admin/admin123
## 整合mybatis-plus
整合思路:使用代码生成器和 mp 实现单表增、删、改和通用查询,配合数据库字段约定达到简化开发的目的;复杂 sql 请直接写在 mapper.xml。
- 新增两种粒度的通用字段,通过 mp 实现自动填充功能;
> BaseTimeColumn 类,包含 createTime, updateTime;
>
> BaseColumn 类,包含 createBy, updateBy, createTime, updateTime;
>
> 填充逻辑类 com.watone.framework.handler.MybatisPlusColumnsHandler
- 使用 mp 的逻辑删除功能;
> application.yml 中配置,逻辑删除字段为约定字段 delFlag
- 根据 DTO 对象封装 Wrapper 实现通用单表查询;
> com.watone.business.module1.service.impl.ZjApprovalAttachServiceImpl#createWrapper
>
> 代码中只是个空的实例,根据实际查询类型封装条件,注意使用 mp 的条件构造器时选择带 `boolean condition` 的方法。
- 使用 IDEA 插件 Easy Code 生成代码,配置文件 EasyCodeConfig.json;
- 推荐分包规范,业务代码写在 watone-business 下 com.watone.business,根据业务边界分包,职责划分更清晰
> 参考 model1 示例。尽量避免所有业务的 controller 都在一个包下,entity 都在一个包下以此类推
约定数据库通用字段:
```sql
`create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
```
......@@ -45,6 +45,7 @@
<velocity.version>1.7</velocity.version>
<jwt.version>0.9.1</jwt.version>
<lombok.version>1.18.20</lombok.version>
<hutool.version>5.7.11</hutool.version>
</properties>
<!-- 依赖声明 -->
......@@ -79,6 +80,21 @@
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot.version}</version>
<!-- 排除冲突依赖 -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- pagehelper 分页插件 -->
......@@ -213,6 +229,12 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.watone</groupId>
......
# 项目相关配置
watone:
# 名称
name: zj-lab
name: monolith-application-mybatis-plus
# 版本
version: 3.6.0
version: 1.0.0
# 版权年份
copyrightYear: 2021
# 实例演示开关
......@@ -59,13 +59,13 @@ spring:
# redis 配置
redis:
# 地址
host: 115.29.4.90
host: 127.0.0.1
# 端口,默认为6379
port: 6379
# 数据库索引
database: 10
# 密码
password: WatoneDesktop
password:
# 连接超时时间
timeout: 10s
lettuce:
......@@ -90,11 +90,23 @@ token:
# Mybatis plus配置
mybatis-plus:
# 别名包扫描路径
type-aliases-package: com.watone.**.domain
# mybatis配置文件
mapper-locations: classpath*:mapper/**/*Mapper.xml
configuration:
# 驼峰命名映射
map-underscore-to-camel-case: true
# 映射null值
call-setters-on-nulls: true
global-config:
db-config:
# 主键策略
id-type: auto
# 逻辑删除 0代表存在 2代表删除
logic-delete-field: delFlag
logic-delete-value: 2
logic-not-delete-value: 0
# PageHelper分页插件
pagehelper:
......
......@@ -21,21 +21,6 @@
<dependency>
<groupId>com.watone</groupId>
<artifactId>watone-system</artifactId>
<!-- 排除冲突依赖 -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- swagger start-->
......@@ -66,12 +51,6 @@
<artifactId>lombok</artifactId>
</dependency>
<!-- Mybatis-Plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.watone.business.module1.controller;
import com.watone.business.module1.domain.entity.ZjApprovalAttach;
import com.watone.business.module1.domain.dto.ZjApprovalAttachDTO;
import com.watone.business.module1.service.ZjApprovalAttachService;
import com.watone.common.core.controller.BaseController;
import com.watone.common.core.domain.AjaxResult;
import com.watone.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -19,27 +16,59 @@ import javax.annotation.Resource;
* 审批附件表(ZjApprovalAttach)表控制层
*
* @author MaTianHao
* @date 2021/12/01
* @date 2021/12/09
*/
@Api(tags = "审批附件表")
@RestController
@RequestMapping("zjApprovalAttach")
@Api(tags = "审批附件")
public class ZjApprovalAttachController extends BaseController {
/**
* 服务对象
*/
@Resource
private ZjApprovalAttachService zjApprovalAttachService;
@ApiResponses({
@ApiResponse(code = 200, message = "success", response = ZjApprovalAttach.class)
})
@ApiOperation("附件列表")
@GetMapping
public AjaxResult findAll() {
startPage();
return AjaxResult.success(zjApprovalAttachService.list());
/**
* 新增数据
*/
@ApiOperation("新增数据")
@PostMapping("/zjApprovalAttach")
public AjaxResult insert(@RequestBody ZjApprovalAttachDTO param) {
return toAjax(zjApprovalAttachService.insert(param));
}
/**
* 修改数据
*/
@ApiOperation("修改数据")
@PutMapping("/zjApprovalAttach")
public AjaxResult update(@RequestBody ZjApprovalAttachDTO param) {
return toAjax(zjApprovalAttachService.update(param));
}
/**
* 删除数据
*/
@ApiOperation("删除数据")
@DeleteMapping("/zjApprovalAttach/{id}")
public AjaxResult delete(@PathVariable Long id) {
return toAjax(zjApprovalAttachService.delete(id));
}
/**
* 通过主键查询单条数据
*/
@ApiOperation("通过主键查询单条数据")
@GetMapping("/zjApprovalAttach/{id}")
public AjaxResult detail(@PathVariable Long id) {
return AjaxResult.success(zjApprovalAttachService.detail(id));
}
/**
* 分页查询列表
*/
@ApiOperation("分页查询列表")
@GetMapping("/zjApprovalAttach")
public TableDataInfo findPage(ZjApprovalAttachDTO param) {
startPage();
return getDataTable(zjApprovalAttachService.findPage(param));
}
}
package com.watone.business.module1.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 审批附件表(ZjApprovalAttach)表入参类
*
* @author MaTianHao
* @date 2021/12/09
*/
@Data
@ApiModel("审批附件表入参")
public class ZjApprovalAttachDTO {
@ApiModelProperty("主键")
private Long id;
@ApiModelProperty("审批记录id")
private Long logId;
@ApiModelProperty("预警信息id")
private Long warningInfoId;
@ApiModelProperty("文件名")
private String attachName;
@ApiModelProperty("文件地址")
private String attachPath;
}
package com.watone.business.module1.domain.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 审批附件表(ZjApprovalAttach)表实体类
*
* @author MaTianHao
* @date 2021/12/01
* @date 2021/12/09
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("zj_approval_attach")
@ApiModel("审批附件表")
public class ZjApprovalAttach extends Model<ZjApprovalAttach> {
public class ZjApprovalAttach {
@ApiModelProperty("主键")
private Long id;
@ApiModelProperty("审批记录id")
private Long logId;
@ApiModelProperty("预警信息id")
private Long warningInfoId;
@ApiModelProperty("文件名")
private String attachName;
@ApiModelProperty("文件地址")
private String attachPath;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
}
......@@ -7,7 +7,7 @@ import com.watone.business.module1.domain.entity.ZjApprovalAttach;
* 审批附件表(ZjApprovalAttach)表数据库访问层
*
* @author MaTianHao
* @date 2021/12/01
* @date 2021/12/09
*/
public interface ZjApprovalAttachMapper extends BaseMapper<ZjApprovalAttach> {
......
package com.watone.business.module1.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.watone.business.module1.domain.dto.ZjApprovalAttachDTO;
import com.watone.business.module1.domain.entity.ZjApprovalAttach;
import java.util.List;
/**
* 审批附件表(ZjApprovalAttach)表服务接口
*
* @author MaTianHao
* @date 2021/12/01
* @date 2021/12/09
*/
public interface ZjApprovalAttachService extends IService<ZjApprovalAttach> {
/**
* 新增数据
*
* @param param 入参对象
* @return 是否成功
*/
boolean insert(ZjApprovalAttachDTO param);
/**
* 修改数据
*
* @param param 入参对象
* @return 是否成功
*/
boolean update(ZjApprovalAttachDTO param);
/**
* 删除数据
*
* @param id 主键
* @return 是否成功
*/
boolean delete(Long id);
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 实例对象
*/
ZjApprovalAttach detail(Long id);
/**
* 分页查询列表
*
* @param param 入参对象
* @return 对象集合
*/
List<ZjApprovalAttach> findPage(ZjApprovalAttachDTO param);
}
package com.watone.business.module1.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.watone.business.module1.mapper.ZjApprovalAttachMapper;
import com.watone.business.module1.domain.dto.ZjApprovalAttachDTO;
import com.watone.business.module1.domain.entity.ZjApprovalAttach;
import com.watone.business.module1.mapper.ZjApprovalAttachMapper;
import com.watone.business.module1.service.ZjApprovalAttachService;
import com.watone.common.exception.ServiceException;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
* 审批附件表(ZjApprovalAttach)表服务实现类
*
* @author MaTianHao
* @date 2021/12/01
* @date 2021/12/09
*/
@Service
public class ZjApprovalAttachServiceImpl extends ServiceImpl<ZjApprovalAttachMapper, ZjApprovalAttach> implements ZjApprovalAttachService {
@Resource
private ZjApprovalAttachMapper zjApprovalAttachMapper;
@Override
public boolean insert(ZjApprovalAttachDTO param) {
ZjApprovalAttach entity = new ZjApprovalAttach();
BeanUtil.copyProperties(param, entity);
return this.save(entity);
}
@Override
public boolean update(ZjApprovalAttachDTO param) {
ZjApprovalAttach entity = new ZjApprovalAttach();
BeanUtil.copyProperties(param, entity);
return this.updateById(entity);
}
@Override
public boolean delete(Long id) {
// 存在delFlag字段则为逻辑删除,否则为物理删除
return this.removeById(id);
}
@Override
public ZjApprovalAttach detail(Long id) {
ZjApprovalAttach entity = this.getById(id);
if (Objects.isNull(entity)) {
throw new ServiceException("详情未找到");
}
return entity;
}
@Override
public List<ZjApprovalAttach> findPage(ZjApprovalAttachDTO param) {
LambdaQueryWrapper<ZjApprovalAttach> wrapper = createWrapper(param);
return this.list(wrapper);
}
/**
* 构建Wrapper
*
* @param param 入参对象
* @return Lambda 语法使用 Wrapper
*/
private LambdaQueryWrapper<ZjApprovalAttach> createWrapper(ZjApprovalAttachDTO param) {
LambdaQueryWrapper<ZjApprovalAttach> queryWrapper = Wrappers.lambdaQuery();
// 排序
// queryWrapper.orderByDesc(BaseTimeColumn::getCreateTime);
if (Objects.isNull(param)) {
return queryWrapper;
}
// 拼接条件
// queryWrapper.eq(boolean, R, Object)
return queryWrapper;
}
}
......@@ -8,8 +8,6 @@
<result property="warningInfoId" column="warning_info_id" jdbcType="INTEGER"/>
<result property="attachName" column="attach_name" jdbcType="VARCHAR"/>
<result property="attachPath" column="attach_path" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
</mapper>
......
......@@ -119,6 +119,18 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- 工具集 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- Mybatis-Plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -147,4 +147,14 @@ public class Constants {
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap://";
/**
* 删除标志 0 存在
*/
public static final String DEL_FLAG_EXIST = "0";
/**
* 删除标志 2 删除
*/
public static final String DEL_FLAG_DELETE = "2";
}
package com.watone.common.core.mybatisplus.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
/**
* mybatis plus自动填充字段(时间字段 + 人员字段)
*
* @author MaTianHao
* @date 2021/12/3
*/
public class BaseColumn extends BaseTimeColumn {
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE, select = false)
private String updateBy;
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
}
package com.watone.common.core.mybatisplus.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDateTime;
/**
* mybatis plus自动填充字段(时间字段)
*
* @author MaTianHao
* @date 2021/12/3
*/
public class BaseTimeColumn {
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE, select = false)
private LocalDateTime updateTime;
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
}
package com.watone.framework.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.watone.common.constant.HttpStatus;
import com.watone.common.core.domain.model.LoginUser;
import com.watone.common.exception.ServiceException;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* mybatis plus通用字段自动填充
*
* @author MaTianHao
* @date 2021/12/1
*/
@Component
public class MybatisPlusColumnsHandler implements MetaObjectHandler {
/**
* 匿名用户
*/
private static final String ANONYMOUS_USER = "anonymousUser";
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createBy", String.class, getLoginUserName());
this.strictUpdateFill(metaObject, "updateBy", String.class, getLoginUserName());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", String.class, getLoginUserName());
}
/**
* 获取当前登录用户名
*/
private String getLoginUserName() {
String loginUserName = "";
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (Objects.isNull(authentication)) {
throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
}
// 未认证
if (!authentication.isAuthenticated()) {
return loginUserName;
}
// 匿名用户
if (ANONYMOUS_USER.equals(authentication.getPrincipal())) {
return ANONYMOUS_USER;
}
try {
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
loginUserName = loginUser.getUsername();
} catch (Exception ignore) {
}
return loginUserName;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment