mybatis-flex实现链式操作的示例代码

 更新时间:2024年06月24日 10:25:46   作者:kunkun2580  
MyBatis-Flex它提供了一种链式操作方式,本文主要介绍了mybatis-flex实现链式操作的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

链式操作

在 MyBatis-Flex 中,内置了 QueryChain.java 、 UpdateChain.java 以及 DbChain.java 用于对数据进行链式查询操作和链式操作(修改和删除)。

  • QueryChain:链式查询
  • UpdateChain:链式更新
  • DbChain:链式调用 Db + Row

QueryChain 示例

例如,查询文章列表代码如下:

@SpringBootTest
class ArticleServiceTest {

    @Autowired
    ArticleService articleService;

    @Test
    void testChain() {
        List<Article> articles = articleService.queryChain()
            .select(ARTICLE.ALL_COLUMNS)
            .from(ARTICLE)
            .where(ARTICLE.ID.ge(100))
            .list();
    }
}

若不是在 Service 中,我们也可以通过 QueryChain.of(mapper) 方法,自己创建一个 QueryChain 实例,代码如下:

List<Article> articles = QueryChain.of(mapper)
    .select(ARTICLE.ALL_COLUMNS)
    .from(ARTICLE)
    .where(ARTICLE.ID.ge(100))
    .list();

UpdateChain 示例

假设我们要更新 Account 的 userName 为 "张三",更新年龄在之前的基础上加 1,更新代码如下:

@Test
public void testUpdateChain1() {
    UpdateChain.of(Account.class)
        .set(Account::getUserName, "张三")
        .setRaw(Account::getAge, "age + 1")
        .where(Account::getId).eq(1)
        .update();
}

以上方法调用时,MyBatis-Flex 内部执行的 SQL 如下:

UPDATE `tb_account` SET `user_name` = '张三' , `age` = age + 1
WHERE `id` = 1

另一个示例:

@Test
public void testUpdateChain2() {

    //更新数据
    UpdateChain.of(Account.class)
        .set(Account::getAge, ACCOUNT.AGE.add(1))
        .where(Account::getId).ge(100)
        .and(Account::getAge).eq(18)
        .update();

    //查询所有数据并打印
    QueryChain.of(accountMapper)
        .where(Account::getId).ge(100)
        .and(Account::getAge).eq(18)
        .list()
        .forEach(System.out::println);
}

通过 UpdateChain 进行 update(),其执行的 SQL 如下:

UPDATE `tb_account` SET `age` = `age` + 1
WHERE  `id` >= 100 AND `age` = 18

QueryChain 的方法

  • one():获取一条数据
  • list():获取多条数据
  • page():分页查询
  • obj():当 SQL 查询只返回 1 列数据的时候,且只有 1 条数据时,可以使用此方法
  • objList():当 SQL 查询只返回 1 列数据的时候,可以使用此方法
  • count():查询数据条数
  • exists():是否存在,判断 count 是否大于 0

QueryChain 扩展方法

one() 系列方法

  • one():获取一条数据
  • oneAs(asType):查询数据,并直接转换为 vo、dto 等
  • oneWithRelations:查询一条数据及其关联数据
  • oneWithRelationsAs:查询一条数据及其关联数据,并直接转换为 vo、dto 等
  • oneOpt:返回 Optional 类型,获取一条数据
  • oneAsOpt(asType):返回 Optional 类型,查询数据,并直接转换为 vo、dto 等
  • oneWithRelationsOpt:返回 Optional 类型,查询一条数据及其关联数据
  • oneWithRelationsAsOpt:返回 Optional 类型,查询一条数据及其关联数据,并直接转换为 vo、dto 等

list() 系列方法

  • list():查询数据列表
  • listWithRelations():查询数据列表及其关联数据
  • listAs():查询数据列表,并直接转换为 vo、dto 等
  • listWithRelationsAs():查询数据列表,及其关联数据,并直接转换为 vo、dto 等

page() 系列方法

  • page(page):分页查询数据列表
  • pageAs(page):分页查询数据列表,并直接转换为 vo、dto 等

obj() 系列方法

  • obj():查询第一列,且第一条数据
  • objAs(asType):查询第一列,且第一条数据并转换为指定类型,比如 Long, String 等
  • objOpt():返回 Optional 类型,查询第一列,且第一条数据
  • objAsOpt(asType):返回 Optional 类型,查询第一列,且第一条数据并转换为指定类型,比如 Long, String 等

objList() 系列方法

  • objList():查询第一列
  • objListAs(asType):查询第一列,并转换为指定类型,比如 Long, String 等

代码实战示例

示例 1:查询 Entity 列表

List<Article> articles = articleService.queryChain()
    .select(ARTICLE.ALL_COLUMNS)
    .from(ARTICLE)
    .where(ARTICLE.ID.ge(100))
    .list();

示例 2:查询 1 条 Entity 数据

Article article = articleService.queryChain()
    .select(ARTICLE.ALL_COLUMNS)
    .from(ARTICLE)
    .where(ARTICLE.ID.ge(100))
    .limit(1)
    .one();

示例 3:查询 VO 数据(ArticleVo)

ArticleVo.java

public class ArticleVo {

    private Long id;
    private Long accountId;
    private String title;
    private String content;

    //评论量最多的内容
    private Long maxComments;

    //getter setter
}

查询代码:

ArticleVo articleVo = articleService.queryChain()
    .select(
        ARTICLE.ALL_COLUMNS,
        max(ARTICLE.comments).as(ArticleVo::maxComments)
    ).from(ARTICLE)
    .where(ARTICLE.ID.ge(100))
    .limit(1)
    .oneAs(ArticleVo.class);

示例 4:多对多关联查询 VO 数据(ArticleVo)

ArticleVo.java 及其 文章分类 定义:

public class ArticleVo {

    private Long id;
    private Long accountId;
    private String title;
    private String content;

    //文章和分类的 多对多 关系配置
    @RelationManyToMany(
        joinTable = "tb_article_category_mapping", // 中间表
        selfField = "id", joinSelfColumn = "article_id",
        targetField = "id", joinTargetColumn = "category_id"
    )
    private List<ArticleCategory> categories;

    //getter setter
}

查询代码:

ArticleVo articleVo = articleService.queryChain()
    .select()
    .from(ARTICLE)
    .where(ARTICLE.ID.ge(100))
    .limit(1)
    .oneWithRelationsAs(ArticleVo.class);

通过 oneWithRelationsAs 方法查询 ArticleVo 及其关联数据(多对多的文章分类)。 更多关于关联查询的内容请参考章节:《关联查询》

DbChain 示例

使用 DbChain 之后无需将 QueryWrapper 与 Row 的构建分离,直接即可进行操作。

// 新增 Row 构建
DbChain.table("tb_account")
    .setId(RowKey.AUTO)
    .set("user_name", "zhang san")
    .set("age", 18)
    .set("birthday", new Date())
    .save();

// 查询 QueryWrapper 构建
DbChain.table("tb_account")
    .select("id", "user_name", "age", "birthday")
    .where("age > ?", 18)
    .list()
    .forEach(System.out::println);

到此这篇关于mybatis-flex实现链式操作的示例代码的文章就介绍到这了,更多相关mybatis-flex链式操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • JAVA DOC如何生成标准的JAVA API文档详解

    JAVA DOC如何生成标准的JAVA API文档详解

    这篇文章主要给大家介绍了关于JAVA DOC如何生成标准的JAVA API文档的相关资料,Javadoc是Sun公司提供的一种工具,它可以从程序源代码中抽取类、方法、成员等注释,然后形成一个和源代码配套的API帮助文档,需要的朋友可以参考下
    2024-06-06
  • RestClient 通过拦截器实现请求加密的示例

    RestClient 通过拦截器实现请求加密的示例

    本文介绍了如何通过拦截器实现请求加密,并通过RestClient优化了加密过程,传统的加密方法依赖对象转换和序列化处理,容易导致加密不一致或难以调试的问题,通过引入拦截器,可以直接操作请求体,避免了不必要的转换步骤,确保加密过程与请求体完全一致,感兴趣的朋友一起看看吧
    2025-02-02
  • java以json格式向后台服务器接口发送请求的实例

    java以json格式向后台服务器接口发送请求的实例

    下面小编就为大家分享一篇java以json格式向后台服务器接口发送请求的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java多线程4种拒绝策略小结

    Java多线程4种拒绝策略小结

    当线程池中的任务队列已满且无法再接受新的任务时,就需要采取拒绝策略来处理这种情况,本文主要介绍了Java多线程拒绝策略,包含了四种常见的拒绝策略,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • JAVA生成pdf文件的实操指南

    JAVA生成pdf文件的实操指南

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料,下面这篇文章主要给大家介绍了关于JAVA生成pdf文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Java日常练习题,每天进步一点点(16)

    Java日常练习题,每天进步一点点(16)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • 一篇文章大家彻底学会Java之格式化输出

    一篇文章大家彻底学会Java之格式化输出

    Java提供了多种格式化输出的方式,包括String.format()、System.out.printf()和Formatter类,这些方法支持数字、日期、字符串等多种格式化操作,这篇文章主要介绍了Java格式化输出的相关资料,需要的朋友可以参考下
    2025-04-04
  • Jackson2的JsonSchema实现java实体类生成json方式

    Jackson2的JsonSchema实现java实体类生成json方式

    这篇文章主要介绍了Jackson2的JsonSchema实现java实体类生成json,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JPA中EntityListeners注解的使用详解

    JPA中EntityListeners注解的使用详解

    这篇文章主要介绍了JPA中EntityListeners注解的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • @PathVariable为空时指定默认值的操作

    @PathVariable为空时指定默认值的操作

    这篇文章主要介绍了@PathVariable为空时指定默认值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论