mybatis-dsc-generator
[图片上传失败...(image-835cad-1601049787821)]
还在为写swagger而烦恼吗?还在为忘记写注释而烦恼吗?还在为写简单的api接口而烦恼吗?mybatis-dsc-generator完美集成lombok,swagger的代码生成工具,让你不再为繁琐的注释和简单的接口实现而烦恼:entity集成,格式校验,swagger; dao自动加@ mapper,service自动注释和依赖; 控制器实现单表的增副改查,并实现swaggers的api文档。
源码地址
- GitHub:https://github.com/flying-cattle/mybatis-dsc-generator
- 码云:https://gitee.com/flying-cattle/mybatis-dsc-generator
MAVEN地址
2.1.0版本是未集成Mybatis-plus版本——源码分支master
com.github.flying-cattle
mybatis-dsc-generator
2.1.0.RELEASE
3.0.0版本是集成了Mybatis-plus版本——源码分支mybatisPlus
com.github.flying-cattle
mybatis-dsc-generator
3.0.0.RELEASE
数据表结构样式
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`login_name` varchar(40) DEFAULT NULL COMMENT '登录名',
`password` varchar(100) NOT NULL COMMENT '秘密',
`nickname` varchar(50) NOT NULL COMMENT '昵称',
`type` int(10) unsigned DEFAULT NULL COMMENT '类型',
`state` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '状态:-1失败,0等待,1成功',
`note` varchar(255) DEFAULT NULL COMMENT '备注',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`update_uid` bigint(20) DEFAULT '0' COMMENT '修改人用户ID',
`login_ip` varchar(50) DEFAULT NULL COMMENT '登录IP地址',
`login_addr` varchar(100) DEFAULT NULL COMMENT '登录地址',
PRIMARY KEY (`id`),
UNIQUE KEY `login_name` (`login_name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
要求必须有表注释,要求必须有主键为id,所有字段必须有注释(便于生成java注释swagger等)。
生成的实体类
生成方法参考源码中的:https://gitee.com/flying-cattle/mybatis-dsc-generator/blob/master/src/main/java/com/github/mybatis/fl/test/TestMain.java
执行结果
实体类
/**
* @filename:User CollectionRoute
* @project wallet-sign V1.0
* Copyright(c) 2018 BianPeng Co. Ltd.
* All right reserved.
*/
package com.emep.mall.admin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
/**
* Copyright: Copyright (c) 2019
*
* 说明: 资金归集实体类
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------------*
* CollectionRoute BianPeng V1.0 initialize
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User extends Model {
private static final long serialVersionUID = 1601046735413L;
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(name = "id" , value = "ID")
private Long id;
@ApiModelProperty(name = "loginName" , value = "登录名")
private String loginName;
@ApiModelProperty(name = "password" , value = "秘密")
private String password;
@ApiModelProperty(name = "nickname" , value = "昵称")
private String nickname;
@ApiModelProperty(name = "type" , value = "类型")
private Integer type;
@ApiModelProperty(name = "state" , value = "状态:-1失败,0等待,1成功")
private Integer state;
@ApiModelProperty(name = "note" , value = "备注")
private String note;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@ApiModelProperty(name = "createTime" , value = "创建时间")
private Date createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@ApiModelProperty(name = "updateTime" , value = "更新时间")
private Date updateTime;
@ApiModelProperty(name = "updateUid" , value = "修改人用户ID")
private Long updateUid;
@ApiModelProperty(name = "loginIp" , value = "登录IP地址")
private String loginIp;
@ApiModelProperty(name = "loginAddr" , value = "登录地址")
private String loginAddr;
@Override
protected Serializable pkVal() {
return this.id;
}
}
DAO
/**
* @filename:UserDao CollectionRoute
* @project wallet-sign V1.0
* Copyright(c) 2018 BianPeng Co. Ltd.
* All right reserved.
*/
package com.emep.mall.admin.dao;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import com.emep.mall.admin.entity.User;
/**
* Copyright: Copyright (c) 2019
*
* 说明: 资金归集数据访问层
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------------*
* CollectionRoute BianPeng V1.0 initialize
*/
@Mapper
public interface UserDao extends BaseMapper {
}
xml
id, login_name, password, nickname, type, state, note, create_time, update_time, update_uid, login_ip, login_addr
service
/**
* @filename:UserService CollectionRoute
* @project wallet-sign V1.0
* Copyright(c) 2018 BianPeng Co. Ltd.
* All right reserved.
*/
package com.emep.mall.admin.service;
import com.emep.mall.admin.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* Copyright: Copyright (c) 2019
*
* 说明: 资金归集服务层
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------------*
* CollectionRoute BianPeng V1.0 initialize
*/
public interface UserService extends IService {
}
serviceImpl
/**
* @filename:UserServiceImpl CollectionRoute
* @project wallet-sign V1.0
* Copyright(c) 2018 BianPeng Co. Ltd.
* All right reserved.
*/
package com.emep.mall.admin.service.impl;
import com.emep.mall.admin.entity.User;
import com.emep.mall.admin.dao.UserDao;
import com.emep.mall.admin.service.UserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* Copyright: Copyright (c) 2019
*
* 说明: 资金归集服务实现层
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------------*
* CollectionRoute BianPeng V1.0 initialize
*/
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
}
controller
/**
* @filename:UserController CollectionRoute
* @project wallet-sign V1.0
* Copyright(c) 2018 BianPeng Co. Ltd.
* All right reserved.
*/
package com.emep.mall.admin.web;
import com.emep.mall.admin.response.JsonResult;
import com.emep.mall.admin.entity.User;
import com.emep.mall.admin.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Copyright: Copyright (c) 2019
* https://my.oschina.net/bianxin/blog/3035352?nocache=1554967026459
* 说明: 资金归集API接口层
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------------*
* CollectionRoute BianPeng V1.0 initialize
*/
@Api(description = "资金归集",value="资金归集" )
@RestController
@RequestMapping("/user")
public class UserController {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
public UserService userServiceImpl;
/**
* @explain 查询资金归集对象
* @param 对象参数:id
* @return user
* @author BianPeng
* @time CollectionRoute
*/
@GetMapping("/getUserById/{id}")
@ApiOperation(value = "获取资金归集信息", notes = "获取资金归集信息[user],作者:BianPeng")
@ApiImplicitParam(paramType="path", name = "id", value = "资金归集id", required = true, dataType = "Long")
public JsonResult getUserById(@PathVariable("id")Long id){
JsonResult result=new JsonResult();
try {
User user=userServiceImpl.getById(id);
if (user!=null) {
result.setType("success");
result.setMessage("成功");
result.setData(user);
} else {
logger.error("获取资金归集失败ID:"+id);
result.setType("fail");
result.setMessage("你获取的资金归集不存在");
}
} catch (Exception e) {
logger.error("获取资金归集执行异常:"+e.getMessage());
result=new JsonResult(e);
}
return result;
}
/**
* @explain 添加或者更新资金归集对象
* @param 对象参数:user
* @return int
* @author BianPeng
* @time CollectionRoute
*/
@PostMapping("/insertSelective")
@ApiOperation(value = "添加资金归集", notes = "添加资金归集[user],作者:BianPeng")
public JsonResult insertSelective(User user){
JsonResult result=new JsonResult();
try {
boolean rg=userServiceImpl.saveOrUpdate(user);
if (rg) {
result.setType("success");
result.setMessage("成功");
result.setData(user);
} else {
logger.error("添加资金归集执行失败:"+user.toString());
result.setType("fail");
result.setMessage("执行失败,请稍后重试");
}
} catch (Exception e) {
logger.error("添加资金归集执行异常:"+e.getMessage());
result=new JsonResult(e);
}
return result;
}
/**
* @explain 删除资金归集对象
* @param 对象参数:id
* @return int
* @author BianPeng
* @time CollectionRoute
*/
@PostMapping("/deleteByPrimaryKey")
@ApiOperation(value = "删除资金归集", notes = "删除资金归集,作者:BianPeng")
@ApiImplicitParam(paramType="query", name = "id", value = "资金归集id", required = true, dataType = "Long")
public JsonResult
aJaxResponse
package com.emep.mall.admin.response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.net.ConnectException;
import java.sql.SQLException;
/**
* Copyright: Copyright (c) 2019
*
* 说明: 用户服务层
* @version: V1.0
* @author: BianPeng
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2019/4/9 flying-cattle V1.0 initialize
*/
public class JsonResult implements Serializable {
Logger logger = LoggerFactory.getLogger(this.getClass());
private static final long serialVersionUID = 1071681926787951549L;
/**
* 返回状态
*/
private Boolean isTrue=true;
/**
* 状态码
*/
private String code;
/**
* 业务码
*/
private String type;
/**
* 状态说明
*/
private String message;
/**
* 返回数据
*/
private T data;
public Boolean getTrue() {
return isTrue;
}
public void setTrue(Boolean aTrue) {
isTrue = aTrue;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/**
* 返回成功
* @param type 业务码
* @param message 错误说明
* @param data 数据
*/
public JsonResult(String type, String message, T data) {
this.isTrue=true;
this.code ="0000";
this.type=type;
this.message = message;
this.data=data;
}
public JsonResult() {
this.isTrue=true;
this.code ="0000";
}
public JsonResult(Throwable throwable) {
logger.error(throwable+"tt");
this.isTrue=false;
if(throwable instanceof NullPointerException){
this.code= "1001";
this.message="空指针:"+throwable;
}else if(throwable instanceof ClassCastException ){
this.code= "1002";
this.message="类型强制转换异常:"+throwable;
}else if(throwable instanceof ConnectException){
this.code= "1003";
this.message="链接失败:"+throwable;
}else if(throwable instanceof IllegalArgumentException ){
this.code= "1004";
this.message="传递非法参数异常:"+throwable;
}else if(throwable instanceof NumberFormatException){
this.code= "1005";
this.message="数字格式异常:"+throwable;
}else if(throwable instanceof IndexOutOfBoundsException){
this.code= "1006";
this.message="下标越界异常:"+throwable;
}else if(throwable instanceof SecurityException){
this.code= "1007";
this.message="安全异常:"+throwable;
}else if(throwable instanceof SQLException){
this.code= "1008";
this.message="数据库异常:"+throwable;
}else if(throwable instanceof ArithmeticException){
this.code= "1009";
this.message="算术运算异常:"+throwable;
}else if(throwable instanceof RuntimeException){
this.code= "1010";
this.message="运行时异常:"+throwable;
}else if(throwable instanceof Exception){
logger.error("未知异常:"+throwable);
this.code= "9999";
this.message="未知异常"+throwable;
}
}
}
generator生成器
package com.emep.mall.admin.generator;
import com.github.mybatis.fl.entity.BasisInfo;
import com.github.mybatis.fl.util.EntityInfoUtil;
import com.github.mybatis.fl.util.Generator;
import com.github.mybatis.fl.util.MySqlToJavaUtil;
import java.sql.SQLException;
import java.util.Date;
/**
* @ClassName: MyGenerator
* @Description:
* @Author: BYP <[email protected]>
* @Date: 2020/9/25 23:04
* @Copyright: 2019 www.tydic.com Inc. All rights reserved.
* 注意:本内容仅限于弘毅天承信息技术股份有限公司内部传阅,禁止外泄以及用于其他的商业目
*/
/**
* Copyright: Copyright (c) 2019
*
* 说明: 自动生成工具
* 源码地址:https://gitee.com/flying-cattle/mybatis-dsc-generator
*/
public class MyGenerator {
// 基础信息:项目名、作者、版本
public static final String PROJECT = "wallet-sign";
public static final String AUTHOR = "BianPeng";
public static final String VERSION = "V1.0";
// 数据库连接信息:连接URL、用户名、秘密、数据库名
public static final String URL = "jdbc:mysql://127.0.0.1:3306/buybit_wallet_sign?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=UTC";
public static final String NAME = "root";
public static final String PASS = "root";
public static final String DATABASE = "buybit_wallet_sign";
// 类信息:类名、对象名(一般是【类名】的首字母小些)、类说明、时间
public static final String CLASSNAME = "CollectionRoute";
public static final String TABLE = "user";
public static final String CLASSCOMMENT = "用户";
public static final String TIME = "2019年6月12日";
public static final String AGILE = new Date().getTime() + "";
// 路径信息,分开路径方便聚合工程项目,微服务项目
public static final String ENTITY_URL = "com.emep.mall.admin.entity";
public static final String DAO_URL = "com.emep.mall.admin.dao";
public static final String XML_URL = "com.emep.mall.admin.dao.impl";
public static final String SERVICE_URL = "com.emep.mall.admin.service";
public static final String SERVICE_IMPL_URL = "com.emep.mall.admin.service.impl";
public static final String CONTROLLER_URL = "com.emep.mall.admin.web";
//是否是Swagger配置
public static final String IS_SWAGGER = "true";
public static void main(String[] args) {
BasisInfo bi = new BasisInfo(PROJECT, AUTHOR, VERSION, URL, NAME, PASS, DATABASE, CLASSNAME, AGILE, ENTITY_URL, DAO_URL, XML_URL, SERVICE_URL, SERVICE_IMPL_URL, CONTROLLER_URL);
bi.setTable(TABLE);
bi.setEntityName(MySqlToJavaUtil.getClassName(TABLE));
bi.setObjectName(MySqlToJavaUtil.changeToJavaFiled(TABLE));
bi.setEntityComment(CLASSCOMMENT);
try {
bi = EntityInfoUtil.getInfo(bi);
String fileUrl = "D:\\software\\workspace\\idea\\admin\\src\\main\\java\\";// 生成文件存放位置
//开始生成文件
String aa1 = Generator.createEntity(fileUrl, bi).toString();
String aa2 = Generator.createDao(fileUrl, bi).toString();
String aa3 = Generator.createDaoImpl(fileUrl, bi).toString();
String aa4 = Generator.createService(fileUrl, bi).toString();
String aa5 = Generator.createServiceImpl(fileUrl, bi).toString();
String aa6 = Generator.createController(fileUrl, bi).toString();
System.out.println(aa1);
System.out.println(aa2); System.out.println(aa3); System.out.println(aa4);
System.out.println(aa5); System.out.println(aa6);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
如果你生成的分页的方法不能分页:根据官方提升,记得在启动类中加入
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
项目最后的结果给大家展示一下: