当前位置: 代码网 > it编程>编程语言>Java > mybatis-flex实现链式操作的示例代码

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

2024年07月05日 Java 我要评论
链式操作​在 mybatis-flex 中,内置了querychain.java、updatechain.java以及dbchain.java用于对数据进行链式查询操作和链式操作(修改和删除)。que

链式操作

在 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链式操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com