经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
Fluent Mybatis零xml配置实现复杂嵌套查询
来源:jb51  时间:2021/8/4 17:55:49  对本文有异议

嵌套查询

使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的嵌套查询。
让dao的代码逻辑和sql逻辑合二为一。

前置准备,maven工程设置

参考文章 使用FluentMybatis实现mybatis动态sql拼装和fluent api语法

in (select 子查询)

 嵌套查询表和主查询表一样的场景

.column().in( query-> {对query设置条件})

只需要在in里面引用一个lambda表达式,lambda表达式入参是一个同名的Query。对这个入参可以设置where参数。

  1. @DisplayName("嵌套查询和主查询的表是同一个")
  2. @Test
  3. void test_in_same_table_query() {
  4. UserQuery query = new UserQuery()
  5. .where.id().in(q -> q.selectId()
  6. .where.id().eq(3L).end())
  7. .and.userName().like("user")
  8. .and.age().gt(23).end();
  9.  
  10. List list = mapper.listEntity(query);
  11. // 通过Test4J工具,验证sql语句
  12. db.sqlList().wantFirstSql()
  13. .eq("SELECT id, gmt_create, gmt_modified, is_deleted, account, age, avatar, birthday, bonus_points, e_mail, password, phone, status, user_name " +
  14. "FROM user WHERE id IN (SELECT id FROM user WHERE id = ?) " +
  15. "AND user_name LIKE ? " +
  16. "AND age > ?");
  17. }

嵌套查询表是另外表的场景
.column().in(queryClass, query-> {对query设置条件})

如果嵌套查询的不是同表一张表,需要在in方法里面显式声明一下Query对象的class类型, 后面用法同方法一。

  1. @DisplayName("嵌套查询和主查询的表是不同")
  2. @Test
  3. void test_in_difference_table_query() {
  4. UserQuery query = new UserQuery()
  5. .selectId()
  6. .where.addressId().in(ReceivingAddressQuery.class, q -> q.selectId()
  7. .where.id().in(new int[]{1, 2}).end())
  8. .end();
  9. mapper.listEntity(query);
  10. // 通过Test4J工具,验证sql语句
  11. db.sqlList().wantFirstSql()
  12. .eq("SELECT id " +
  13. "FROM user " +
  14. "WHERE address_id IN (SELECT id FROM receiving_address WHERE id IN (?, ?))");
  15. }

not in嵌套查询: 使用方法同 in 嵌套查询

exists (select子查询)

嵌套查询表和主查询表一样的场景
Exists查询不需要指定字段,直接在query where中可以引用exists方法。

exists( query-> {对query设置条件})
如果exists查询的表和主查询一致,直接在lambada表达式中使用同类型query参数即可,参数用法同in方法。

exists(queryClass, query-> {对query设置条件})
如果exists查询的表和主查询不一致,在exists方法第一个参数指定query类型,第二个参数同方法1。

具体示例

  1. @DisplayName("EXISTS查询")
  2. @Test
  3. void test_exists_query() {
  4. UserQuery query = new UserQuery()
  5. .where.exists(ReceivingAddressQuery.class, q -> q
  6. .where.detailAddress().like("杭州")
  7. .and.id().apply(" = user.address_id").end())
  8. .end();
  9. mapper.listEntity(query);
  10. // 通过Test4J工具,验证sql语句
  11. db.sqlList().wantFirstSql()
  12. .eq("SELECT id, gmt_create, gmt_modified, is_deleted, account, address_id, age, avatar, birthday, bonus_points, e_mail, password, phone, status, user_name " +
  13. "FROM user " +
  14. "WHERE EXISTS (SELECT *" +
  15. " FROM receiving_address" +
  16. " WHERE detail_address LIKE ?" +
  17. " AND id = user.address_id)",
  18. StringMode.SameAsSpace);
  19. }

注:示例中的测试,是使用H2内存数据库,你可以直接运行,不需要你额外建表。
但使用Test4J执行测试,你需要在加入vm参数:-javaagent:/这里是你本地maven仓库地址/org/jmockit/jmockit/1.48/jmockit-1.48.jar

以我本机为例,具体参数如图:

在这里插入图片描述

Fluent Mybatis文档&示例

Fluent Mybatis源码, github

到此这篇关于Fluent Mybatis零xml配置实现复杂嵌套查询的文章就介绍到这了,更多相关Fluent Mybatis 复杂嵌套查询内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号