org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.3.2
com.github.pagehelper
pagehelper
4.1.0
com.baomidou
mybatis-plus-generator
3.4.1
org.apache.velocity
velocity-engine-core
2.2
com.alibaba
druid-spring-boot-starter
1.1.22
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
package com.dev.mybatisPlus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName : CodeGenerator 类名
* @Description : 描述
*/
public class CodeGenerator {
public static void main(String[] args) throws InterruptedException {
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/springboot-mybatis-plus/src/main/java");
gc.setFileOverride(true);
gc.setActiveRecord(true);
// XML 二级缓存
gc.setEnableCache(false);
// XML ResultMap
gc.setBaseResultMap(true);
// XML columList
gc.setBaseColumnList(true);
gc.setOpen(false);
gc.setSwagger2(true);
gc.setAuthor("admin");
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setMapperName("%sDao");
gc.setXmlName("%sMapper");
gc.setServiceName("%sService");
gc.setServiceImplName("%sImpl");
gc.setControllerName("%sController");
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
// 这里以mysql为例
dsc.setDbType( DbType.MYSQL);
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUrl("jdbc:mysql://数据库地址:端口/数据库名称?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
dsc.setUsername("数据库登录名");
dsc.setPassword("数据库密码");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.dev.mybatisPlus")
.setController( "controller")
.setEntity( "entity" )
.setService("service")
.setServiceImpl("service.impl")
.setMapper("mapper");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/vm/mapper.xml.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/springboot-mybatis-plus/src/main/resources/mybatis/"
+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
focList.add(new FileOutConfig("/templates/vm/controller.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/springboot-mybatis-plus/src/main/java/com/dev/mybatisPlus/controller/"
+ tableInfo.getEntityName() + "Controller" + StringPool.DOT_JAVA;
}
});
focList.add(new FileOutConfig("/templates/vm/entity.java.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/springboot-mybatis-plus/src/main/java/com/dev/mybatisPlus/entity/"
+ tableInfo.getEntityName() + StringPool.DOT_JAVA;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
//templateConfig.setXml("\\templates\\vm\\mapper.xml");
templateConfig.setXml(null);
templateConfig.setController("/templates/vm/controller.java");
templateConfig.setEntity("/templates/vm/entity.java");
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
//此处可以修改为您的表前缀
strategy.setTablePrefix(new String[] { ""});
// 表名生成策略
strategy.setNaming(NamingStrategy.underline_to_camel);
// 需要生成的表
strategy.setInclude(new String[] { "user" });
// 排除生成的表
//strategy.setExclude(new String[]{"test"});
strategy.setSuperControllerClass("com.dev.mybatisPlus.controller.BaseController");
strategy.setEntityLombokModel( true );
mpg.setStrategy(strategy);
// 执行生成
mpg.execute();
}
}
package com.dev.mybatisPlus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.github.pagehelper.PageHelper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.Properties;
/**
* @ClassName : MybatisPlusConfig //类名
* @Description : //描述
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.dev.mybatisPlus.mapper")
public class MybatisPlusConfig {
/**
* mybatis-plus分页插件
*/
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
//配置mybatis的分页插件pageHelper
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum","true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
//配置mysql数据库的方言
properties.setProperty("dialect","mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
server:
port: 80
servlet:
contest-path: /
spring:
application:
name: springboot-mybatis-plus
jackson:
#参数意义:
#JsonInclude.Include.ALWAYS 默认
#JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化
#JsonInclude.Include.NON_EMPTY 属性为 空(””) 或者为 NULL 都不序列化
#JsonInclude.Include.NON_NULL 属性为NULL 不序列化
default-property-inclusion: ALWAYS
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
serialization:
WRITE_DATES_AS_TIMESTAMPS: false
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库地址:数据库端口/数据库名称?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: 数据库登录名
password: 数据库密码
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# mybatis-plus相关配置
mybatis-plus:
# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
mapper-locations: classpath*:mybatis/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dev.mybatisPlus.entity
# 以下配置均有默认值,可以不设置
global-config:
#刷新mapper 调试神器
refresh-mapper: true
db-config:
field-strategy: not_empty
#数据库类型
db-type: mysql
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: auto
#驼峰下划线转换
db-column-underline: true
#数据库大写下划线转换
capital-mode: true
#序列接口实现类配置
#key-generator: com.baomidou.springboot.xxx
#逻辑删除配置
#logic-delete-field: deleteFlag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
#logic-delete-value: 1 # 逻辑已删除值(默认为 1)
#logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
#自定义填充策略接口实现
# meta-object-handler: com.zhengqing.config.MyMetaObjectHandler
#自定义SQL注入器
#sql-injector: com.baomidou.springboot.xxx
configuration:
# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
map-underscore-to-camel-case: true
cache-enabled: false
# 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
# call-setters-on-nulls: true
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 解决oracle更新数据为null时无法转换报错,mysql不会出现此情况
jdbc-type-for-null: 'null'
package $!{package.Controller};
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dev.mybatisPlus.util.AjaxResult;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import com.github.pagehelper.PageHelper;
import com.dev.mybatisPlus.util.page.PageDomain;
import com.dev.mybatisPlus.util.page.TableDataInfo;
import java.util.Objects;
import $!{package.Service}.$!{table.serviceName};
import $!{package.Entity}.$!{table.entityName};
#if(${superControllerClassPackage})
import $!{superControllerClassPackage};
#end
/**
*
* $!{table.comment} 前端控制器
*
* @author: $!{author}
* @date: $!{date}
*/
@RestController
@RequestMapping({"#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end"})
#if(${kotlin})
class $!{table.controllerName}#if(${superControllerClass}) : $!{superControllerClass}()#end
#else
@Api(tags = "$!{table.comment}管理")
#if(${superControllerClass})
public class $!{table.controllerName} extends $!{superControllerClass} {
#else
public class $!{table.controllerName} {
#end
@Autowired
private $!{table.serviceName} service;
@GetMapping({"list"})
public TableDataInfo list($!{table.entityName} entity,PageDomain pageDomain){
PageHelper.startPage(CheckPageDomain(pageDomain));
QueryWrapper<$!{table.entityName}> qw = new QueryWrapper<$!{table.entityName}>();
qw.setEntity(entity)#foreach($field in ${table.fields})#if(${field.keyFlag}).orderByAsc("$!{field.name}");#end#end
return getDataTable(service.list(qw));
}
@GetMapping({"/getOne/{id}"})
public AjaxResult getById(@PathVariable("id") int id) {
return success("查询成功!",service.getById(id));
}
@PostMapping({"save"})
public AjaxResult save(@RequestBody @Valid $!{table.entityName} entity) {
return super.toAjax(service.save(entity));
}
@PutMapping({"update"})
public AjaxResult update(@RequestBody $!{table.entityName} entity) {
#foreach($entity in ${table.fields})
#if(${entity.keyFlag})##生成主键排在第一位
#set($getId = "entity.get" + $entity.propertyName.substring(0, 1).toUpperCase() + $entity.propertyName.substring(1) + "()")
if(Objects.isNull($getId)){
return error("参数为空!");
}
var result = service.getById($getId);
#end
#end
if(Objects.nonNull(result)){
return super.toAjax(service.updateById(entity));
}else{
return error("数据不存在!");
}
}
@DeleteMapping({"/remove/{id}"})
public AjaxResult remove(@PathVariable("id") int id) {
var entity = service.getById(id);
if(Objects.nonNull(entity)){
return super.toAjax(service.removeById(id));
}else{
return error("数据不存在!");
}
}
}
#end
生成大概是酱紫
AjaxResult、BaseController等本文出现的工具类会在本章末尾会贴出来
package ${package.Entity};
#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
import com.fasterxml.jackson.annotation.JsonFormat;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
## 表备注,作者,日期
/**
* $!{table.comment}
* @author ${author}
* @date ${date}
*/
#if(${entityLombokModel})
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity} extends Model<${entity}> {
#else
public class ${entity} implements Serializable {
#end
private static final long serialVersionUID = 1L;
## ---------- BEGIN 字段循环遍历 ----------
#foreach($field in ${table.fields})
#if($field.propertyType == "Integer" || $field.propertyType == "int")
#if(${field.keyFlag})
#if($field.comment == "")
/**
* ${field.name}
*/
#else
/**
* ${field.comment}
*/
#end
#if(${field.keyIdentityFlag})
@TableId(value = "${field.name}", type = IdType.AUTO)
#elseif(!$null.isNull(${idType}) && "$!idType" != "")
@TableId(value = "${field.name}", type = IdType.${idType})
#elseif(${field.convert})
@TableId("${field.name}")
#end
#else
/**
* ${field.comment}
*/
#end
#elseif($field.propertyType == "LocalDateTime")
/**
* ${field.comment}
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
#else
/**
* ${field.comment}
*/
#end
private ${field.propertyType} ${field.propertyName};
#end
#if(${activeRecord})
@Override
protected Serializable pkVal(){
#foreach($field in ${table.fields})
#if(${field.keyFlag})
return this.${field.propertyName};
#end
#end
}
#end
}
生成大概是酱紫
#if(${enableCache})
#end
#if(${baseResultMap})
#foreach($field in ${table.fields})
#if(${field.keyFlag})##生成主键排在第一位
#end
#end
#foreach($field in ${table.commonFields})##生成公共字段
#end
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
#end
#end
#end
#if(${baseColumnList})
#foreach($field in ${table.commonFields})
${field.name},
#end
${table.fieldNames}
#end
#foreach($field in ${table.fields})
#if(${field.name} == "delete_flag")
update ${table.name} set delete_flag = '1' where id = #{id}
#end
#end
生成大概是酱紫
注意:以上文件均需要根据自己项目的需求稍作修改才能正常使用
以下工具类根据自己项目需求参考使用
package com.dev.mybatisPlus.util;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 操作消息提醒
*
*/
public class AjaxResult extends HashMap
{
private static final long serialVersionUID = 1L;
/** 状态码 */
public static final String CODE_TAG = "code";
/** 返回内容 */
public static final String MSG_TAG = "msg";
/** 数据对象 */
public static final String DATA_TAG = "data";
/**
* 状态类型
*/
public enum Type
{
/** 成功 */
SUCCESS(0),
/** 警告 */
WARN(301),
/** 错误 */
ERROR(500);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
/**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/
public AjaxResult()
{
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param type 状态类型
* @param msg 返回内容
*/
public AjaxResult(Type type, String msg)
{
super.put(CODE_TAG, type.value);
super.put(MSG_TAG, msg);
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param type 状态类型
* @param msg 返回内容
* @param data 数据对象
*/
public AjaxResult(Type type, String msg, Object data)
{
super.put(CODE_TAG, type.value);
super.put(MSG_TAG, msg);
if (Objects.nonNull(data))
{
super.put(DATA_TAG, data);
}
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static AjaxResult success()
{
return AjaxResult.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static AjaxResult success(Object data)
{
return AjaxResult.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static AjaxResult success(String msg)
{
return AjaxResult.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(Type.SUCCESS, msg, data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(String msg, List> data)
{
return new AjaxResult(Type.SUCCESS, msg, data);
}
/**
* 返回成功消息
*
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(List> data)
{
return new AjaxResult(Type.SUCCESS, "查询成功!", data);
}
/**
* 返回成功消息
*
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(Map data)
{
return new AjaxResult(Type.SUCCESS, "查询成功!", data);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult warn(String msg)
{
return AjaxResult.warn(msg, null);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult warn(String msg, Object data)
{
return new AjaxResult(Type.WARN, msg, data);
}
/**
* 返回错误消息
*
* @return
*/
public static AjaxResult error()
{
return AjaxResult.error("操作失败");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(String msg)
{
return AjaxResult.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult error(String msg, Object data)
{
return new AjaxResult(Type.ERROR, msg, data);
}
}
package com.dev.mybatisPlus.controller;
import com.dev.mybatisPlus.util.AjaxResult;
import com.dev.mybatisPlus.util.page.PageDomain;
import com.dev.mybatisPlus.util.page.TableDataInfo;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
/**
* web层通用数据处理
*
*/
@Slf4j
public class BaseController
{
/**
* 设置默认分页页码
* @param pageDomain
* @return PageDomain
*/
protected PageDomain CheckPageDomain(PageDomain pageDomain) {
if (pageDomain.getPageNum() == null || pageDomain.getPageNum() < 1) {
pageDomain.setPageNum(1);
}
if (pageDomain.getPageSize() == null || pageDomain.getPageSize() < 1) {
pageDomain.setPageSize(10);
}
return pageDomain;
}
/**
* asc or desc
* @param oderby
* @return boolean
*/
protected boolean orderByCheck(String oderby){
if (oderby.isBlank() || "asc".equals(oderby)){
return true;
}else {
return false;
}
}
/**
* 响应请求分页数据
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
protected TableDataInfo getDataTable(List> list)
{
PageInfo pi = new PageInfo(list);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(0);
rspData.setMsg("查询成功!");
rspData.setRows(list);
rspData.setTotal(pi.getTotal());
rspData.setPages(pi.getPages());
rspData.setPageNum(pi.getPageNum());
rspData.setPageSize(pi.getPageSize());
return rspData;
}
/**
* 响应返回结果
*
* @param rows 影响行数
* @return 操作结果
*/
protected AjaxResult toAjax(int rows)
{
return rows > 0 ? success() : error();
}
/**
* 响应返回结果
*
* @param result 结果
* @return 操作结果
*/
protected AjaxResult toAjax(boolean result)
{
return result ? success() : error();
}
/**
* 响应返回结果
*
* @param result 结果
* @return 操作结果
*/
protected AjaxResult check(int result)
{
return result > 0 ? AjaxResult.success(false) : AjaxResult.success(true);
}
/**
* 返回成功
*/
public AjaxResult success()
{
return AjaxResult.success();
}
/**
* 返回失败消息
*/
public AjaxResult error()
{
return AjaxResult.error();
}
/**
* 返回成功消息
*/
public AjaxResult success(String message)
{
return AjaxResult.success(message);
}
/**
* 返回成功消息
*/
public AjaxResult success(Object data)
{
return AjaxResult.success(data);
}
/**
* 返回成功消息
*/
public AjaxResult success(String message,Object data)
{
return AjaxResult.success(message,data);
}
/**
* 返回失败消息
*/
public AjaxResult error(String message)
{
return AjaxResult.error(message);
}
/**
* 返回错误码消息
*/
public AjaxResult error(AjaxResult.Type type, String message)
{
return new AjaxResult(type, message);
}
/**
* 页面跳转
*/
public String redirect(String url)
{
return redirect(url);
}
/**
* 获取配置文件参数
* */
public String getConfigValue(String key)
{
String val = null;
String path = File.separator + "application.yml";
ClassPathResource resource = new ClassPathResource(path);
try
{
Properties props = PropertiesLoaderUtils.loadProperties(resource);
val = (String)props.get(key);
}
catch (IOException e)
{
e.printStackTrace();
}
return val;
}
}
package com.dev.mybatisPlus.util.page;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
/**
* 分页数据
*
*/
@Data
public class PageDomain implements Serializable
{
/** 当前记录起始索引 */
@TableField(exist = false)
private Integer pageNum;
/** 每页显示记录数 */
@TableField(exist = false)
private Integer pageSize;
/** 排序列 */
@TableField(exist = false)
private String orderByColumn;
/** 排序的方向 "desc" 或者 "asc". */
@TableField(exist = false)
private String isAsc;
}
package com.dev.mybatisPlus.util.page;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 表格分页数据对象
*
*/
@Data
public class TableDataInfo implements Serializable
{
private static final long serialVersionUID = 1L;
/** 总记录数 */
@TableField(exist = false)
private long total;
/** 总页数 */
@TableField(exist = false)
private int pages;
/** 当前页 */
@TableField(exist = false)
private int pageNum;
/** 当前页记录数 */
@TableField(exist = false)
private int pageSize;
/** 列表数据 */
@TableField(exist = false)
private List> rows;
/** 消息状态码 */
@TableField(exist = false)
private int code;
/** 消息内容 */
@TableField(exist = false)
private String msg;
/**
* 表格数据对象
*/
public TableDataInfo()
{
}
/**
* 分页
*
* @param list 列表数据
* @param total 总记录数
*/
public TableDataInfo(List> list, int total, int pages)
{
this.rows = list;
this.total = total;
this.pages = pages;
}
}
官方文档:https://mybatis.plus/guide/annotation.html#tablename
GitHub:传送门