mysql generate
1,引入依赖:
<!-- MyBatis 生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
2,数据库连接配置文件 generator.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&rewriteBatchedStatements=true&useSSL=false
jdbc.userId=root
jdbc.password=root
3,代码生成配置文件:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--数据库驱动-->
<properties resource="generator.properties"/> <!--添加配置数据源文件-->
<context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 为模型生成序列化方法-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 为生成的Java模型创建一个toString方法 -->
<!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>-->
<!--可以自定义生成model的代码注释,-->
<!--生成mapper.xml时覆盖原文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<!--引入LombokPlugin自定义插件-->
<plugin type="org.example.generate.LombokPlugin" >
<property name="hasLombok" value="true"/>
</plugin>
<commentGenerator type="org.example.generate.CommentGenerator">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.userId}"
password="${jdbc.password}">
<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="org.example.domain.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<!-- <property name="trimStrings" value="true"/>-->
</javaModelGenerator>
<!--指定生成mapper.xml的路径-->
<sqlMapGenerator targetPackage="org.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject="resources">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名 tableName填表名 domainObjectName生成实体名称-->
<table tableName="current_lottery" domainObjectName="CurrentLottery"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<!--添加此配置: 不使用默认驼峰格式-->
<!--<property name="useActualColumnNames" value="true"/>-->
<!--<generatedKey column="id" sqlStatement="MySql" identity="true"/>-->
</table>
</context>
</generatorConfiguration>
4,LombokPlugin插件类
package org.example.generate;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author : zhang sq
* @date : 2019/12/24 11:40
**/
public class LombokPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> warnings) {
return true;
}
//todo 实体model添加信息
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
//todo 实体添加import信息
topLevelClass.addImportedType("lombok.AllArgsConstructor");
topLevelClass.addImportedType("lombok.NoArgsConstructor");
topLevelClass.addImportedType("lombok.Data");
// topLevelClass.addImportedType("io.swagger.annotations.ApiModel");
// topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty");
topLevelClass.addImportedType("com.fasterxml.jackson.annotation.JsonFormat");
// topLevelClass.addImportedType("javax.validation.constraints.NotBlank");
// topLevelClass.addImportedType("javax.validation.constraints.NotNull");
//topLevelClass.addImportedType("org.apache.solr.client.solrj.beans.Field"); //solr注解导包
//todo 实体添加注解信息
topLevelClass.addAnnotation("@AllArgsConstructor");
topLevelClass.addAnnotation("@NoArgsConstructor");
topLevelClass.addAnnotation("@Data");
// topLevelClass.addAnnotation("@ApiModel(description = \"" + "" + "\")");
//todo 实体添加作者时间
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @author : zhang sq ");
topLevelClass.addJavaDocLine(" * @date : "+ date2Str(new Date()));
topLevelClass.addJavaDocLine(" **/");
return true;
}
//todo mapper 添加注解信息 import信息
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
//todo mapper添加import 和注解
FullyQualifiedJavaType importedType1=new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper");
FullyQualifiedJavaType importedType2=new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param");
Set set=new HashSet();
set.add(importedType1); set.add(importedType2);
interfaze.addImportedTypes(set);
interfaze.addAnnotation("@Mapper");
//todo Mapper添加作者时间
interfaze.addJavaDocLine("/**");
interfaze.addJavaDocLine(" * @author : zhang sq ");
interfaze.addJavaDocLine(" * @date : "+ date2Str(new Date()));
interfaze.addJavaDocLine(" **/");
return true;
}
//todo 控制是否生成get方法 false不生成 true生成
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
//不生成getter
return false;
}
//todo 控制是否生成set方法 false不生成 true生成
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
//不生成setter
return false;
}
private String date2Str(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
return sdf.format(date);
}
}
5,Generator生成主类:
package org.example.generate;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @ Author : zhangshengqiang
* @ Date : 2019/5/23 16:39
**/
public class Generator {
public static void main(String[] args) throws Exception {
String functionName="当前期号"; //类描述
String ClassName="CurrentLottery"; //类名
String className="currentLottery"; //类名驼峰
String path="C:\\project\\com.cn.lottery\\src\\main\\java\\org\\example\\";
//MBG 执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
//当生成的代码重复时,覆盖原代码
boolean overwrite = true;
//读取我们的 MBG 配置文件
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建 MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//获取保存的注释信息
List<String> request = CommentGenerator.request;
List<String> response = CommentGenerator.response;
ClassCreate.generate(path,functionName,ClassName,className,request,response);
//输出警告信息
for (String warning : warnings) {
System.out.println(warning);
}
}
}
6,生成共有类CommentGenerator:
package org.example.generate;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* @ Author : zhangshengqiang
* @ Date : 2019/5/23 17:36
**/
public class CommentGenerator extends DefaultCommentGenerator {
public static List<String> request = new ArrayList<>();
public static List<String> response = new ArrayList<>();
private boolean addRemarkComments = false;
private static final String EXAMPLE_SUFFIX = "Example";
private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";
private int i = 0;
/**
* 设置用户配置的参数
*/
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
/**
* 给字段添加注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
String jdbcTypeName = introspectedColumn.getJdbcTypeName();
//todo 添加api文档注释信息
String name = field.getName();
String shortName = field.getType().getShortName();
String re = "@apiParam {" + shortName + "} " + name + " " + remarks;
String rs = "@apiSuccess {" + shortName + "} " + name + " " + remarks;
request.add(re);
response.add(rs);
if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
addFieldJavaDoc(field, remarks);
//数据库中特殊字符需要转义
if (remarks.contains("\"")) {
remarks = remarks.replace("\"", "'");
}
//todo 给model的字段添加swagger注解 swagger二选一 格式例: @ApiModelProperty(value = "确认收货时间" ,example = "")
// Object example = setExample(jdbcTypeName, remarks);
// field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\" ,example = \"" + example + "\")");
//todo 给model的字段添加swagger注解 swagger二选一 格式例: @ApiModelProperty(value = "确认收货时间")
//field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\" )");
//todo solr注解
// field.addJavaDocLine("@Field( \""+ field.getName() + "\")");
//todo 为date类型字段自动添加@JsonFormat 注解
if (jdbcTypeName.equals("TIMESTAMP") || jdbcTypeName.equals("TIME")) {
field.addJavaDocLine("@JsonFormat(locale=\"zh\", timezone=\"GMT+8\", pattern=\"yyyy-MM-dd HH:mm:ss\")");
}
//todo 为字段添加校验
// if(jdbcTypeName.equals("VARCHAR")||jdbcTypeName.equals("LONGVARCHAR")){
// if(remarks.contains("时间")){
//
// }else {
// field.addJavaDocLine("@NotBlank(message=\""+remarks+"不能为空\")");
// }
// }
// if(jdbcTypeName.equals("INTEGER")||jdbcTypeName.equals("BIGINT")||jdbcTypeName.equals("DECIMAL")){
// field.addJavaDocLine("@NotNull(message=\""+remarks+"不能为空\")");
// }
}
super.addFieldComment(field, introspectedTable, introspectedColumn);
}
/**
* todo 给model的字段添加注释 例://订单id 注释格式二选一
*/
private void addFieldJavaDoc(Field field, String remarks) {
//todo 给model的字段添加注释 例://订单id
// String[] remarkLines=remarks.split(System.getProperty("line.separator"));//换行
// field.addJavaDocLine("//"+remarkLines[0]);
//todo 给model的字段添加注释 例: /**
//todo * 订单id
//todo */
// field.addJavaDocLine("/**");
// String[] remarkLines=remarks.split(System.getProperty("line.separator"));//换行
// field.addJavaDocLine(" * "+remarkLines[0]);
// field.addJavaDocLine(" */");
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
// super.addJavaFileComment(compilationUnit);
// if (compilationUnit.isJavaInterface() && compilationUnit.
// getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
// compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
// }
}
private Object setExample(String jdbcTypeName, String remarks) {
switch (jdbcTypeName) {
case "BIGINT":
return 2L;
case "VARCHAR":
if (remarks.contains("时间")) {
return "2018-08-08 20:00:00";
} else {
return remarks;
}
case "LONGVARCHAR":
return remarks;
case "TIMESTAMP":
return "2018-08-08 20:00:00";
case "TIME":
return "2018-08-08 20:00:00";
case "DECIMAL":
return "6.66";
case "INTEGER":
return "1";
}
return null;
}
}
7,类生成类ClassCreate
package org.example.generate;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.example.constant.Constants;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
/**
* @author : zhang sq
* @date : 2020/8/27 15:07
**/
public class ClassCreate {
public static void generate(String path,String functionName, String ClassName, String className,List<String> request,List<String> response) throws Exception {
Properties p = new Properties();
// 加载classpath目录下的vm文件
p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 定义字符集
p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
// 初始化Velocity引擎,指定配置Properties
Velocity.init(p);
VelocityContext context = new VelocityContext();
context.put("functionName", functionName);
context.put("ClassName", ClassName);
context.put("className",className);
context.put("request",request);
context.put("response",response);
context.put("date",new SimpleDateFormat(Constants.YYYY_MM_DD).format(new Date()));
List<String> templateList = getTemplateList();
int i=0;
for (String template :templateList){
// 渲染模板
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
tpl.merge(context, sw);
OutputStream out = null;
if(i==0){
out = new FileOutputStream(path+"controller\\"+ClassName+"Controller.java");
}else if(i==1){
out = new FileOutputStream(path+"service\\"+ClassName+"Service.java");
}else if(i==2){
out = new FileOutputStream(path+"service\\impl\\"+ClassName+"ServiceImpl.java");
}else if(i==3){
out = new FileOutputStream(path+"mapper\\"+ClassName+"Mapper.java");
}
Writer writer = new BufferedWriter(new OutputStreamWriter(out, "utf-8"));//解决乱码问题
// 转换输出
tpl.merge(context, writer);
writer.flush();
out.close();
i++;
}
}
public static List<String> getTemplateList() {
List<String> templates = new ArrayList<String>();
String resourcePath = "vm/java/";
templates.add(resourcePath+"controller.java.vm");
templates.add(resourcePath+"service.java.vm");
templates.add(resourcePath+"serviceImpl.java.vm");
templates.add(resourcePath+"mapper.java.vm");
return templates;
}
}
8,resources下vm/java/的模板文件:controller.java.vm
package classfile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import util.PaginationResponse;
import util.QueryParam;
import util.ResultVO;
import util.StatusCode;
import model.${ClassName};
/**
* ${functionName}Controller
* @author zhang sq
* @date ${date}
*/
@Api(tags = "${functionName}",description = "${ClassName}")
@RestController
@RequestMapping("/manager/${className}")
public class ${ClassName}Controller{
@Autowired
private ${ClassName}Service ${className}Service;
/**
* @api {post} /manager/${className}/insert 新增${functionName}
* @apiName insert
* @apiGroup ${functionName}
* @apiVersion 0.1.0
* @apiDescription 新增${functionName}
#foreach( $rs in $request )
* ${rs}
#end
* @apiSuccess {String} code 结果码
* @apiSuccess {String} msg 消息说明
* @apiSuccess {String} rows 数据组合
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "200",
* "msg": "SUCCESS",
* "rows": 1
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 404 Not Found
* {
* "code": "999",
* "msg": "操作失败,异常信息为:参数id不能为空",
* "rows": ""
* }
*/
@ApiOperation("新增${functionName}")
@CrossOrigin
@PostMapping("/insert")
public ResultVO insert(${ClassName} ${className}) {
int count = ${className}Service.insert(${className});
return new ResultVO(StatusCode.RESULT_SUCCESS,count);
}
/**
* @api {post} /manager/${className}/update 修改${functionName}
* @apiName update
* @apiGroup ${functionName}
* @apiVersion 0.1.0
* @apiDescription 修改${functionName}
#foreach( $rs in $request )
* ${rs}
#end
* @apiSuccess {String} code 结果码
* @apiSuccess {String} msg 消息说明
* @apiSuccess {String} rows 数据组合
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "200",
* "msg": "SUCCESS",
* "rows": 1
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 404 Not Found
* {
* "code": "999",
* "msg": "操作失败,异常信息为:参数id不能为空",
* "rows": ""
* }
*/
@ApiOperation("修改${functionName}")
@CrossOrigin
@PostMapping("/update")
public ResultVO update(${ClassName} ${className}) {
int count = ${className}Service.update(${className});
return new ResultVO(StatusCode.RESULT_SUCCESS,count);
}
/**
* @api {get} /manager/${className}/findList 条件分页查询${functionName}列表
* @apiName findList
* @apiGroup ${functionName}
* @apiVersion 0.1.0
* @apiDescription ${functionName}
*
* @apiParam {Integer} pageNum 当前数据页码(必填)
* @apiParam {Integer} pageSize 单页数据量(必填)
* @apiParam {String} A 无敌 (选填)
* @apiParam {String} A 无敌 (选填)
* @apiParam {String} A 无敌 (选填)
#foreach( $rs in $response )
* ${rs}
#end
* @apiSuccess {Long} pageDataSize 数据总数
* @apiSuccess {String} pageDataList 数据结果集
* @apiSuccess {Integer} pageNum 当前数据页码
* @apiSuccess {Integer} pageSize 单页数据量
* @apiSuccess {Integer} total 总页数
* @apiSuccess {String} code 结果码
* @apiSuccess {String} msg 消息说明
* @apiSuccess {String} rows 数据组合
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "200",
* "msg": "SUCCESS",
* "rows": 1
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 404 Not Found
* {
* "code": "999",
* "msg": "操作失败,异常信息为:参数id不能为空",
* "rows": ""
* }
*/
@CrossOrigin
@ApiOperation("条件分页查询${functionName}列表")
@GetMapping("/findList")
public ResultVO findList(QueryParam param){
PaginationResponse<${ClassName}> response = ${className}Service.findList(param);
return new ResultVO(StatusCode.RESULT_SUCCESS,response);
}
/**
* @api {get} /manager//${className}/findById 通过id查看${functionName}详细信息
* @apiName findById
* @apiGroup ${functionName}
* @apiVersion 0.1.0
* @apiDescription 通过id查看${functionName}详细信息
*
* @apiParam {Integer} id 主键id(必填)
*
#foreach( $rs in $response )
* ${rs}
#end
* @apiSuccess {String} code 结果码
* @apiSuccess {String} msg 消息说明
* @apiSuccess {String} rows 数据组合
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "200",
* "msg": "SUCCESS",
* "rows": 1
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 404 Not Found
* {
* "code": "999",
* "msg": "操作失败,异常信息为:参数id不能为空",
* "rows": ""
* }
*/
@CrossOrigin
@ApiOperation("通过id查看${functionName}详细信息")
@GetMapping("/findById")
public ResultVO getInfo(Integer id) {
${ClassName} ${className} = ${className}Service.findById(id);
if(${className}==null){
return new ResultVO(StatusCode.DATA_NULL);
}
return new ResultVO(StatusCode.RESULT_SUCCESS,${className});
}
/**
* @api {get} /manager/test/deleteById 通过id删除测试
* @apiName deleteById
* @apiGroup 测试
* @apiVersion 0.1.0
* @apiDescription 通过id删除测试
*
* @apiParam {Integer} id id(必填)
* @apiSuccess {String} code 结果码
* @apiSuccess {String} msg 消息说明
* @apiSuccess {String} rows 数据组合
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "200",
* "msg": "SUCCESS",
* "rows": 1
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 404 Not Found
* {
* "code": "999",
* "msg": "操作失败,异常信息为:参数id不能为空",
* "rows": ""
* }
*/
@CrossOrigin
@ApiOperation("通过id删除${functionName}")
@GetMapping("/deleteById")
public ResultVO deleteById(Integer id) {
int count = ${className}Service.deleteById(id);
if(count==0){
return new ResultVO(StatusCode.OPERA_DATA_NULL);
}else {
return new ResultVO(StatusCode.RESULT_SUCCESS,count);
}
}
}
mapper.java.vm文件:
package classfile;
import org.apache.ibatis.annotations.Param;
import util.QueryParam;
import java.util.List;
import model.${ClassName};
/**
* ${functionName}Mapper接口
* @author zhang sq
* @date ${date}
*/
public interface ${ClassName}Mapper {
//新增${functionName}
int insert(${ClassName} ${className});
//修改${functionName}
int update(${ClassName} ${className});
//通过id查看${functionName}
${ClassName} findById(@Param("id") Integer id);
//通过id删除${functionName}
int deleteById(@Param("id") Integer id);
//条件分页查询${functionName}
List<${ClassName}> findList(QueryParam param);
}
service.java.vm文件:
package classfile;
import util.PaginationResponse;
import util.QueryParam;
import model.${ClassName};
/**
* ${functionName}Service接口
* @author zhang sq
* @date ${date}
*/
public interface ${ClassName}Service {
//新增${functionName}
int insert(${ClassName} ${className});
//修改${functionName}
int update(${ClassName} ${className});
//通过id查看${functionName}
${ClassName} findById(Integer id);
//条件分页查询${functionName}列表
PaginationResponse<${ClassName}> findList(QueryParam param);
//通过id删除${functionName}信息
int deleteById(Integer id);
}
serviceImpl.java.vm文件:
package classfile;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import util.Constants;
import util.GlobalException;
import util.PaginationResponse;
import util.QueryParam;
import java.util.List;
import model.${ClassName};
/**
* ${functionName}Service业务层处理
* @author zhang sq
* @date ${date}
*/
@Service
public class ${ClassName}ServiceImpl implements ${ClassName}Service {
private static Logger log=LoggerFactory.getLogger(${ClassName}ServiceImpl.class);
@Autowired
private ${ClassName}Mapper ${className}Mapper;
//新增${functionName}
@Override
@Transactional(rollbackFor = Exception.class)
public int insert(${ClassName} ${className}) {
check${ClassName}(${className}, Constants.METHOD_ADD);
int count = ${className}Mapper.insert(${className});
log.info("新增${functionName}请求成功 ==>>返回结果 ==>>> {}",count);
return count;
}
//修改${functionName}
@Override
@Transactional(rollbackFor = Exception.class)
public int update(${ClassName} ${className}) {
check${ClassName}(${className}, Constants.METHOD_UPDATE);
int count = ${className}Mapper.update(${className});
log.info("修改${functionName}请求成功 ==>>返回结果 ==>>> {}",count);
return count;
}
//通过id查看${functionName}
@Override
public ${ClassName} findById(Integer id) {
log.info("进入通过id查看${functionName} ==>> 参数id为==>>> {}",id);
check${ClassName}(id, Constants.METHOD_INFO);
${ClassName} ${className} = ${className}Mapper.findById(id);
log.info("通过id查看${functionName}请求成功 ==>> 返回结果为==>>> {}",${className}==null? null:${className}.toString());
return ${className};
}
//通过id删除${functionName}
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteById(Integer id) {
log.info("进入通过id删除${functionName} ==>> 参数id为==>>> {}",id);
check${ClassName}(id, Constants.METHOD_DEL);
int count = ${className}Mapper.deleteById(id);
log.info("通过id删除${functionName}请求成功 ==>> 返回结果为==>>> {}",count);
return count;
}
//条件分页查询${functionName}
@Override
public PaginationResponse<${ClassName}> findList(QueryParam param) {
check${ClassName}(param, Constants.METHOD_LIST);
log.info("进入条件分页查询${functionName} ==>> 参数param为==>>> {}",param.toString());
Page<Object> page = PageHelper.startPage(param.getPageNum(), param.getPageSize(), true);
List<${ClassName}> ${className}List=${className}Mapper.findList(param);
PaginationResponse<${ClassName}> response =
PaginationResponse.getPagination(param, page.getTotal(), ${className}List, page.getPages());
log.info("条件分页查询${functionName}请求成功 ==>> 返回结果为==>>> {}",response==null? null:response.toString());
return response;
}
//根据请求类型效验参数
private void check${ClassName}(QueryParam param, String type) {
if(type.equals(Constants.METHOD_LIST)) { //查询列表
}
}
//根据请求类型效验参数
private void check${ClassName}(${ClassName} ${className}, String type) {
if(${className}==null){
throw new GlobalException(Constants.PARAM_ERROR,"${className}不能为空");
}
if(type.equals(Constants.METHOD_ADD)){ //新增
log.info("进入新增${functionName} ==>> 参数${className}为==>>> {}",${className}.toString());
if(StringUtils.isEmpty(${className}.getCreateUser())){
throw new GlobalException(Constants.PARAM_ERROR,"创建人 createUser 不能为空");
}
if(StringUtils.isEmpty("12")){
throw new GlobalException(Constants.PARAM_ERROR,"标题 title 不能为空");
}
log.info("新增${functionName}参数校验通过");
}else if(type.equals(Constants.METHOD_UPDATE)){ //修改
log.info("进入修改${functionName} ==>>参数${className}为==>>> {}",${className}.toString());
if(StringUtils.isEmpty(${className}.getId())){
throw new GlobalException(Constants.PARAM_ERROR,"主键 id 不能为空");
}
if(StringUtils.isEmpty(${className}.getUpdateUser())){
throw new GlobalException(Constants.PARAM_ERROR,"修改人 updateUser 不能为空");
}
log.info("修改${functionName}参数校验通过");
}
}
//根据请求类型效验参数
private void check${ClassName}(Integer id, String type) {
if(type.equals(Constants.METHOD_DEL)||type.equals(Constants.METHOD_INFO)) { //删除和查询单条
if(id==null||id<=0){
throw new GlobalException(Constants.PARAM_ERROR,"参数 id 不能为空或者小于0");
}
}
}
}
注:如果报找不到vm模板文件,可能是加载路径不对,也可能是maven有缓存需要clean一下。
参照:
Velocity模板:Velocity官方指南-使用Velocity-阿里云开发者社区