Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

目录
  • 前言
  • Maven依赖
  • 配置文件调整
  • Knife4j配置
  • 添加必要实体
  • 增/改
  • 总结

前言

接着上一篇,上篇已经测试通过,成功添加了数据。那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口。

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,修改成功。

总结

下一篇继续,地址:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

如果本文对你有帮助,请点个赞支持一下吧。

到此这篇关于Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上的文章就介绍到这了,更多相关Java Fluent Mybatis内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Fluent MyBatis实现动态SQL

    目录 数据准备 代码生成 在 WHERE 条件中使用动态条件 在 UPDATE 使用动态更新 choose 标签 参考 MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的, MyBatis虽然提供了动态拼装的能力,但这些写xml文件,也确实折磨开发.Fluent MyBatis提供了更贴合Java语言特质的,对程序员友好的Fluent拼装能力. Fluent MyBatis动态SQL,写SQL更爽 数据准备 为了后

  • FluentMybatis快速入门详细教程

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一. 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数. 对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系. 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式: hibernate和JPA对开发基本屏蔽了底层数据的处理,只需要在model层设置数据级联关系即可.但这种设置也往往

  • Java Fluent Mybatis实战之构建项目与代码生成篇下

    目录 前言 依赖补充 数据库文件配置 测试代码 增加扫描mapper注解 执行测试代码 总结 前言 上一篇文章已经介绍了fluent-mybatis项目的构建,文章地址:Java Fluent Mybatis实战之构建项目与代码生成篇上 这篇文章继续之前的项目,对代码进行基本调试.验证代码操作数据库情况. 依赖补充 按照官方给的代码依赖是不够的,这里需要对maven的pom文件进行补充. <dependency> <groupId>org.mybatis.spring.boot&l

  • Java Fluent Mybatis实战之构建项目与代码生成篇上

    目录 简述 特性 项目搭建 maven依赖引入-fluent-mybatis 表构建 代码生成工具类 解决类找不到问题 总结 简述 偶然看到一篇关于阿里新orm框架的文章,好奇的点了进去.开发后端多年,看到这个还是有点兴奋的.常用mysql的orm框架mybatis.jpa,到后来的优化框架mybatis-plus都是用过,他们或多或少都有优缺点吧.程序员本就是日常革新技术的职业,所以了解更多的框架绝对不会有错误.所以我尝试着把自己学习该框架的过程,记录下来,尽可能去掉一些项目工程中用不到的功能

  • Fluent Mybatis 批量更新的使用

    目录 批量更新同一张表的数据 更新多条数据,每条数据都不一样 java中for循环实现方式 一条SQL,服务端逐条更新 mybatis实现方式 使用FluentMybatis实现方式 使用mysql的Case When then方式更新 mybatis原生实现方式 批量更新不同的表数据 参考 批量更新同一张表的数据 更新多条数据,每条数据都不一样 背景描述 通常需要一次更新多条数据有两个方式 在业务代码中循环遍历,逐条更新 一次性更新所有数据, 采用批量sql方式,一次执行. 更准确的说是一条s

  • Fluent Mybatis零xml配置实现复杂嵌套查询

    目录 嵌套查询 in (select 子查询) exists (select子查询) 嵌套查询 使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的嵌套查询. 让dao的代码逻辑和sql逻辑合二为一. 前置准备,maven工程设置 参考文章 使用FluentMybatis实现mybatis动态sql拼装和fluent api语法 in (select 子查询) 嵌套查询表和主查询表一样的场景 .column().in

  • Fluent Mybatis实现环境隔离和租户隔离

    目录 什么是环境隔离和多租户隔离 环境隔离和多租户隔离需要做的事情 环境隔离和租户隔离工具类 隔离前准备工作 增删改查环境和租户隔离演示 新增数据 查询数据 更新数据 总结 什么是环境隔离和多租户隔离 我们在实际的业务开发中,经常会碰到环境逻辑隔离和租户数据逻辑隔离的问题. 环境隔离 我们的开发系统过程中,经常会涉及到日常开发环境,测试环境,预发环境和线上环境,如何区隔这些环境,有些方案是采用独立的数据库,有些是采用同一套数据库(比如线下多个测试环境使用同一个数据库,预发环境和线上环境使用同一个

  • springboot 整合fluent mybatis的过程,看这篇够了

    1.导入pom依赖 <!-- mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!--mysql依赖--> <de

  • Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一.不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数.那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢? 场景需求设置 我们通过一个比较典型的业务需求来具体实现和对比下,假如有学生成绩表结构如下: create table `student_score` ( id big

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    目录 前言 Maven依赖 配置文件调整 Knife4j配置 添加必要实体 增/改 总结 前言 接着上一篇,上篇已经测试通过,成功添加了数据.那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口. GitHub代码仓库:GitHub仓库 Maven依赖 增加了druid数据库连接池,所以之前的配置文件也需要调整,下面会发出来. <dependency> <groupId>cn.hutool</groupId> <artifac

  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下

    目录 前言 查询 查询写法1 查询写法2 代码说明 新问题 删 总结 前言 接着上一篇:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上 仓库地址:GitHub仓库 查询 定义查询请求体 package com.hy.fmp.dto.req; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** @

  • Java Fluent Mybatis 聚合查询与apply方法详解流程篇

    前言 接着上一篇文章:Java Fluent Mybatis 分页查询与sql日志输出详解流程篇 我把分页已经调整好了,现在实验一下官方给出的聚合查询方法. GitHub代码仓库:GitHub仓库 数据准备 为了聚合查询的条件,添加了几条数据. MIN 我们试着获取最小的年龄. 方法实现 @Override public Integer getAgeMin() { Map<String, Object> result = testFluentMybatisMapper .findOneMap(

  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    目录 前言 准备数据 Sql日志配置 官方分页查询 PageHelper分页查询 总结 前言 接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些.那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题.代码之后还是会上传到github. GitHub代码仓库地址:GitHub仓库 准备数据 简单的准备了一些数据. Sql日志配置 之

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • java迭代器中删除元素的实例操作详解

    我们知道通过Iterator,可以对集合中的元素进行遍历.那么在其中遇到我们不需要的元素时,可不可以在遍历的时候顺便给删除呢?答案是当然可以.在Iterator下有一个remove函数,专门用于删除的操作.下面我们就remove进行讲解,然后对删除元素方法进行说明,最后带来实例的展示. 1.Iterator中的remove void remove():删除迭代器刚越过的元素 从基础集合中移除这个迭代器返回的最后一个元素(可选操作).两个线程中都删除,保证线程的同步. 2.删除元素说明 (1)迭代

  • Java数据结构之线段树中的懒操作详解

    目录 一.问题提出 二.区间更新 三.区间查询 四.实战 1.问题描述 2.输入 3.代码 4.测试 一.问题提出 对于线段树,若要求对区间中的所有点都进行更新,可以引入懒操作. 懒操作包括区间更新和区间查询操作. 二.区间更新 对 [l,r] 区间进行更新,例如将 [l,r] 区间所有元素都更新为 v,步骤如下. 1.若当前节点区间被查询区间[l,r]覆盖,则仅对该节点进行更新并做懒标记,表示该节点已被更新,对该节点的子节点暂不更新. 2.判断是在左子树中查询还是在右子树中查询.在查询过程中,

  • Java异常分类处理抛出捕获操作详解

    目录 什么是异常 1.算术异常 2.数组越界异常 3.空指针异常 异常的分类 异常的抛出(throw关键字) 异常的捕获 throws关键字 try catch关键字 finally关键字 总结 什么是异常 “程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.” 我们在平时写代码的过程中就可能会遇到异常,给大家给举一些容易遇到常见的异常例子: 1.算术异常 Exception in thread “main” java.lang.ArithmeticExcept

  • Java中mybatis关于example类的使用详解

    这几天刚接触example,很多内容都是破碎的,写一篇博文加深理解. 一.什么是example类 mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的Example类会十分庞大.理论上通过example类可以构造你想到的任何筛选条件.在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了.具体配置可以参考MBG有关配置.      下面是mybatis自动生成example的使用. 二.了解exampl

  • Java实现的数组去重与排序操作详解

    本文实例讲述了Java实现的数组去重与排序操作.分享给大家供大家参考,具体如下: 这里演示Java实现数组去重.排序操作 文中的示例源码编写基于Jdk1.6+.junit4.8.2 java.util.Arrays.sort() 支持对int[],long[],short[],char[],byte[],float[],double[],Object[]进行排序 参考示例代码片段如下 // 声明int 数组,并初始化 int[] intArry = {5,4,7,8,2,0,1,9,3,6,10

随机推荐