mysql8+mybatis-plus3.1自动生成lombok和swagger和增删改查接口

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

<dependency>
 <groupId>com.github.flying-cattle</groupId>
 <artifactId>mybatis-dsc-generator</artifactId>
 <version>2.1.0.RELEASE</version>
</dependency>

3.0.0版本是集成了Mybatis-plus版本——源码分支mybatisPlus

<dependency>
 <groupId>com.github.flying-cattle</groupId>
 <artifactId>mybatis-dsc-generator</artifactId>
 <version>3.0.0.RELEASE</version>
</dependency>

数据表结构样式

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:Order 2018年7月5日
 * @project deal-center V1.0
 * Copyright(c) 2018 BianP Co. Ltd. 
 * All right reserved. 
 */
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 
 * 
 * <p>说明: 用户实体类</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date 	Author Version Description
 *---------------------------------------------------------------*
 * 2019年4月9日 BianPeng V1.0 initialize
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User extends Model<User> {
 private static final long serialVersionUID = 1L;
 @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 = "用户状态")
 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 = "loginIp" , value = "登录地址")
 private String loginAddr;

 @Override
 protected Serializable pkVal() {
 return this.id;
 }
}

DAO

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import com.xin.usercenter.entity.User;
/** 
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 用户数据访问层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date 	Author Version Description
 *---------------------------------------------------------------*
 * 2019年4月9日 BianPeng V1.0 initialize
 */
@Mapper
public interface UserDao extends BaseMapper<User> {

}

生成的XML

<?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.xin.usercenter.dao.UserDao">
	<resultMap id="BaseResultMap" type="com.xin.usercenter.entity.User">
		<id column="id" property="id" />
		<id column="login_name" property="loginName" />
		<id column="password" property="password" />
		<id column="nickname" property="nickname" />
		<id column="type" property="type" />
		<id column="state" property="state" />
		<id column="note" property="note" />
		<id column="create_time" property="createTime" />
		<id column="update_time" property="updateTime" />
		<id column="update_uid" property="updateUid" />
		<id column="login_ip" property="loginIp" />
		<id column="login_addr" property="loginAddr" />
	</resultMap>
	<sql id="Base_Column_List">
		id, login_name, password, nickname, type, state, note, create_time, update_time, update_uid, login_ip, login_addr
	</sql>
</mapper>

生成的SERVICE

import com.xin.usercenter.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/** 
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 用户服务层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date 	Author Version Description
 *------------------------------------------------------------*
 * 2019年4月9日 BianPeng V1.0 initialize
 */
public interface UserService extends IService<User> {

}

生成的SERVICE_IMPL

import com.xin.usercenter.entity.User;
import com.xin.usercenter.dao.UserDao;
import com.xin.usercenter.service.UserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/** 
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 用户服务实现层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date 	Author Version Description
 *------------------------------------------------------------*
 * 2019年4月9日 BianPeng V1.0 initialize
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

}

生成的CONTROLLER

import com.item.util.JsonResult;
import com.xin.usercenter.entity.User;
import com.xin.usercenter.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 
 * 
 * <p>说明: 用户API接口层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date 	Author Version Description
 *---------------------------------------------------------------*
 * 2019年4月9日 BianPeng V1.0 initialize
 */
@Api(description = "用户",value="用户" )
@RestController
@RequestMapping("/user")
public class UserController {
 Logger logger = LoggerFactory.getLogger(this.getClass());

 @Autowired
 public UserService userServiceImpl;

 /**
 * @explain 查询用户对象 <swagger GET请求>
 * @param 对象参数:id
 * @return user
 * @author BianPeng
 * @time 2019年4月9日
 */
 @GetMapping("/getUserById/{id}")
 @ApiOperation(value = "获取用户信息", notes = "获取用户信息[user],作者:BianPeng")
 @ApiImplicitParam(paramType="path", name = "id", value = "用户id", required = true, dataType = "Long")
 public JsonResult<User> getUserById(@PathVariable("id")Long id){
 	JsonResult<User> result=new JsonResult<User>();
 	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<User>(e);
 	}
 	return result;
 }
 /**
 * @explain 添加或者更新用户对象
 * @param 对象参数:user
 * @return int
 * @author BianPeng
 * @time 2019年4月9日
 */
 @PostMapping("/insertSelective")
 @ApiOperation(value = "添加用户", notes = "添加用户[user],作者:BianPeng")
 public JsonResult<User> insertSelective(User user){
 	JsonResult<User> result=new JsonResult<User>();
 	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<User>(e);
	 }
 return result;
 }

 /**
 * @explain 删除用户对象
 * @param 对象参数:id
 * @return int
 * @author BianPeng
 * @time 2019年4月9日
 */
 @PostMapping("/deleteByPrimaryKey")
 @ApiOperation(value = "删除用户", notes = "删除用户,作者:BianPeng")
 @ApiImplicitParam(paramType="query", name = "id", value = "用户id", required = true, dataType = "Long")
 public JsonResult<Object> deleteByPrimaryKey(Long id){
 	JsonResult<Object> result=new JsonResult<Object>();
	 try {
	 	boolean reg=userServiceImpl.removeById(id);
	 	if (reg) {
 			result.setType("success");
 			result.setMessage("成功");
 			result.setData(id);
 		} else {
 			logger.error("删除用户失败ID:"+id);
 			result.setType("fail");
 			result.setMessage("执行错误,请稍后重试");
 		}
 	} catch (Exception e) {
 		logger.error("删除用户执行异常:"+e.getMessage());
 		result=new JsonResult<Object>(e);
 	}
 	return result;
	}

	/**
	 * @explain 分页条件查询用户 
	 * @param 对象参数:AppPage<User>
	 * @return PageInfo<User>
	 * @author BianPeng
	 * @time 2019年4月9日
	 */
	@GetMapping("/getUserPages")
	@ApiOperation(value = "分页查询", notes = "分页查询返回对象[IPage<User>],作者:边鹏")
	@ApiImplicitParams({
 @ApiImplicitParam(paramType="query", name = "pageNum", value = "当前页", required = true, dataType = "int"),
 @ApiImplicitParam(paramType="query", name = "pageSize", value = "页行数", required = true, dataType = "int")
 })
	public JsonResult<Object> getUserPages(Integer pageNum,Integer pageSize){

		JsonResult<Object> result=new JsonResult<Object>();
		Page<User> page=new Page<User>(pageNum,pageSize);
		QueryWrapper<User> queryWrapper =new QueryWrapper<User>();
		//分页数据
		try {
			//List<User> list=userServiceImpl.list(queryWrapper); 
			IPage<User> pageInfo=userServiceImpl.page(page, queryWrapper);
			result.setType("success");
			result.setMessage("成功");
			result.setData(pageInfo);
		} catch (Exception e) {
			logger.error("分页查询用户执行异常:"+e.getMessage());
			result=new JsonResult<Object>(e);
		}
		return result;
	}
}

生成完毕,控制器中的JsonResult

import java.io.Serializable;
import java.net.ConnectException;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** 
 * Copyright: Copyright (c) 2019 
 * 
 * <p>说明: 用户服务层</P>
 * @version: V1.0
 * @author: BianPeng
 * 
 * Modification History:
 * Date Author Version Description
 *---------------------------------------------------------*
 * 2019/4/9 	flying-cattle V1.0 initialize
 */
public class JsonResult<T> implements Serializable{

	Logger logger = LoggerFactory.getLogger(this.getClass());
	private static final long serialVersionUID = 1071681926787951549L;
	/**
 * <p>返回状态</p>
 */
 private Boolean isTrue=true;
 /**
 *<p> 状态码</p>
 */
 private String code;
 /**
 * <p>业务码</p>
 */
 private String type;
 /**
 *<p> 状态说明</p>
 */
 private String message;
 /**
 * <p>返回数据</p>
 */
 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;
 }
 /**
 * <p>返回成功</p>
 * @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;
 }
 }
}

如果你生成的分页的方法不能分页:根据官方提升,记得在启动类中加入

@Bean
public PaginationInterceptor paginationInterceptor() {
 return new PaginationInterceptor();
}

mysql8+mybatis-plus3.1自动生成lombok和swagger和增删改查接口

作者:边鹏_尛爺鑫

原文:https://my.oschina.net/bianxin/blog/3035352