03 后端接口开发

03 后端接口开发

一、自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。 我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作

1. 实体类添加注解

@TableField(fill = FieldFill.INSERT)
private Date createTime;

还有 @TableField(fill = FieldFill.UPDATE) 和 @TableField(fill = FieldFill.INSERT_UPDATE)

2. 实现元对象处理器接口

package group.mngzs.orderingsystemback.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 添加时自动填充逻辑
    }
    @Override
    public void updateFill(MetaObject metaObject) {
		// 修改时自动填充逻辑
    }
}

3. 使用自动填充

@TableField(fill = FieldFill.INSERT)
private Date createTime;

这里我们没有使用,只是为了后续的逻辑删除准备

二、逻辑删除

在所有实体中加入,deleted字段,tinyint类型,若为0,则代表还没删除,为1就代表已经被删除了

1. 根据自动填充的逻辑实现逻辑删除

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

2. 刚刚的元对象处理接口添加

@Override
public void insertFill(MetaObject metaObject) {
 	......
	this.setFieldValByName("deleted", 0, metaObject);
}

3. 配置逻辑删除

在application.properties中加入

# 配置逻辑删除值
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

4. 配置不让查询

//逻辑删除
@TableField(select = false)
@ApiModelProperty(value = "逻辑删除")
private Integer deleted;

二、调整EasyCode代码模板,用于生成基本的CURD代码

1. 配置信息

说明文档:
    属性
    $author 设置中的作者 java.lang.String
    $modulePath 选中的module路径 java.lang.String
    $projectPath 项目绝对路径 java.lang.String

    对象
    $tableInfo 表对象
        obj 表原始对象 com.intellij.database.model.DasTable
        name 表名(转换后的首字母大写)java.lang.String
        comment 表注释 java.lang.String
        fullColumn 所有列 java.util.List<ColumnInfo>
        pkColumn 主键列 java.util.List<ColumnInfo>
        otherColumn 其他列 java.util.List<ColumnInfo>,除主键以外的列
        savePackageName 保存的包名 java.lang.String
        savePath 保存路径 java.lang.String
        saveModelName 保存的model名称 java.lang.String
    columnInfo 列对象
        obj 列原始对象 com.intellij.database.model.DasColumn
        name 列名(首字母小写) java.lang.String
        comment 列注释 java.lang.String
        type 列类型(类型全名) java.lang.String
        shortType 列类型(短类型) java.lang.String
        custom 是否附加列 java.lang.Boolean
        ext 附加字段(Map类型) java.lang.Map<java.lang.String, java.lang.Object>
    $tableInfoList java.util.List<TableInfo>所有选中的表
    $importList 所有需要导入的包集合 java.util.Set<java.lang.String>

    回调
    &callback 回调对象
        setFileName(String) 设置文件储存名字
        setSavePath(String) 设置文件储存路径,默认使用选中路径
        setReformat(Boolean) 设置是否重新格式化生成后的代码,默认为界面选定值
        setWriteFile(Boolean) 设置是否生成文件,默认为true
    工具
    $tool
        firstUpperCase(String name) 首字母大写方法
        firstLowerCase(String name) 首字母小写方法
        getClsNameByFullName(String fullName) 通过包全名获取类名
        getJavaName(String name) 将下划线分割字符串转驼峰命名(属性名)
        getClassName(String name) 将下划线分割字符串转驼峰命名(类名)
        hump2Underline(String str) 将驼峰字符串转下划线字符串
        append(Object... objs) 多个数据进行拼接
        newHashSet(Object... objs) 创建一个HashSet对象
        newArrayList(Object... objs) 创建一个ArrayList对象
        newLinkedHashMap() 创建一个LinkedHashMap()对象
        newHashMap() 创建一个HashMap()对象
        getField(Object obj, String fieldName) 获取对象的属性值,可以访问任意修饰符修饰的属性.配合debug方法使用.
        call(Object... objs) 空白执行方法,用于调用某些方法时消除返回值
        debug(Object obj) 调式方法,用于查询对象结构.可查看对象所有属性与public方法
        serial() 随机获取序列化的UID
        service(String serviceName, Object... param)远程服务调用
        parseJson(String) 将字符串转Map对象
        toJson(Object, Boolean) 将对象转json对象,Boolean:是否格式化json,不填时为不格式化。
        toUnicode(String, Boolean) 将String转换为unicode形式,Boolean:是否转换所有符号,不填时只转换中文及中文符号。
    $time
        currTime(String format) 获取当前时间,指定时间格式(默认:yyyy-MM-dd HH:mm:ss)
    $generateService
        run(String, Map<String,Object>) 代码生成服务,参数1:模板名称,参数2:附加参数。
    $dasUtil Database提供的工具类,具体可方法请查看源码,适用于高端玩家
    $dbUtil  Database提供的工具类,具体可方法请查看源码,适用于高端玩家

2. 基本模型

2.1 Controller
##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Controller")

##保存文件(宏定义)
#save("/controller", "Controller.java")

##包路径(宏定义)
#setPackageSuffix("controller")

##定义服务名
#set($serviceName = $!tool.append($!tool.firstLowerCase($!tableInfo.name), "Service"))

##定义实体对象名
#set($entityName = $!tool.firstLowerCase($!tableInfo.name))
import $!{tableInfo.savePackageName}.commonutils.R;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

##表注释(宏定义)
#tableComment(" 表控制层")
@RestController
@Api(value=" $!tableInfo.name 表控制层")
@RequestMapping("$!tool.firstLowerCase($!tableInfo.name)")
public class $!{tableName} {
    /**
     * 服务对象
     */
    @Resource
    private $!{tableInfo.name}Service $!{serviceName};

    /**
     * 查询所有数据
     * @return 所有数据
     */
    @GetMapping
    @ApiOperation(value="查询 $!tableInfo.name 列表", notes="查询 $!tableInfo.name 所有实体")
    public R selectAll() {
        return R.ok().data("$!tool.firstLowerCase($!tableInfo.name)List",$!{serviceName}.list());
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @ApiOperation(value = "根据ID查询 $!tableInfo.name")
    @GetMapping("{id}")
    public R selectOne(@ApiParam(name="id", value = "$!entityName id") 
                       @PathVariable Serializable id) {
        return R.ok().data("$!tool.firstLowerCase($!tableInfo.name)",this.$!{serviceName}.getById(id));
    }

    /**
     * 新增数据
     *
     * @param $!entityName 实体对象
     * @return 新增结果
     */
    @ApiOperation(value = "新增 $!tableInfo.name")
    @PostMapping
    public R insert(@ApiParam(name="$!entityName", value = "$!entityName 对象")
                    @RequestBody $!tableInfo.name $!entityName) {
        Long $!{entityName}Id = $!{serviceName}.save$!{tableInfo.name}($!{entityName});
        if($!{entityName}Id > 0){
            return R.ok().data("$!{entityName}Id", $!{entityName}Id);
        }else{
            return R.error().message("保存失败");
        }
    }

    /**
     * 修改数据
     *
     * @param $!entityName 实体对象
     * @return 修改结果
     */
    @ApiOperation(value = "修改 $!tableInfo.name 实体")
    @PutMapping
    public R update(@ApiParam(name="$!entityName", value = "$!entityName 对象")
                    @RequestBody $!tableInfo.name $!entityName) {
        $!{serviceName}.updateById($!entityName);
        return R.ok();
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除结果
     */
    @ApiOperation(value = "根据ID删除 $!tableInfo.name")
    @DeleteMapping
    public R delete(@ApiParam(name="id", value = "$!tableInfo.name ID")
                    @RequestParam("id") Long id) {
        boolean result = $!{serviceName}.removeById(id);
        if(result){
            return R.ok();
        }else{
            return R.error().message("删除失败");
        }            
    }
}
2.2 Service
##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Service")

##保存文件(宏定义)
#save("/service", "Service.java")

##包路径(宏定义)
#setPackageSuffix("service")

import com.baomidou.mybatisplus.extension.service.IService;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;

##表注释(宏定义)
#tableComment("表服务接口")
public interface $!{tableName} extends IService<$!tableInfo.name> {
    Long save$!{tableInfo.name}($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name));
}
2.3 ServiceImpl
##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("ServiceImpl")

##保存文件(宏定义)
#save("/service/impl", "ServiceImpl.java")

##包路径(宏定义)
#setPackageSuffix("service.impl")

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;

##表注释(宏定义)
#tableComment("表服务实现类")
@Service("$!tool.firstLowerCase($tableInfo.name)Service")
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Dao, $!{tableInfo.name}> implements $!{tableInfo.name}Service {

    @Override
    public Long save$!{tableInfo.name}($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)){
        boolean saveStatus = this.save($!tool.firstLowerCase($!tableInfo.name));
        if(!saveStatus){
            throw new SgtjyException(20001, "$!{tableInfo.name}信息保存失败");
        }
        return $!{tool.firstLowerCase($!tableInfo.name)}.get#foreach($column in $tableInfo.pkColumn)$!{tool.firstUpperCase($!column.name)}();#break#end
    
    }
}

2.4 Dao
##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Dao")

##保存文件(宏定义)
#save("/dao", "Dao.java")

##包路径(宏定义)
#setPackageSuffix("dao")

import java.util.List;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;

##表注释(宏定义)
#tableComment("表数据库访问层")
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {

/**
* 批量新增数据(MyBatis原生foreach方法)
*
* @param entities List<$!{tableInfo.name}> 实例对象列表
* @return 影响行数
*/
int insertBatch(@Param("entities") List<$!{tableInfo.name}> entities);

/**
* 批量新增或按主键更新数据(MyBatis原生foreach方法)
*
* @param entities List<$!{tableInfo.name}> 实例对象列表
* @return 影响行数
* @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
*/
int insertOrUpdateBatch(@Param("entities") List<$!{tableInfo.name}> entities);

}
2.5 mapper
##引入mybatis支持
$!{mybatisSupport.vm}

##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Dao.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

<?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="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao">

    <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
        <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
    </resultMap>

    <!-- 批量插入 -->
    <insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
        (#foreach($column in $tableInfo.otherColumn)#{entity.$!{column.name}}#if($velocityHasNext), #end#end)
        </foreach>
    </insert>
    <!-- 批量插入或按主键更新 -->
    <insert id="insertOrUpdateBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
        insert into $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#foreach($column in $tableInfo.otherColumn)#{entity.$!{column.name}}#if($velocityHasNext), #end#end)
        </foreach>
        on duplicate key update
         #foreach($column in $tableInfo.otherColumn)$!column.obj.name = values($!column.obj.name) #if($velocityHasNext), #end#end
    </insert>

</mapper>

2.6 Entity
##导入宏定义
$!{define.vm}

##保存文件(宏定义)
#save("/entity", ".java")

##包路径(宏定义)
#setPackageSuffix("entity")

##自动导入包(全局变量)
$!autoImport
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;

##表注释(宏定义)
#tableComment("表实体类")
@Data
@SuppressWarnings("serial")
@ApiModel(value="$!{tableInfo.name}",description="基础$!{tableInfo.name}信息")
public class $!{tableInfo.name} extends Model<$!{tableInfo.name}> {
#foreach($column in $tableInfo.pkColumn)
    #if(${column.comment})
    
    //${column.comment}
    @ApiModelProperty(value = "${column.comment}")#end
    
    @TableId
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.otherColumn)
    #if(${column.comment})
    
    //${column.comment}
    @ApiModelProperty(value = "${column.comment}")#end
    #if($tool.newHashSet("deleted").contains($column.name))
    
    @TableLogic
    @TableField(fill = FieldFill.INSERT)#end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

#foreach($column in $tableInfo.pkColumn)
    /**
     * 获取主键值
     *
     * @return 主键值
     */
    @Override
    protected Serializable pkVal() {
        return this.$!column.name;
    }
    #break
#end
}

3. 部分问题

  1. 有些地方没有引入完全,生成后需要点击进去让idea自动导入
3.1 foreach语法
#foreach()
#end
  • 循环主键列
#foreach($column in $tableInfo.pkColumn)
    @TableId
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
  • 循环非主键列
#foreach($column in $tableInfo.otherColumn)
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
3.2 if语法
#if()
#end
  • 如果列有注释
#if(${column.comment})
    //${column.comment}
    @ApiModelProperty(value = "${column.comment}")#end
  • 如果表名中含有deleted
#if($tool.newHashSet("deleted").contains($column.name))
@TableLogic
    @TableField(fill = FieldFill.INSERT)#end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值