Fluent Mybatis学习之Update语法实践

目录
  • 前言
  • 数据准备
  • Update语法
    • 简单的写法
    • UpdateByEntity根据表实体更新数据
    • UpdateByExclude根据表实体排除更新数据
    • applyFunc
  • 总结

前言

本篇文章主要针对update语法进行验证。

本项目Github地址:项目仓库

数据准备

还是用之前在数据库存的数据,数据如下:

Update语法

简单的写法

fm的update简单写法可以直接使用is()来对表字段进行赋值,如果需要将字段设置为Null的话,直接使用isNull()方法。

接口层代码添加

/**
 * 简单的更新语法
 *
 * @return
 */
Integer updateSimple();

实现类代码添加

@Override
public Integer updateSimple() {
  return testFluentMybatisMapper.updateBy(
      new TestFluentMybatisUpdate()
          .set
          .name()
          .is("何九")
          .set
          .age()
          .isNull()
          .end()
          .where
          .id()
          .eq(2)
          .end());
}

控制层代码添加

@Autowired private IUpdateService updateService;

@ApiOperation(value = "简单语法", notes = "简单语法")
@RequestMapping(value = "/simple", method = RequestMethod.GET)
@ResponseBody
public Result<Integer> updateSimple() {
  try {
    return Result.ok(updateService.updateSimple());
  } catch (Exception exception) {
    return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
  }
}

验证一下

代码说明

1、可以看一下代码执行的具体sql,如下:

2021-11-23 13:41:20.277 DEBUG 20820 --- [nio-8090-exec-1] c.h.f.f.m.T.updateBy                     : ==>  Preparing: UPDATE `test_fluent_mybatis` SET `name` = ?, `age` = ? WHERE `id` = ?
2021-11-23 13:41:20.464 DEBUG 20820 --- [nio-8090-exec-1] c.h.f.f.m.T.updateBy                     : ==> Parameters: 何九(String), null, 2(Integer)
2021-11-23 13:41:20.470 DEBUG 20820 --- [nio-8090-exec-1] c.h.f.f.m.T.updateBy                     : <==    Updates: 1

UpdateByEntity根据表实体更新数据

fm支持使用表实体进行数据更新,但是有一些限制,具体看我后面的代码说明。

接口层代码添加

/**
 * 根据实体更新语法
 *
 * @param req 实体参数
 * @return
 */
Integer updateByEntity(TestFluentMybatisEntity req);

实现类代码添加

@Override
public Integer updateByEntity(TestFluentMybatisEntity req) {
  return testFluentMybatisMapper.updateBy(
      new TestFluentMybatisUpdate()
          .set
          .byEntity(req, Ref.Field.TestFluentMybatis.name, Ref.Field.TestFluentMybatis.age)
          .end()
          .where
          .id()
          .eq(2)
          .end());
}

控制层代码添加

@Autowired private IUpdateService updateService;

@ApiOperation(value = "根据实体更新语法", notes = "根据实体更新语法")
@RequestMapping(value = "/updateByEntity", method = RequestMethod.POST)
@ResponseBody
public Result<Integer> updateByEntity(@RequestBody TestFluentMybatisEntity req) {
  try {
    return Result.ok(updateService.updateByEntity(req));
  } catch (Exception exception) {
    return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
  }
}

验证一下

代码说明

1、先看看sql的执行语句,如下图:

2021-11-23 13:56:16.572 DEBUG 20820 --- [nio-8090-exec-4] c.h.f.f.m.T.updateBy                     : ==>  Preparing: UPDATE `test_fluent_mybatis` SET `name` = ?, `age` = ? WHERE `id` = ?
2021-11-23 13:56:16.573 DEBUG 20820 --- [nio-8090-exec-4] c.h.f.f.m.T.updateBy                     : ==> Parameters: 李四(String), 29(Integer), 2(Integer)
2021-11-23 13:56:16.580 DEBUG 20820 --- [nio-8090-exec-4] c.h.f.f.m.T.updateBy                     : <==    Updates: 1

2、这里需要注意,在使用byEntity方法的时候,不会使用entity中的id作为判断的。官方原话为:未指定字段列表时, 更新除主键外非null字段。

3、byEntity方法支持传递字段参数,很好理解,只更新传递的字段值,不论是否为null。官方原话为:指定字段时,更新指定的字段(包括null字段), 但指定主键无效。

4、我在方法中选定了name、age两个字段,所以只更新这两项。

UpdateByExclude根据表实体排除更新数据

fm对排除字段情有独钟,简单理解一下,就是在设置字段的时候,byEntity是只选定选择的字段,byExclude是只排除选择的字段。

接口层代码添加

/**
 * 根据排除项更新语法
 *
 * @param req 实体参数
 * @return
 */
Integer updateByExclude(TestFluentMybatisEntity req);

实现类代码添加

@Override
public Integer updateByExclude(TestFluentMybatisEntity req) {
  return testFluentMybatisMapper.updateBy(
      new TestFluentMybatisUpdate()
          .set
          .byExclude(req, TestFluentMybatisEntity::getAge, TestFluentMybatisEntity::getDelFlag)
          .end()
          .where
          .id()
          .eq(2)
          .end());
}

控制层代码添加

@Autowired private IUpdateService updateService;

@ApiOperation(value = "根据排除项更新语法", notes = "根据排除项更新语法")
@RequestMapping(value = "/updateByExclude", method = RequestMethod.POST)
@ResponseBody
public Result<Integer> updateByExclude(@RequestBody TestFluentMybatisEntity req) {
  try {
    return Result.ok(updateService.updateByExclude(req));
  } catch (Exception exception) {
    return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
  }
}

验证一下

代码说明

1、先看看sql的执行语句,如下图:

2021-11-23 15:21:42.262 DEBUG 20820 --- [nio-8090-exec-6] c.h.f.f.m.T.updateBy                     : ==>  Preparing: UPDATE `test_fluent_mybatis` SET `name` = ?, `create_time` = ? WHERE `id` = ?
2021-11-23 15:21:42.266 DEBUG 20820 --- [nio-8090-exec-6] c.h.f.f.m.T.updateBy                     : ==> Parameters: 李四(String), null, 2(Integer)
2021-11-23 15:21:42.271 DEBUG 20820 --- [nio-8090-exec-6] c.h.f.f.m.T.updateBy                     : <==    Updates: 1

2、这里需要注意,实体中没有给create_time设值,所以会把其设置为null,官方原话为:未指定字段列表时, 更新除主键外字段(包括null字段)

3、而我指定了字段age和del_flag,但是并没有作用,这就是byExclude的作用,官方原话为:排除指定字段。

applyFunc

可以在更新语法中,增加对字段的函数操作,使用applyFunc即可,这个方法还是很好用的,简化代码。

接口层代码添加

/**
 * 使用applyFunc更新语法
 *
 * @return
 */
Integer updateByApplyFunc();

实现类代码添加

@Override
public Integer updateByApplyFunc() {
  return testFluentMybatisMapper.updateBy(
      new TestFluentMybatisUpdate()
          .set
          .name()
          .applyFunc("concat(name, ?)", "_男")
          .set
          .age()
          .applyFunc("age+5")
          .end()
          .where
          .id()
          .eq(2)
          .end());
}

控制层代码添加

@Autowired private IUpdateService updateService;

@ApiOperation(value = "使用applyFunc更新语法", notes = "使用applyFunc更新语法")
@RequestMapping(value = "/updateByApplyFunc", method = RequestMethod.GET)
@ResponseBody
public Result<Integer> updateByApplyFunc() {
  try {
    return Result.ok(updateService.updateByApplyFunc());
  } catch (Exception exception) {
    return Result.error(ErrorCode.BASE_ERROR_CODE.getCode(), exception.getMessage(), null);
  }
}

验证一下

代码说明

1、先看看sql的执行语句,如下图:

2021-11-23 15:31:09.772 DEBUG 20820 --- [nio-8090-exec-8] c.h.f.f.m.T.updateBy                     : ==>  Preparing: UPDATE `test_fluent_mybatis` SET `name` = concat(name, ?), `age` = age+5 WHERE `id` = ?
2021-11-23 15:31:09.782 DEBUG 20820 --- [nio-8090-exec-8] c.h.f.f.m.T.updateBy                     : ==> Parameters: _男(String), 2(Integer)
2021-11-23 15:31:09.787 DEBUG 20820 --- [nio-8090-exec-8] c.h.f.f.m.T.updateBy                     : <==    Updates: 1

2、sql可以看出,将那么字段拼接了后缀"_男",同时年龄增加5岁。

总结

总的来看,fm提供的方法还是很优越的,后面会继续把fm剩下的功能调试完。

到此这篇关于FluentMybatis学习之Update语法实践的文章就介绍到这了,更多相关FluentMybatis的内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • FluentMybatis实现mybatis动态sql拼装和fluent api语法

    目录 开始第一个例子: Hello World 新建演示用的数据库结构 创建数据库表对应的Entity类 运行测试来见证Fluent Mybatis的神奇 配置spring bean定义 使用Junit4和Spring-test来执行测试 开始第一个例子: Hello World 新建Java工程,设置maven依赖 新建maven工程,设置项目编译级别为Java8及以上,引入fluent mybatis依赖包. <dependencies> <!-- 引入fluent-mybatis

  • Fluent MyBatis实现动态SQL

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

  • 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日志配置 之

  • Fluent Mybatis学习之Update语法实践

    目录 前言 数据准备 Update语法 简单的写法 UpdateByEntity根据表实体更新数据 UpdateByExclude根据表实体排除更新数据 applyFunc 总结 前言 本篇文章主要针对update语法进行验证. 本项目Github地址:项目仓库 数据准备 还是用之前在数据库存的数据,数据如下: Update语法 简单的写法 fm的update简单写法可以直接使用is()来对表字段进行赋值,如果需要将字段设置为Null的话,直接使用isNull()方法. 接口层代码添加 /**

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

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

  • Fluent Mybatis让你摆脱Xml文件的技巧

    目录 一.啥是Fluent-Mybatis 二.SpringBoot + Fluent-Mybatis 三.官方链接 一.啥是Fluent-Mybatis 与Mybatis-Plus类似,是对Mybaits进一步的封装,使之语法简洁明了,更重要的是不需要在自主创建Xml文件,可以只用一个实体类对象,通过代码生成器,在编译的过程中生成所需要的各类文件,简化了项目的基础构建,提高开发效率. 二.SpringBoot + Fluent-Mybatis 1.创建数据库测试表 DROP TABLE IF

  • Fluent Mybatis,原生Mybatis,Mybatis Plus三者功能对比

    目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus实现效果 生成代码编码比较 fluent mybatis生成代码设置 mybatis plus代码生成设置 FluentMybatis特性一览 三者对比总结 Fluent Mybatis介绍和源码 使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一. 不用再需要在Dao中

  • Fluent Mybatis 批量更新的使用

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

  • MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    上一篇文章MyBatis入门学习教程(一)-MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对users表执行CRUD操作.在没奔主题之前,先给大家补充点有关mybatis和crud的基本知识. 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBa

  • 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实现环境隔离和租户隔离

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

  • 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; /** @

随机推荐