2019独角兽企业重金招聘Python工程师标准>>>
mybatis-dsc-generator
还在为写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
<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;@Overrideprotected 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());@Autowiredpublic 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();
}