1. 新建项目
2. 文件结构
- xxxApplication【主启动类,负责启动项目(一般无需修改)】
- config【配置类包,负责添加项目的配置(一般无需修改)】
- util【工具类包,负责封装类作常用工具(一般无需修改)】
- handler【处理类包,用来配置数据的自动处理(可有可无,一般无需修改)】
- exception【异常类包,用来自定义异常(可有可无)】
- entity【实体类包,用来映射数据库表】
- dao【DAO(Data Access Object)数据访问对象,dao 层处理从数据库返回的数据】
- service【service 层处理 dao 层得到的数据,然后传递给 controller 层】
- controller【controller 层处理 service 层得到的数据,然后传递给前端】
3. 搭建环境
3.1. pom.xml
<!-- springboot 版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- java 版本-->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok 插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- 分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 代码生成器-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!-- 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2. 配置文件
注意修改自己的数据库表和数据库密码
src/main/resources/application.yml
#启动端口
server:
port: 8081
#数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
#返回json的全局时间格式
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath*:/xml/**Mapper.xml
global-config:
db-config:
# 全局配置主键策略 @TableId
id-type: ID_WORKER_STR
logic-delete-value: 1
logic-not-delete-value: 0
3.3. 启动类
com/test/TestProApplication.java
/**
* 启动类
*/
@MapperScan(value="com.edu.mapper")
@SpringBootApplication
public class TestProApplication {
public static void main(String[] args) {
SpringApplication.run(TestProApplication.class, args);
}
}
3.4. 前置处理
都要加包名 勿忘!!!!!!!!
3.4.1. 工具类包
com/test/util/R.java
/**
* 返回结果类
*/
@Data
public class R implements Serializable {
/**
* 成功
*/
public static Integer SUCCESS = 20000;
/**
* 失败
*/
public static Integer ERROR = 20001;
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Map<String, Object> data = new HashMap<String, Object>();
/**
* 把构造方法私有
*/
private R() {}
/**
* 成功静态方法
* @return
*/
public static R ok() {
R r = new R();
r.setSuccess(true);
r.setCode(SUCCESS);
r.setMessage("成功");
return r;
}
/**
* 失败静态方法
* @return
*/
public static R error() {
R r = new R();
r.setSuccess(false);
r.setCode(ERROR);
r.setMessage("失败");
return r;
}
public R success(Boolean success){
this.setSuccess(success);
return this;
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(String key, Object value){
this.data.put(key, value);
return this;
}
public R data(Map<String, Object> map){
this.setData(map);
return this;
}
}
3.4.2. 配置类包
com/test/config/CorsConfig.java
/**
* 解决跨域问题
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
com/test/config/SwaggerConfig.java
/**
* Swagger2 配置类
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("项目中心API文档")
.description("本文档描述了项目中心微服务接口定义")
.version("1.0")
.contact(new Contact("java", "http://test.com", "123456789@qq.com"))
.build();
}
}
3.4.3. 处理类包
com/test/handler/MyMetaObjectHandler.java
/**
* 自动填充类
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 使用mp实现添加方法时自动执行
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
/**
* 使用mp实现修改方法时自动执行
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
4. 用户业务
com/test/controller/UserController.java
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/login")
public R login() {
return R.ok().data("token","admin");
}
@GetMapping("/info")
public R info() {
return R.ok().data("roles","[admin]").data("name","admin").data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
}
@PostMapping("/logout")
public R logout() {
return R.ok();
}
}
4.1自动填充代码
在测试类中的java的最下面建立CodeGenerator 下面很多东西都要改 勿忘!!!!!!!!!
package com.edu;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
public class CodeGenerator {
@Test
public void run() {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir("E:\\boot_project\\boot_test" + "/src/main/java");
gc.setAuthor("wu");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(false); //重新生成时文件是否覆盖
//UserServie
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.ID_WORKER_STR); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/edu?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("edu"); //模块名
//包 com.bentkweb.eduservice
pc.setParent("com");
//包 com.bentkweb.eduservice.controller
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("sc","student","course");
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
4.2 entity里面的更新和插入时间要加
@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT_UPDATE)