使用velocity模板生成代码
目录结构及代码下载


完整代码地址
https://github.com/wangzhan6666/zhanzhan_generator
1、测试使用到的数据库文件
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名字',
`age` int(0) NULL DEFAULT NULL COMMENT '用户年龄',
`version` int(0) NULL DEFAULT 1 COMMENT '乐观锁',
`deleted` int(0) NULL DEFAULT 0 COMMENT '逻辑删除',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1482996505408204804 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (1, '张三', 15, 1, 0, '2023-07-15 23:49:33', '2023-07-15 23:49:38');
INSERT INTO `user` VALUES (2, '李四', 22, 1, 0, '2023-07-15 23:49:33', '2023-07-15 23:49:38');
SET FOREIGN_KEY_CHECKS = 1;
2、生成代码的关键步骤
2.1、请求参数描述
package com.wangzhan.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GenInfo {
private String tableName;
private String className;
@NotBlank(message = "生成包路径不能为空")
private String packageName;
private String moduleName;
@NotBlank(message = "生成功能名不能为空")
private String functionName;
@NotBlank(message = "作者不能为空")
private String functionAuthor;
private String genType;
private String genPath;
private List<GenInfoColumn> columns;
}
2.2、controller代码
package com.wangzhan.controller;
import com.wangzhan.domain.GenInfo;
import com.wangzhan.domain.GenInfoColumn;
import com.wangzhan.service.IGenInfoService;
import com.wangzhan.utils.generator.GeneratorUtils;
import com.wangzhan.utils.result.AjaxResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/zhanzhan/generator")
public class GeneratorController {
@Resource
private IGenInfoService genInfoService;
@PostMapping("/generatorCode")
public AjaxResult generatorCode(HttpServletResponse response, @RequestBody GenInfo genInfo) {
List<GenInfoColumn> genInfoColumns = genInfoService.selectDbTableColumnsByName(genInfo.getTableName());
for (GenInfoColumn genInfoColumn : genInfoColumns) {
GeneratorUtils.initColumnField(genInfoColumn);
}
genInfo.setColumns(genInfoColumns);
GeneratorUtils.generatorCode(genInfo);
return AjaxResult.success();
}
@GetMapping("/downloadGeneratorCode")
public void downloadGeneratorCode(HttpServletResponse response) {
GenInfo genInfo= new GenInfo();
genInfo.setTableName("user");
genInfo.setClassName("user");
genInfo.setPackageName("com.wangzhan");
genInfo.setModuleName("zhanzhan_generator");
genInfo.setFunctionName("用户信息");
genInfo.setFunctionAuthor("wangzhan");
List<GenInfoColumn> genInfoColumns = genInfoService.selectDbTableColumnsByName(genInfo.getTableName());
for (GenInfoColumn genInfoColumn : genInfoColumns) {
GeneratorUtils.initColumnField(genInfoColumn);
}
genInfo.setColumns(genInfoColumns);
try {
GeneratorUtils.genCode(response, genInfo);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
2.3、代码生成工具类
package com.wangzhan.utils.generator;
import com.wangzhan.constant.GenConstants;
import com.wangzhan.domain.GenInfo;
import com.wangzhan.domain.GenInfoColumn;
import com.wangzhan.utils.str.StringUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class GeneratorUtils {
private static final String PROJECT_PATH = "src\\main\\java";
private static final String MYBATIS_PATH = "src\\main\\resources\\mapper";
public static void generatorCode(GenInfo genInfo) {
VelocityInitializer.initVelocity();
VelocityContext context = prepareContext(genInfo);
List<String> templateList = getTemplateList();
for (String template : templateList) {
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, "UTF-8");
tpl.merge(context, sw);
try {
String path = getGenPath(template, genInfo);
FileUtils.writeStringToFile(new File(path), sw.toString(), "UTF-8");
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
public static byte[] downloadCode(GenInfo genInfo)
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
generatorCode(genInfo, zip);
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
public static void genCode(HttpServletResponse response, GenInfo genInfo) throws IOException
{
byte[] data = downloadCode(genInfo);
response.reset();
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment; filename=\"zhanzhan-generator.zip\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(data, response.getOutputStream());
}
public static void generatorCode(GenInfo genInfo, ZipOutputStream zip) {
VelocityInitializer.initVelocity();
VelocityContext context = prepareContext(genInfo);
List<String> templateList = getTemplateList();
for (String template : templateList) {
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, "UTF-8");
tpl.merge(context, sw);
try {
String path = getFileName(template, genInfo);
zip.putNextEntry(new ZipEntry(path));
IOUtils.write(sw.toString(), zip, "UTF-8");
IOUtils.closeQuietly(sw);
zip.flush();
zip.closeEntry();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
public static VelocityContext prepareContext(GenInfo genInfo) {
String className = genInfo.getClassName();
VelocityContext context = new VelocityContext();
context.put("tableName", genInfo.getTableName());
context.put("functionAuthor" , genInfo.getFunctionAuthor());
context.put("createDateTime" , parseDateToStr());
context.put("moduleName" , genInfo.getModuleName());
context.put("functionName" , genInfo.getFunctionName());
context.put("className" , className == null ? genInfo.getTableName() : className);
context.put("ClassName" , StringUtils.capitalize(className));
context.put("packageName" , genInfo.getPackageName());
context.put("columns" , genInfo.getColumns());
if (!CollectionUtils.isEmpty(genInfo.getColumns())) {
GenInfoColumn pkColumn = genInfo.getColumns().stream().filter((item) -> "1".equals(item.getIsPk())).findFirst().orElse(null);
context.put("pkColumn", pkColumn);
}
return context;
}
public static List<String> getTemplateList() {
List<String> templates = new ArrayList<String>();
templates.add("templates/domain.java.vm");
templates.add("templates/mapper.java.vm");
templates.add("templates/service.java.vm");
templates.add("templates/serviceImpl.java.vm");
templates.add("templates/controller.java.vm");
templates.add("templates/mapper.xml.vm");
return templates;
}
public static String getGenPath(String template, GenInfo genInfo) {
String genPath = genInfo.getGenPath();
if (StringUtils.isEmpty(genPath) || StringUtils.equals(genPath, "/")) {
return System.getProperty("user.dir") + File.separator + getFileName(template, genInfo);
}
return genPath + File.separator + getFileName(template, genInfo);
}
public static String getFileName(String template, GenInfo genInfo) {
String fileName = "";
String moduleName = genInfo.getModuleName();
String packageName = genInfo.getPackageName();
String className = StringUtils.capitalize(genInfo.getClassName() == null ? genInfo.getTableName() : genInfo.getClassName());
String prePath = "";
if (!System.getProperty("user.dir").contains(moduleName)) {
prePath = moduleName + File.separator;
}
String javaPath = prePath + PROJECT_PATH + File.separator + StringUtils.replace(packageName, "." , "/");
String mybatisPath = prePath + MYBATIS_PATH;
if (template.contains("controller.java.vm")) {
fileName = StringUtils.format("{}/controller/{}Controller.java" , javaPath, className);
} else if (template.contains("domain.java.vm")) {
fileName = StringUtils.format("{}/domain/{}.java" , javaPath, className);
} else if (template.contains("mapper.java.vm")) {
fileName = StringUtils.format("{}/mapper/{}Mapper.java" , javaPath, className);
} else if (template.contains("mapper.xml.vm")) {
fileName = StringUtils.format("{}/{}Mapper.xml" , mybatisPath, className);
} else if (template.contains("service.java.vm")) {
fileName = StringUtils.format("{}/service/I{}Service.java" , javaPath, className);
} else if (template.contains("serviceImpl.java.vm")) {
fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java" , javaPath, className);
}
return fileName;
}
public static void initColumnField(GenInfoColumn column) {
String dataType = getDbType(column.getColumnType());
String columnName = column.getColumnName();
column.setJavaField(StringUtils.toCamelCase(columnName));
column.setJavaType("String");
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) {
Integer columnLength = getColumnLength(column.getColumnType());
String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
} else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {
column.setJavaType(GenConstants.TYPE_DATE);
} else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(" , ")"), ",");
if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) {
column.setJavaType(GenConstants.TYPE_BIGDECIMAL);
}
else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) {
column.setJavaType(GenConstants.TYPE_INTEGER);
}
else {
column.setJavaType(GenConstants.TYPE_LONG);
}
}
}
public static String getDbType(String columnType) {
if (StringUtils.indexOf(columnType, "(") > 0) {
return StringUtils.substringBefore(columnType, "(");
} else {
return columnType;
}
}
public static boolean arraysContains(String[] arr, String targetValue) {
return Arrays.asList(arr).contains(targetValue);
}
public static Integer getColumnLength(String columnType) {
if (StringUtils.indexOf(columnType, "(") > 0) {
String length = StringUtils.substringBetween(columnType, "(" , ")");
return Integer.valueOf(length);
} else {
return 0;
}
}
public static final String parseDateToStr() {
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}
}
package com.wangzhan.utils.generator;
import org.apache.velocity.app.Velocity;
import java.util.Properties;
public class VelocityInitializer
{
public static final String UTF8 = "UTF-8";
public static void initVelocity()
{
Properties p = new Properties();
try
{
p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
p.setProperty(Velocity.INPUT_ENCODING, UTF8);
p.setProperty(Velocity.OUTPUT_ENCODING, UTF8);
Velocity.init(p);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}
2.4、根据表名查询数据库列数据
<?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.wangzhan.mapper.GenInfoMapper">
<resultMap id="GenInfoColumnResult" type="com.wangzhan.domain.GenInfoColumn">
<result property="columnName" column="column_name"/>
<result property="columnComment" column="column_comment"/>
<result property="columnType" column="column_type"/>
<result property="isPk" column="is_pk"/>
<result property="isIncrement" column="is_increment"/>
<result property="isRequired" column="is_Required"/>
<result property="sort" column="sort"/>
</resultMap>
<select id="selectDbTableColumnsByName" resultType="com.wangzhan.domain.GenInfoColumn"
resultMap="GenInfoColumnResult">
select column_name,
(case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else null end) as is_required,
(case when column_key = 'PRI' then '1' else '0' end) as is_pk,
ordinal_position as sort,
column_comment,
(case when extra = 'auto_increment' then '1' else '0' end) as is_increment,
column_type
from information_schema.columns
where table_schema = (select database())
and table_name = (#{tableName})
order by ordinal_position
</select>
</mapper>
3、模板代码
3.1、controller.java.vm
package ${packageName}.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.wangzhan.common.controller.BaseController;
import com.wangzhan.common.page.TableDataInfo;
import com.wangzhan.utils.result.AjaxResult;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
@RestController
@RequestMapping("/${moduleName}/${className}")
public class ${ClassName}Controller extends BaseController
{
@Autowired
private I${ClassName}Service ${className}Service;
@GetMapping("/list")
public TableDataInfo list(${ClassName} ${className})
{
startPage();
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
return getDataTable(list);
}
##
## @GetMapping("/export")
## public AjaxResult export(${ClassName} ${className})
## {
## List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
## ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
## return util.exportExcel(list, "${functionName}数据");
## }
@GetMapping(value = "/{${pkColumn.javaField}}")
public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
{
return AjaxResult.success(${className}Service.select${ClassName}ById(${pkColumn.javaField}));
}
@PostMapping
public AjaxResult add(@RequestBody ${ClassName} ${className})
{
return toAjax(${className}Service.insert${ClassName}(${className}));
}
@PutMapping
public AjaxResult edit(@RequestBody ${ClassName} ${className})
{
return toAjax(${className}Service.update${ClassName}(${className}));
}
@DeleteMapping("/{${pkColumn.javaField}s}")
public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
{
return toAjax(${className}Service.delete${ClassName}ByIds(${pkColumn.javaField}s));
}
}
3.2、domain.java.vm
package ${packageName}.domain;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
#foreach ($column in $columns)
#if($column.javaType == 'Date')
import java.util.Date;
#break
#end
#end
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ${ClassName} implements Serializable
{
private static final long serialVersionUID = 1L;
#foreach ($column in $columns)
private $column.javaType $column.javaField;
#end
}
3.3、mapper.java.vm
package ${packageName}.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import ${packageName}.domain.${ClassName};
/**
* ${functionName}Mapper接口
*
* @author ${functionAuthor}
* @date ${createDateTime}
*/
@Repository
@Mapper
public interface ${ClassName}Mapper
{
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
/**
* 新增${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
public int insert${ClassName}(${ClassName} ${className});
/**
* 修改${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
public int update${ClassName}(${ClassName} ${className});
/**
* 删除${functionName}
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 批量删除${functionName}
*
* @param ${pkColumn.javaField}s 需要删除的数据ID
* @return 结果
*/
public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 批量删除${subTable.functionName}
*
* @param customerIds 需要删除的数据ID
* @return 结果
*/
public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 批量新增${subTable.functionName}
*
* @param ${subclassName}List ${subTable.functionName}列表
* @return 结果
*/
public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
/**
* 通过${functionName}ID删除${subTable.functionName}信息
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
}
3.4、mapper.xml.vm
<?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="${packageName}.mapper.${ClassName}Mapper">
<resultMap type="${packageName}.domain.${ClassName}" id="${ClassName}Result">
<result property="${column.javaField}" column="${column.columnName}" />
</resultMap>
<sql id="select${ClassName}Vo">
select
</sql>
<select id="select${ClassName}List" parameterType="${packageName}.domain.${ClassName}" resultMap="${ClassName}Result">
<include refid="select${ClassName}Vo"/>
<where>
<if test="$column.javaField != null #if($column.javaType == 'String' && $column.isRequired) and $column.javaField.trim() != ''#end">
and $column.columnName =
</if>
</where>
</select>
<select id="select${ClassName}ById" parameterType="${pkColumn.javaType}" resultMap="${ClassName}Result">
<include refid="select${ClassName}Vo"/>
where ${pkColumn.columnName} =
</select>
<insert id="insert${ClassName}" parameterType="${packageName}.domain.${ClassName}"
insert into ${tableName}
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="$column.javaField != null#if($column.javaType == 'String' && $column.isRequired) and $column.javaField != ''#end">
$column.columnName,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="$column.javaField != null#if($column.javaType == 'String' && $column.isRequired) and $column.javaField != ''#end">
</if>
</trim>
</insert>
<update id="update${ClassName}" parameterType="${packageName}.domain.${ClassName}">
update ${tableName}
<trim prefix="SET" suffixOverrides=",">
<if test="$column.javaField != null#if($column.javaType == 'String' && $column.isRequired) and $column.javaField != ''#end">
$column.columnName =
</if>
</trim>
where ${pkColumn.columnName} =
</update>
<delete id="delete${ClassName}ById" parameterType="${pkColumn.javaType}">
delete from ${tableName} where ${pkColumn.columnName} =
</delete>
<delete id="delete${ClassName}ByIds" parameterType="String">
delete from ${tableName} where ${pkColumn.columnName} in
<foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
</foreach>
</delete>
</mapper>
3.5、service.java.vm
package ${packageName}.service;
import java.util.List;
import ${packageName}.domain.${ClassName};
/**
* ${functionName}Service接口
*
* @author ${functionAuthor}
* @date ${createDateTime}
*/
public interface I${ClassName}Service
{
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
/**
* 新增${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
public int insert${ClassName}(${ClassName} ${className});
/**
* 修改${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
public int update${ClassName}(${ClassName} ${className});
/**
* 批量删除${functionName}
*
* @param ${pkColumn.javaField}s 需要删除的${functionName}ID
* @return 结果
*/
public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 删除${functionName}信息
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
}
3.6、serviceImpl.java.vm
package ${packageName}.service.impl;
import java.util.List;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
/**
* ${functionName}Service业务层处理
*
* @author ${functionAuthor}
* @date ${createDateTime}
*/
@Service
public class ${ClassName}ServiceImpl implements I${ClassName}Service {
@Autowired
private ${ClassName}Mapper ${className}Mapper;
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
@Override
public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) {
return ${className}Mapper.select${ClassName}ById(${pkColumn.javaField});
}
/**
* 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}
*/
@Override
public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) {
return ${className}Mapper.select${ClassName}List(${className});
}
/**
* 新增${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
@Override
public int insert${ClassName}(${ClassName} ${className}) {
${className}.setCreateTime(new Date());
return ${className}Mapper.insert${ClassName}(${className});
}
/**
* 修改${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
@Override
public int update${ClassName}(${ClassName} ${className}) {
${className}.setUpdateTime(new Date());
return ${className}Mapper.update${ClassName}(${className});
}
/**
* 批量删除${functionName}
*
* @param ${pkColumn.javaField}s 需要删除的${functionName}ID
* @return 结果
*/
@Override
public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s) {
return ${className}Mapper.delete${ClassName}ByIds(${pkColumn.javaField}s);
}
/**
* 删除${functionName}信息
*
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
@Override
public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) {
return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField});
}
}