Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上
作者:剑客阿良_ALiang 发布时间:2022-08-28 16:47:28
标签:Java,Fluent,Mybatis,常规操作
前言
接着上一篇,上篇已经测试通过,成功添加了数据。那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口。
GitHub代码仓库:GitHub仓库
Maven依赖
增加了druid数据库连接池,所以之前的配置文件也需要调整,下面会发出来。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
配置文件调整
原来的application.properties就不用了,换成yml,看得清楚一点。
server:
port: 8080
spring:
application:
name: fluent
datasource:
druid:
db-type: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.108:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&verifyServerCertificate=false&allowMultiQueries=true&serverTimezone=GMT%2b8
username: root
password: 123456
# 使用druid数据源
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initialSize: 10
minIdle: 10
maxActive: 200
# 配置获取连接等待超时的时间
maxWait: 6000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 100000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true
Knife4j配置
这部分配置主要是为了后面调试接口方便。
上代码
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.hy.fmp.dto.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;
import java.util.HashMap;
@EnableOpenApi
@Configuration
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
@Value("${knife4j.enable:true}")
private boolean enable;
@Bean
UiConfiguration uiConfig() {
return UiConfigurationBuilder.builder().build();
}
@Bean
public Docket nlpRestApi(ServerProperties serverProperties) {
return new Docket(DocumentationType.OAS_30)
.enable(enable)
.apiInfo(apiInfo("FluentMybatis测试服务接口"))
.pathMapping(serverProperties.getServlet().getContextPath())
.groupName("FluentMybatis测试")
.select()
.apis(RequestHandlerSelectors.basePackage("com.hy.fmp.ctrl"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(String title) {
return new ApiInfoBuilder()
// 标题
.title(title)
// 描述
.description("所有的接口响应在现有接口定义外包装了一层标准结构:" + Result.ok(new HashMap<>(1)))
// 作者信息
.contact(new Contact("剑客阿良ALiang", "", "3614322595@qq.com"))
// 版本号
.version("1.0.0")
.build();
}
}
添加必要实体
增加control层接口返回实体以及错误码枚举类。
结果实体
package com.hy.fmp.dto;
import cn.hutool.json.JSONUtil;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Result<T> {
private String code = "0";
private String message = "请求成功";
private boolean success = true;
private T data;
public Result(String code, String message, boolean success) {
this.code = code;
this.message = message;
this.success = success;
}
public Result(String code, String message, boolean success, T data) {
this.code = code;
this.message = message;
this.success = success;
this.data = data;
}
public Result(T data) {
this.data = data;
}
/**
* 针对异常返回响应体
*
* @param success 是否成功
* @param code 错误码
* @param message 错误信息
*/
public Result(boolean success, String code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
public static <T> Result<T> ok(T obj) {
return new Result<>(obj);
}
public static <T> Result<T> ok() {
return new Result<>();
}
public static <T> Result<T> error(String code, String message) {
return new Result<>(code, message, false);
}
public static <T> Result<T> error(String code, String message, T data) {
return new Result<>(code, message, false, data);
}
public Result<T> setMsg(String message) {
this.message = message;
return this;
}
@Override
public String toString() {
return JSONUtil.toJsonStr(this);
}
}
错误码枚举
package com.hy.fmp.enm;
/** @Author huyi @Date 2021/10/20 17:19 @Description: 报错code */
public enum ErrorCode {
/** 错误code */
BASE_ERROR_CODE("10001"),
;
private final String code;
ErrorCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
增/改
现在开始增加和修改表接口编写,一般来说,新增和修改的方法都定义为同一个。逻辑为如果传递数据主键,则为改,如果不传递,则为增。
定义接口
package com.hy.fmp.service;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
/** @Author huyi @Date 2021/10/20 17:10 @Description: 基础操作接口 */
public interface IBaseService {
/**
* 新增/修改接口
*
* @param param 表实体
* @return 表实体
*/
TestFluentMybatisEntity insertOrUpdate(TestFluentMybatisEntity param);
}
接口实现类
package com.hy.fmp.service.Impl;
import com.hy.fmp.fluent.dao.intf.TestFluentMybatisDao;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
import com.hy.fmp.service.IBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/** @Author huyi @Date 2021/10/20 17:10 @Description: 基础操作接口实现 */
@Slf4j
@Service
public class BaseServiceImpl implements IBaseService {
@Autowired private TestFluentMybatisDao testFluentMybatisDao;
@Override
public TestFluentMybatisEntity insertOrUpdate(TestFluentMybatisEntity param) {
testFluentMybatisDao.saveOrUpdate(param);
return param;
}
}
编写control层
package com.hy.fmp.ctrl;
import com.hy.fmp.dto.Result;
import com.hy.fmp.enm.ErrorCode;
import com.hy.fmp.fluent.entity.TestFluentMybatisEntity;
import com.hy.fmp.service.IBaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/** @Author huyi @Date 2021/10/20 17:04 @Description: 基础操作 */
@Slf4j
@RestController
@RequestMapping("/base")
@Api(tags = "基础操作")
public class BaseController {
@Autowired private IBaseService baseService;
@ApiOperation(value = "插入/更新数据", notes = "插入/更新数据")
@RequestMapping(value = "/insertOrUpdate", method = RequestMethod.POST)
@ResponseBody
public Result<TestFluentMybatisEntity> insertOrUpdate(@RequestBody TestFluentMybatisEntity param) {
try {
return Result.ok(baseService.insertOrUpdate(param));
} catch (Exception exception) {
return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
}
}
}
启动项目
打开Knife4j页面:http://localhost:8080/doc.html#/home
点开我们刚刚写好的接口进行测试。
OK,插入成功。
修改数据
OK,修改成功。
来源:https://huyi-aliang.blog.csdn.net/article/details/120873206
0
投稿
猜你喜欢
- 这篇文章主要介绍了SpringBoot如何读取war包jar包和Resource资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具
- 本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下马踏棋盘算法介绍8X8棋盘,马走日字,要求每个方格只进入一次,走
- 前言:IO流主要分为两大类,分别是字节流与字符流注意:1、音频文件、图片、视频(范围广),就用字节流2、只涉及到文本的,就用字符流使用字节流
- 在Android中因为不同像素手机的多样化,对于一张图片,放大不同的手机上因像素不同显示上也会有区别。现有如下需求:将一张图片宽度充满整个屏
- java 中newInstance()方法和new关键字的区别* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新
- 至少有K个重复字符的最长子串给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不
- 冒泡排序在八大排序中,冒泡排序是最为出名的排序算法之一!冒泡排序的代码还是相当简单的,两层循环,外层是冒泡轮数,里层是依次比较,这个算法的时
- 自定义Starter命名规则注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starte
- 一、定义登录控制器目录结构代码:1、创建TUser类package com.demo.pojo;import lombok.AllArgsC
- 前提:集成开发环境(IDE):eclipsejdk版本:8.0File类的几个方法:1)isFile()测试此抽象路径名表示的文件是否为普通
- 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后除以10的余数代替该数字,再将第一
- 最近接触到INI配置文件的读写,虽然很久以前微软就推荐使用注册表来代替INI配置文件,现在在Visual Stud
- GET请求不支持对象传参问题@GetMapping("/getByParam")String hello(Student
- @Cacheable自定义KeyGenerator1. 概述SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指
- 1.准备工作1、JDK安装2、Maven安装3、Git安装4、jenkins安装以上软件安装成功后进入jenkins进行相关配置。如果需要通
- 本文为大家汇总了Android Studio ADB网络调试的使用方法,供大家参考,具体内容如下随着技术的发展,现在的安卓手机大部分开始使用
- 1、Spring Boot跨域配置有两种方法在后端使用Spring Boot。Spring Boot跨域非常简单,只需书写以下代码即可。@C
- SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库。Android提供了3种操作数据的方式,SharedPrefe
- 介绍这里学习SpringSecurity,对SpringSecurity进行学习。基本用法添加依赖<dependency> &n
- 多线程@Async的使用体验场景导入:可以将大批量的数据insert操作采用多线程的方式并行执行第三方服务的接口调用:由于存在个别第三方服务