自定义EasyCode模板生成CRUD

文章目录

    • 1.生成步骤
        • 1.定义全局逻辑删除字段名称以及删除值和未删除值
        • 2.简单三层架构模板
          • 1.概览
          • 2.Req.java
          • 3.Vo.java
          • 4.Po.java
          • 5.Mapper.java
          • 6.Mapper.xml
          • 7.Service.java
          • 8.ServiceImpl.java
          • 9.Controller.java
        • 3.通用配置生成模板
          • 1.概览
          • 2.PageInfo.java
          • 3.PageResult.java
          • 4.SunPageHelper.java
          • 5.Result.java
          • 6.RespBeanEnum.java
    • 2.生成效果
    • 3.导出到本地

1.生成步骤

1.定义全局逻辑删除字段名称以及删除值和未删除值

CleanShot 2024-10-11 at 18.33.08@2x

2.简单三层架构模板
1.概览

CleanShot 2024-10-11 at 18.33.54@2x

2.Req.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Req.java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/req"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.req;
#endimport $!{tableInfo.savePackageName}.entity.page.PageInfo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
## 检查是否包含 Date 类型的字段
#set($containsDate = false)
#foreach($column in $tableInfo.fullColumn)#if($tool.getClsNameByFullName($column.type) == "Date")#set($containsDate = true)#break#end
#end
## 如果包含 Date 类型的字段,导入 java.util.Date
#if($containsDate)
import java.util.Date;
#end/*** $!{tableInfo.comment}($!{tableInfo.name})Req实体类:接受前端请求** @author $!author* @since $!time.currTime()*/
@Data
@Accessors(chain = true) // 支持链式调用
public class $!{tableInfo.name}Req extends PageInfo implements Serializable {private static final long serialVersionUID = 1L;#foreach($column in $tableInfo.fullColumn)## 添加字段注释#if($column.comment)/*** $column.comment*/#endprivate $!{tool.getClsNameByFullName($column.type)} $!{column.name};#end
}
3.Vo.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Vo.java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/vo"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.vo;
#endimport lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
## 检查是否包含 Date 类型的字段
#set($containsDate = false)
#foreach($column in $tableInfo.fullColumn)#if($tool.getClsNameByFullName($column.type) == "Date")#set($containsDate = true)#break#end
#end
## 如果包含 Date 类型的字段,导入 java.util.Date
#if($containsDate)
import java.util.Date;
#end/*** $!{tableInfo.comment}($!{tableInfo.name})VO实体类:封装后端给前端的响应** @author $!author* @since $!time.currTime()*/
@Data
@Accessors(chain = true) // 支持链式调用
public class $!{tableInfo.name}Vo implements Serializable {private static final long serialVersionUID = 1L;#foreach($column in $tableInfo.fullColumn)## 添加字段注释#if($column.comment)/*** $column.comment*/#endprivate $!{tool.getClsNameByFullName($column.type)} $!{column.name};#end
}
4.Po.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Po.java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/po"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.po;
#endimport lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
## 检查是否包含 Date 类型的字段
#set($containsDate = false)
#foreach($column in $tableInfo.fullColumn)#if($tool.getClsNameByFullName($column.type) == "Date")#set($containsDate = true)#break#end
#end
## 如果包含 Date 类型的字段,导入 java.util.Date
#if($containsDate)
import java.util.Date;
#end/*** $!{tableInfo.comment}($!{tableInfo.name})PO实体类** @author $!author* @since $!time.currTime()*/
@Data
@Accessors(chain = true) // 支持链式调用
public class $!{tableInfo.name}Po implements Serializable {private static final long serialVersionUID = 1L;#foreach($column in $tableInfo.fullColumn)## 添加字段注释#if($column.comment)/*** $column.comment*/#endprivate $!{tool.getClsNameByFullName($column.type)} $!{column.name};#end
}
5.Mapper.java
## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.java"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/java/$!{tableInfo.savePackageName.replace('.','/')}/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#endpackage $!{tableInfo.savePackageName}.mapper;import $!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** ($!{tableInfo.name})表数据库访问层** @author $!{author}* @since $!{time.currTime('yyyy-MM-dd HH:mm:ss')}*/
public interface $!{tableInfo.name}Mapper {/*** 根据主键查询单条数据** @param id 主键* @return 实例对象*/$!{tableInfo.name}Po queryById(@Param("id") $!{pk.shortType} id);/*** 分页查询** @param po 查询条件* @param offset 偏移量:计算公式 (pageNo - 1) * pageSize* @param pageSize 页面大小* @return 对象列表*/List<$!{tableInfo.name}Po> queryPage(@Param("po") $!{tableInfo.name}Po po, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);/*** 根据条件查询记录** @param po 查询条件* @return 对象列表*/List<$!{tableInfo.name}Po> queryAllByLimit(@Param("po") $!{tableInfo.name}Po po);/*** 统计总行数** @param po 查询条件* @return 总行数*/Integer count(@Param("po") $!{tableInfo.name}Po po);/*** 新增数据** @param po 实例对象(会封装新增的id)* @return 影响行数*/int insert($!{tableInfo.name}Po po);/*** 批量新增数据(MyBatis原生foreach方法)** @param entities 实例对象列表(会封装新增的id)* @return 影响行数*/int insertBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);/*** 批量新增或按主键更新数据(MyBatis原生foreach方法)** @param entities 实例对象列表* @return 影响行数* @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参*/int insertOrUpdateBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);/*** 根据主键修改数据** @param po 实例对象* @return 影响行数*/int updateById($!{tableInfo.name}Po po);/*** 根据主键逻辑删除数据** @param id 主键* @return 影响行数*/int logicDeleteById(@Param("id") $!{pk.shortType} id);/*** 根据主键批量逻辑删除数据** @param ids 主键列表* @return 影响行数*/int logicDeleteBatchById(@Param("list") List<$!{pk.shortType}> ids);
}
6.Mapper.xml
##定义全局逻辑删除字段名称
#set($deleteColumnName = "is_deleted")
##定义全局逻辑删除字段的删除值和未删除值
#set($deleteColumnValue = 1)
#set($notDeletedColumnValue = 0)##引入mybatis支持
$!{mybatisSupport.vm}##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.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}.mapper.$!{tableInfo.name}Mapper"><resultMap type="$!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po" id="$!{tableInfo.name}Map"><id property="$!pk.name" column="$!pk.obj.name"/>
#foreach($column in $tableInfo.fullColumn)#if($column.name != $pk.name)<result property="$!column.name" column="$!column.obj.name"/>#end
#end</resultMap><!--根据主键查询一条记录--><select id="queryById" resultMap="$!{tableInfo.name}Map">select #allSqlColumn()from $!{tableInfo.obj.name}where $!pk.obj.name = #{$!pk.name}and $!deleteColumnName = $notDeletedColumnValue</select><!--分页查询指定行数据--><select id="queryPage" resultMap="$!{tableInfo.name}Map">select #allSqlColumn()from $!{tableInfo.obj.name}<where>
#foreach($column in $tableInfo.fullColumn)<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">and $!column.obj.name = #{po.$!column.name}</if>
#endand $!deleteColumnName = $notDeletedColumnValue</where>limit #{offset}, #{pageSize}</select><!--根据条件查询记录--><select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map">select #allSqlColumn()from $!{tableInfo.obj.name}<where>
#foreach($column in $tableInfo.fullColumn)<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">and $!column.obj.name = #{po.$!column.name}</if>
#endand $!deleteColumnName = $notDeletedColumnValue</where></select><!--根据条件统计总行数--><select id="count" resultType="java.lang.Integer">select count(1)from $!{tableInfo.obj.name}<where>
#foreach($column in $tableInfo.fullColumn)<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">and $!column.obj.name = #{po.$!column.name}</if>
#endand $!deleteColumnName = $notDeletedColumnValue</where></select><!--新增一条记录--><insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)values (#foreach($column in $tableInfo.otherColumn)#{$!column.name}#if($foreach.hasNext), #end#end)</insert><!--批量新增多条记录--><insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)values<foreach collection="entities" item="entity" separator=",">(#foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)</foreach></insert><!--插入记录,如果主键冲突,则变为更新记录--><insert id="insertOrUpdateBatch" keyProperty="$!pk.name" useGeneratedKeys="true">insert into $!{tableInfo.obj.name}(id, #foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)values<foreach collection="entities" item="entity" separator=",">(#{entity.id}, #foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)</foreach>on duplicate key update
#foreach($column in $tableInfo.otherColumn)$!column.obj.name = values($!column.obj.name)#if($foreach.hasNext),#end
#end</insert><!--根据主键修改数据--><update id="updateById">update $!{tableInfo.obj.name}<set>
#foreach($column in $tableInfo.otherColumn)<if test="$!column.name != null#if($column.type.equals('java.lang.String')) and $!column.name != ''#end">$!column.obj.name = #{$!column.name},</if>
#end</set>where $!pk.obj.name = #{$!pk.name}and $!deleteColumnName = $notDeletedColumnValue</update><!--根据主键逻辑删除单个记录--><update id="logicDeleteById">update $!{tableInfo.obj.name}set $!deleteColumnName = $deleteColumnValuewhere $!pk.obj.name = #{$!pk.name}and $!deleteColumnName = $notDeletedColumnValue</update><!--根据主键批量逻辑删除记录--><update id="logicDeleteBatchById">update $!{tableInfo.obj.name}set $!deleteColumnName = $deleteColumnValuewhere $!pk.obj.name in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>and $!deleteColumnName = $notDeletedColumnValue</update>
</mapper>
7.Service.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Service.java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
package $!{tableInfo.savePackageName}.service;import $!{tableInfo.savePackageName}.entity.page.PageResult;
import $!{tableInfo.savePackageName}.entity.req.$!{tableInfo.name}Req;
import $!{tableInfo.savePackageName}.entity.vo.$!{tableInfo.name}Vo;/*** $!{tableInfo.comment}($!{tableInfo.name}) service 接口** @author sun* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")*/
public interface $!{tableInfo.name}Service {/*** 分页查询** @param req 筛选条件* @return 查询结果*/PageResult<$!{tableInfo.name}Vo> queryByPage($!{tableInfo.name}Req req);}
8.ServiceImpl.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "ServiceImpl.java"))
$!callback.setSavePath($tool.append($!{tableInfo.savePath}, "/service/impl"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
package $!{tableInfo.savePackageName}.service.impl;import $!{tableInfo.savePackageName}.entity.page.PageResult;
import $!{tableInfo.savePackageName}.entity.page.SunPageHelper;
import $!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.entity.req.$!{tableInfo.name}Req;
import $!{tableInfo.savePackageName}.entity.vo.$!{tableInfo.name}Vo;
import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;/*** $!{tableInfo.comment}($!{tableInfo.name})service实现类** @author sun* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")*/
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableInfo.name}ServiceImpl implements $!{tableInfo.name}Service {@Resourceprivate $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper;/*** 分页查询** @param $!tool.firstLowerCase($!{tableInfo.name})Req 筛选条件,需要携带pageNo和pageSize以及查询条件* @return 分页结果*/@Overridepublic PageResult<$!{tableInfo.name}Vo> queryByPage($!{tableInfo.name}Req $!tool.firstLowerCase($!{tableInfo.name})Req) {// 1.将req转换为po$!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name})Po = convertReqToPo($!tool.firstLowerCase($!{tableInfo.name})Req);// 2.使用 SunPageHelper 执行分页操作PageResult<$!{tableInfo.name}Po> paginate = SunPageHelper.paginate($!tool.firstLowerCase($!{tableInfo.name})Req.getPageNo(), $!tool.firstLowerCase($!{tableInfo.name})Req.getPageSize(),() -> $!tool.firstLowerCase($!{tableInfo.name})Mapper.count($!tool.firstLowerCase($!{tableInfo.name})Po),(offset, size) -> $!tool.firstLowerCase($!{tableInfo.name})Mapper.queryPage($!tool.firstLowerCase($!{tableInfo.name})Po, offset, size));// 3.将poList转换为voListList<$!{tableInfo.name}Vo> $!tool.firstLowerCase($!{tableInfo.name})VoList = convertPoListToVoList(paginate.getResult());PageResult<$!{tableInfo.name}Vo> $!tool.firstLowerCase($!{tableInfo.name})VoPageResult = new PageResult.Builder<$!{tableInfo.name}Vo>().pageNo(paginate.getPageNo()).pageSize(paginate.getPageSize()).total(paginate.getTotal()).result($!tool.firstLowerCase($!{tableInfo.name})VoList).build();return $!tool.firstLowerCase($!{tableInfo.name})VoPageResult;}// ============================== 实现转换 ==============================private List<$!{tableInfo.name}Vo> convertPoListToVoList(List<$!{tableInfo.name}Po> result) {// 自定义转换逻辑return null;}private $!{tableInfo.name}Po convertReqToPo($!{tableInfo.name}Req $!tool.firstLowerCase($!{tableInfo.name})Req) {// 自定义转换逻辑return null;}// ============================== 实现转换 ==============================}
9.Controller.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Controller.java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))## 拿到主键
#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))
#end## 包声明和导入
package $!{tableInfo.savePackageName}.controller;import $!{tableInfo.savePackageName}.entity.page.PageResult;
import $!{tableInfo.savePackageName}.entity.req.$!{tableInfo.name}Req;
import $!{tableInfo.savePackageName}.entity.vo.$!{tableInfo.name}Vo;
import $!{tableInfo.savePackageName}.response.Result;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** $!{tableInfo.comment}($!{tableInfo.name})控制层** @author sun* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")*/
@RestController
@RequestMapping("/$tool.hump2Underline($tool.firstLowerCase($tableInfo.name)).replace('_', '/')")
@Slf4j
public class $!{tableInfo.name}Controller {/*** 服务对象*/@Resourceprivate $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;/*** 分页查询数据** @param req 筛选条件* @return 查询结果*/@GetMapping("/queryPage")public Result<PageResult<$!{tableInfo.name}Vo>> queryByPage(@RequestBody $!{tableInfo.name}Req req) {// ============================== Preconditions 参数校验 ==============================// ============================== Preconditions 参数校验 ==============================// 调用service层PageResult<$!{tableInfo.name}Vo> $!tool.firstLowerCase($tableInfo.name)VoPageResult = this.$!tool.firstLowerCase($tableInfo.name)Service.queryByPage(req);return Result.ok($!tool.firstLowerCase($tableInfo.name)VoPageResult);}
}
3.通用配置生成模板
1.概览

CleanShot 2024-10-11 at 18.38.21@2x

2.PageInfo.java
##定义初始变量
#set($className = "PageInfo")
##设置回调
$!callback.setFileName($className + ".java")
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/page"))
##包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.page;#endimport java.util.Objects;/*** Description: 分页请求的入参* @Author $!author* @Create $!time.currTime()* @Version 1.1*/
public class $className {private Integer pageNo = 1;private Integer pageSize = 20;public Integer getPageNo() {return (pageNo == null || pageNo < 1) ? 1 : pageNo;}public Integer getPageSize() {return (pageSize == null || pageSize < 1) ? 20 : pageSize;}public $className setPageNo(Integer pageNo) {this.pageNo = pageNo;return this;}public $className setPageSize(Integer pageSize) {this.pageSize = pageSize;return this;}@Overridepublic int hashCode() {return Objects.hash(pageNo, pageSize);}@Overridepublic String toString() {return "$className{" +"pageNo=" + pageNo +", pageSize=" + pageSize +'}';}
}
3.PageResult.java
##定义初始变量
#set($className = "PageResult")
##设置回调
$!callback.setFileName($className + ".java")
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/page"))
##包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.page;#endimport java.util.Collections;
import java.util.List;import static java.util.Objects.requireNonNull;/*** Description: 分页返回的实体* @Author $!author* @Create $!time.currTime()* @Version 1.1*/
public class $className<T> {// 当前页码,默认为1private Integer pageNo = 1;// 每页显示的记录数,默认为20private Integer pageSize = 20;// 总记录条数private Integer total = 0;// 总页数private Integer totalPages = 0;// 当前页的记录列表private List<T> result = Collections.emptyList();// 表示当前页是从分页查询结果的第几条记录开始,下标从1开始private Integer start = 1;// 表示当前页是从分页查询结果的第几条记录结束,下标从1开始private Integer end = 0;// 私有构造函数,使用Builder创建实例private $className(Builder<T> builder) {this.pageNo = builder.pageNo;this.pageSize = builder.pageSize;this.total = builder.total;this.result = builder.result;calculateTotalPages();calculateStartAndEnd();}// Builder 模式实现public static class Builder<T> {private Integer pageNo = 1;private Integer pageSize = 20;private Integer total = 0;private List<T> result = Collections.emptyList();public Builder<T> pageNo(Integer pageNo) {this.pageNo = requireNonNull(pageNo, "Page number cannot be null");return this;}public Builder<T> pageSize(Integer pageSize) {this.pageSize = requireNonNull(pageSize, "Page size cannot be null");return this;}public Builder<T> total(Integer total) {this.total = requireNonNull(total, "Total count cannot be null");return this;}public Builder<T> result(List<T> result) {this.result = requireNonNull(result, "Result list cannot be null");return this;}public $className<T> build() {return new $className<>(this);}}// 计算总页数private void calculateTotalPages() {if (this.pageSize > 0) {this.totalPages = (this.total / this.pageSize) + (this.total % this.pageSize == 0 ? 0 : 1);} else {this.totalPages = 0;}}// 计算起始和结束位置private void calculateStartAndEnd() {if (this.pageSize > 0) {this.start = (this.pageNo - 1) * this.pageSize + 1;this.end = Math.min(this.pageNo * this.pageSize, this.total);} else {this.start = 1;this.end = this.total;}}// 获取当前页的起始位置public Integer getStart() {return start;}// 获取每页记录数public Integer getPageSize() {return pageSize;}// 获取当前页码public Integer getPageNo() {return pageNo;}// 获取总记录条数public Integer getTotal() {return total;}// 获取总页数public Integer getTotalPages() {return totalPages;}// 获取当前页的记录列表public List<T> getResult() {return result;}// 获取当前页的结束位置public Integer getEnd() {return end;}@Overridepublic String toString() {return "$className{" +"pageNo=" + pageNo +", pageSize=" + pageSize +", total=" + total +", totalPages=" + totalPages +", result=" + result +", start=" + start +", end=" + end +'}';}
}
4.SunPageHelper.java
##定义初始变量
#set($className = "SunPageHelper")
##设置回调
$!callback.setFileName($className + ".java")
$!callback.setSavePath($tool.append($tableInfo.savePath, "/entity/page"))
##包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.entity.page;#endimport java.util.List;
import java.util.function.BiFunction;
import java.util.function.Supplier;/*** Description: 分页逻辑封装* @Author $!author* @Create $!time.currTime()* @Version 1.0*/
public class $className {/*** 执行分页操作* @param pageNo 页码* @param pageSize 每页记录数* @param totalSupplier 获取总记录条数的逻辑* @param recordsSupplier 获取记录列表的逻辑* @param <T> 记录的类型* @return 分页结果*/public static <T> PageResult<T> paginate(int pageNo, int pageSize,Supplier<Integer> totalSupplier,BiFunction<Integer, Integer, List<T>> recordsSupplier) {// 计算总记录数int total;try {total = totalSupplier.get();} catch (Exception e) {throw new RuntimeException("Failed to get total count", e);}// 如果总记录数为0,返回空的 PageResultif (total == 0) {return new PageResult.Builder<T>().pageNo(pageNo).pageSize(pageSize).total(total).result(Collections.emptyList()) // 空列表.build();}// 计算 offset,表示从第几条记录开始查询int offset = calculateOffset(pageNo, pageSize);// 获取当前页的记录列表List<T> records;try {records = recordsSupplier.apply(offset, pageSize);} catch (Exception e) {throw new RuntimeException("Failed to get records", e);}// 使用 Builder 模式创建 PageResult 对象并返回return new PageResult.Builder<T>().pageNo(pageNo).pageSize(pageSize).total(total).result(records).build();}/*** 计算分页的 offset* @param pageNo 页码* @param pageSize 每页记录数* @return offset*/public static int calculateOffset(int pageNo, int pageSize) {// offset 计算公式:(当前页码 - 1) * 每页记录数return (pageNo - 1) * pageSize;}
}
5.Result.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName("Result.java")
$!callback.setSavePath($tool.append($tableInfo.savePath, "/response"))## 包声明
package $!{tableInfo.savePackageName}.response;## 包导入
import lombok.Data;
import java.io.Serializable;/*** Description: 通用响应封装类,通过枚举来获取code和message* @Author sun* @Create $!time.currTime("yyyy/MM/dd")* @Version 1.0*/
@Data
public class Result<T> implements Serializable {private static final long serialVersionUID = 1L;// 是否成功private boolean success;// 响应代码private int code;// 响应消息private String message;// 响应数据private T data;// 私有构造器,防止外部直接创建private Result() {}// 使用内部建造者类进行对象构建public static class Builder<T> {private boolean success;private int code;private String message;private T data;// ============================== 链式调用设置建造者对象 ==============================public Builder<T> success(boolean success) {this.success = success;return this;}public Builder<T> code(int code) {this.code = code;return this;}public Builder<T> message(String message) {this.message = message;return this;}public Builder<T> data(T data) {this.data = data;return this;}// ============================== 链式调用设置建造者对象 ==============================// ============================== 构建Result对象 ==============================public Result<T> build() {Result<T> result = new Result<>();result.success = this.success;result.code = this.code;result.message = this.message;result.data = this.data;return result;}// ============================== 构建Result对象 ==============================}// ============================== 快捷方法 ==============================public static <T> Result<T> ok() {return new Builder<T>().success(true).code(RespBeanEnum.SUCCESS.getCode()).message(RespBeanEnum.SUCCESS.getMessage()).build();}public static <T> Result<T> ok(T data) {return new Builder<T>().success(true).code(RespBeanEnum.SUCCESS.getCode()).message(RespBeanEnum.SUCCESS.getMessage()).data(data).build();}public static <T> Result<T> ok(T data, String message) {return new Builder<T>().success(true).code(RespBeanEnum.SUCCESS.getCode()).message(message).data(data).build();}public static <T> Result<T> fail() {return new Builder<T>().success(false).code(RespBeanEnum.ERROR.getCode()).message(RespBeanEnum.ERROR.getMessage()).build();}public static <T> Result<T> fail(String message) {return new Builder<T>().success(false).code(RespBeanEnum.ERROR.getCode()).message(message).build();}public static <T> Result<T> fail(int code, String message) {return new Builder<T>().success(false).code(code).message(message).build();}public static <T> Result<T> fail(RespBeanEnum respBeanEnum) {return new Builder<T>().success(false).code(respBeanEnum.getCode()).message(respBeanEnum.getMessage()).build();}// ============================== 快捷方法 ==============================}
6.RespBeanEnum.java
## 引入宏定义
$!{define.vm}## 设置保存名称与保存位置
$!callback.setFileName("RespBeanEnum.java")
$!callback.setSavePath($tool.append($tableInfo.savePath, "/response"))## 包声明
package $!{tableInfo.savePackageName}.response;## 包导入
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** Description: 响应枚举类** @Author $!{author}* @Create $!time.currTime("yyyy/MM/dd HH:mm")* @Version 1.0*/@Getter
@AllArgsConstructor
@ToString
public enum RespBeanEnum {// ============================== 枚举常量 ==============================// 通用SUCCESS(200, "成功"),ERROR(500, "失败"),// 可以在此处添加更多枚举常量,例如:// NOT_FOUND(404, "资源未找到"),// UNAUTHORIZED(401, "未授权"),;// ============================== 枚举常量 ==============================// 响应码和响应信息private final Integer code;private final String message;/*** 将枚举转换为map(静态初始化)*/public static final Map<Integer, RespBeanEnum> channelEnumMap = Stream.of(RespBeanEnum.values()).collect(Collectors.toMap(RespBeanEnum::getCode, Function.identity()));/*** 根据code来获取枚举*/public static RespBeanEnum getByCode(int code) {return channelEnumMap.get(code);}}

2.生成效果

CleanShot 2024-10-11 at 18.43.57@2x

3.导出到本地

CleanShot 2024-10-11 at 18.50.47@2x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/504009.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS开发如何从入门进阶到高级

针对iOS开发的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作&#xff0c;汇集了大量开…

洛谷P1617————数字转英文

题目如下 思路&#xff1a;将1~9的英文和20~90的英文用字符串数组存储&#xff0c;把下标看作对应的数字进行输出&#xff0c;遇到0或连续多个0就输出“and”&#xff0c;定义l用来看枚举到哪一位了&#xff0c;如果是单独输入一个“0”&#xff0c;则直接输出zero然后结束。否…

Kubernetes集群架构

Kubernetes集群架构 Kubernetes 集群架构控制平面组件kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-manager 节点组件kubeletkebe-proxy&#xff08;可选&#xff09;容器运行时 插件DNSWeb UI&#xff08;Dashboard&#xff09;容器资源监控集群…

esp32开发笔记之一:esp32开发环境搭建vscode+ubuntu

最近想用esp32做一个物联网项目&#xff0c;踩坑N个终于有点心得&#xff0c;写下来避免和我一样的小白踩无谓的坑。 写在前面&#xff1a; 第一&#xff0c;大家一定要用linux系统作为编译工具&#xff0c;速度上是windows无法比的&#xff0c;不要因为不熟悉linux而选择win…

探索大型语言模型新架构:从 MoE 到 MoA

探索大型语言模型新架构&#xff1a;从 MoE 到 MoA 当前&#xff0c;商业科技公司纷纷投身于一场激烈的竞赛&#xff0c;不断扩大语言模型的规模&#xff0c;并为其注入海量的高质量数据&#xff0c;试图逐步提升模型的准确性。然而&#xff0c;这种看似顺理成章的发展路径逐渐…

数据结构:LinkedList与链表—面试题(三)

目录 1、移除链表元素 2、反转链表 3、链表的中间结点 4、返回倒数第k个结点 5、合并两个有序链表 1、移除链表元素 习题链接https://leetcode.cn/problems/remove-linked-list-elements/description/ 描述&#xff1a;给你一个链表的头节点 head 和一个整数 val &#xff…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

LAMP搭建

LAMP搭建 引子&#xff1a;本篇文章为LAMP的搭建流程&#xff0c;其中L&#xff08;Ubuntu&#xff09;、A&#xff08;Apache&#xff09;、M&#xff08;Mysql&#xff09;、P&#xff08;PHP&#xff09;。 一、L → Ubuntu Step 1&#xff1a;在Vmware Workstation中使…

基于高斯混合模型的数据分析及其延伸应用(具体代码分析)

一、代码分析 &#xff08;一&#xff09;清除工作区和命令行窗口 clear; clc;clear;&#xff1a;该命令用于清除 MATLAB 工作区中的所有变量&#xff0c;确保代码运行环境的清洁&#xff0c;避免之前遗留的变量对当前代码运行产生干扰。例如&#xff0c;如果之前运行的代码中…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…

如何配置Cursor的显示主题模式

cursor打开代码后&#xff0c;默认主题显示的主要代码颜色是白色&#xff0c;注解是黑色的&#xff0c;很不习惯&#xff0c;摸索一下&#xff0c;如何配置成与VSOCDE一样的主题&#xff0c;方案如下。 选择菜单 "File"--"Preferences 选择“ Theme" ---&…

Windows 系统中的任务管理器是什么,打开快捷键是什么?

任务管理器是 Windows 操作系统中一个强大的工具&#xff0c;它允许用户监控系统的性能、启动和停止进程、管理服务、以及查看网络活动等。掌握任务管理器的快捷键可以帮助你更高效地进行这些操作。本文中简鹿办公将教你如何利用任务管理器中的快捷键来提升你的工作效率。 一、…

论文导读 | 数据库中的连接操作

1. 连接操作的背景与问题定义 在关系型数据库中&#xff0c;我们通常面对以下问题&#xff1a; 给定一个数据库实例 I \mathcal{I} I&#xff0c;包含若干关系&#xff08;表&#xff09; R { R 1 , R 2 , ⋯ , R n } \mathcal{R}\{R_1, R_2, \cdots, R_n\} R{R1​,R2​,⋯…

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上&#xff0c;实例是别的同事搭建的。最近又又又想了解一下&#xff0c;而且已经盘了一些了&#xff0c;所以写写记录一下。因为这个事儿没太多的进度压力&#xff0c;索性写到哪儿算哪儿&#xff0c;只要是新了解到的…

【搜索】【推荐】大 PK

引言 在当今信息爆炸的时代&#xff0c;如何从海量数据中精准地为用户推荐最相关的内容成为了科技领域的关键挑战。搜推技术作为推荐系统的核心组件&#xff0c;扮演着至关重要的角色。本文将深入探讨这两种技术背后的方法论&#xff0c;剖析它们各自面临的难点&#xff0c;并…

多模态大模型初探索:通过ollama部署多模态大模型

文章目录 前言模型下载 前言 今天和同事聊天&#xff0c;聊到多模态大模型&#xff0c;感觉可以作为2025年的一个新的探索方向。希望和大家一起学习&#xff0c;一起进步。 今天也是尝试了我能想到的最基本最快速地本地部署多模态大模型的方式&#xff0c;那便是使用ollama。…

maven如何从外部导包

1.找到你项目的文件位置&#xff0c;将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

流媒体内网穿透/组网/网络映射EasyNTS上云网关启动失败如何解决?

在当今的网络视频监控和远程通信领域&#xff0c;设备的远程访问和数据共享需求日益增长。通过EasyNTS平台&#xff0c;用户无需开放内网端口&#xff0c;即可实现内网应用的外网访问&#xff0c;极大地简化了网络配置和维护工作。 EasyNTS上云网关的主要作用是解决异地视频共…