1、controller
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import io.swagger.annotations.ApiOperation;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import lombok.extern.slf4j.Slf4j;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.github.pagehelper.PageInfo;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表控制层
*
* @author $!author
* @since $!time.currTime()
*/
@Slf4j
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
@Api(tags = "$!tool.firstLowerCase($tableInfo.name)管理")
public class $!{tableName} {
/**
* 服务对象
*/
@Resource
private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;/**
* 分页查询
*
* @param page 筛选分页
* @param size 分页大小
* @return 查询结果
*/
@GetMapping("page")
@ApiOperation("$!{tableInfo.name}分页查询")
public R<PageInfo<$!{tableInfo.name}>> queryByPage(@RequestParam(value = "page", required = true,defaultValue = "1") Integer page,
@RequestParam(value = "size", required = true,defaultValue = "10")Integer size) {
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.queryByPage(page ,size));
}/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
@ApiOperation("$!{tableInfo.name}ID查询")
public R<$!{tableInfo.name}> queryById(@PathVariable("id") Integer id) {
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.queryById(id));
}/**
* 新增数据
*
* @param $!{tool.firstLowerCase($tableInfo.name)} 实体
* @return 新增结果
*/
@PostMapping("add")
@ApiOperation("$!{tableInfo.name}添加")
public R<$!{tableInfo.name}> add(@RequestBody $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.insert($!{tool.firstLowerCase($tableInfo.name)}));
}/**
* 编辑数据
*
* @param $!{tool.firstLowerCase($tableInfo.name)} 实体
* @return 编辑结果
*/
@PutMapping("update")
@ApiOperation("$!{tableInfo.name}修改")
public R<$!{tableInfo.name}> update(@RequestBody $!{tableInfo.name} $!{tool.firstLowerCase($tableInfo.name)}) {
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.update($!{tool.firstLowerCase($tableInfo.name)}));
}/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping("delete/{id}")
@ApiOperation("$!{tableInfo.name}ID删除")
public R deleteById(@PathVariable("id") Integer id) {
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.deleteById(id));
}}
2、service
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import com.github.pagehelper.PageInfo;/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务接口
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} {/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
R queryById(Integer id);/**
* 分页查询
*
* @param page 分页
* @param size 分页大小
* @return 查询结果
*/
R queryByPage(Integer page ,Integer size);/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
R insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
R update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
R deleteById(Integer id);}
3、serviceImpl
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
*
* @author $!author
* @since $!time.currTime()
*/
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} implements $!{tableInfo.name}Service {
@Resource
private $!{tableInfo.name}Dao $!tool.firstLowerCase($!{tableInfo.name})Dao;
QueryWrapper<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})QueryWrapper = new QueryWrapper<>();
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
@Override
public R queryById(Integer id) {
$!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})s = $!tool.firstLowerCase($!{tableInfo.name})Dao.selectById(id);
if(Objects.nonNull($!tool.firstLowerCase($!{tableInfo.name})s)){
return R.ok($!tool.firstLowerCase($!{tableInfo.name})s);
}
return R.fail("查询失败");
}/**
* 分页查询
*
* @param page 筛选条件
* @param size 分页对象
* @return 查询结果
*/
@Override
public R<PageInfo<$!{tableInfo.name}>> queryByPage(Integer page,Integer size) {
PageHelper.startPage(page, size);
List<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})s = $!tool.firstLowerCase($!{tableInfo.name})Dao.selectAll();
if(Objects.nonNull($!tool.firstLowerCase($!{tableInfo.name})s)) {
PageInfo<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})info = new PageInfo<>($!tool.firstLowerCase($!{tableInfo.name})s);
return R.ok($!tool.firstLowerCase($!{tableInfo.name})info);
}
return R.fail("查询失败");
}/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public R insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
int i = $!{tool.firstLowerCase($!{tableInfo.name})}Dao.insert($!tool.firstLowerCase($!{tableInfo.name}));
if(i > 0){
return R.ok("插入成功");
}
return R.fail("插入失败");
}/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public R update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
int i = $!{tool.firstLowerCase($!{tableInfo.name})}Dao.updateById($!tool.firstLowerCase($!{tableInfo.name}));
if(i > 0){
return R.ok("修改成功");
}
return R.fail("修改失败");
}/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
@Override
public R deleteById(Integer id) {int i = $!{tool.firstLowerCase($!{tableInfo.name})}Dao.deleteById(id);
if(i > 0){
return R.ok("删除成功");
}
return R.fail("删除失败");
}
}
4、dao
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Dao"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
@Mapper
public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}> {
@Select("SELECT * FROM $!tableInfo.obj.name")
List<$!{tableInfo.name}> selectAll();
}
5、entity
##引入宏定义
$!{define.vm}##使用宏定义设置回调(保存位置与文件后缀)
#save("/entity", ".java")##使用宏定义设置包后缀
#setPackageSuffix("entity")##使用全局变量实现默认包导入
$!{autoImport.vm}
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;##使用宏定义实现类注释信息
#tableComment("实体类")
public class $!{tableInfo.name} implements Serializable {
private static final long serialVersionUID = $!tool.serial();
/**
id一定要修改自增
@TableId(value="字段_id",type = IdType.AUTO)
时间类加上注解
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@DateTimeFormat(pattern ="yyyy-MM-dd")传入的时间格式 yyyy-MM-dd HH:mm:ss
*/
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})/**
* ${column.comment}
*/#end@TableId("$!column.obj.name")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end}
6、pom依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.feiyue</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>demo</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- AOP依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency> <!-- hutool工具包 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.10</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.4</version> </dependency> <!--jjwt--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- 分页插件的依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.3</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> <!-- 需要引入jackson本质原因是因为redis使用了json序列化 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
7、application.yml
server: address: localhost port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/proj?characterEncoding=utf-8&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mvc: pathmatch: # Springfox??????????AntPathMatcher? matching-strategy: ant_path_matcher mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
8、R
package com.example.demo.utils; import lombok.Data; import java.io.Serializable; /** * @author 徐亚飞 * @date 2023/2/8 11:43 */ @Data public class R <T> implements Serializable { private Integer code; private String msg; private T data; public static Integer SUCCESS = 200; public static Integer FAIL = -1; public R() { } private R(Integer code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } public static <T> R ok(Integer code, String msg, T data) { return new R(code, msg, data); } public static <T> R ok(T data) { return ok(SUCCESS, "请求成功", data); } public static <T> R ok() { return ok(null); } public static <T> R fail(Integer code, String msg, T data) { return new R(code, msg, data); } public static <T> R fail(T data) { return fail(FAIL, "请求失败", data); } public static <T> R fail() { return fail(null); } }
9、Knife4jConfiguration.java knife4配置类
package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class Knife4jConfiguration { @Bean(value = "defaultApi2") public Docket defaultApi2() { String groupName = "3.X版本"; Docket docket = new Docket(DocumentationType.OAS_30) .apiInfo(new ApiInfoBuilder() .title("这是knife4j API ") .description("# 这里记录服务端所有的接口的入参,出参等等信息") .termsOfServiceUrl("xxxxxxxxxx") .contact(new Contact("大飞哥", "xxxxxx", "x761838288@163.com")) .version("3.0") .build()) //分组名称 .groupName(groupName) .select() //这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller 控制成路径")) .paths(PathSelectors.any()) .build(); return docket; } }
10、WebMvcConfigurer.java 配置类
package com.example.demo.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * @author Andon * 2021/12/29 */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurationSupport { /** * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations( "classpath:/static/"); registry.addResourceHandler("swagger-ui.html", "doc.html").addResourceLocations( "classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations( "classpath:/META-INF/resources/webjars/"); super.addResourceHandlers(registry); } }