查询多张表时,querywrapper是Mybatis-plus中提供的一种方便、高效的查询方式。通过它,我们可以在Java代码中方便地拼接SQL语句,实现类似于SQL中的联表查询。
一、基础查询语句
在使用querywrapper联表查询时,最基础的查询语句必须包含select、from、join和where四个关键词。其中,select用于指定查询的字段,from用于指定主表,join用于指定需要联合的表,where用于指定联表查询条件。 例如,在一个电商系统中,我们需要查询所有用户的订单信息,可以使用下面的代码:
Wrapper wrapper = new QueryWrapper
()
.select("order.id, order.user_id, order.create_time, user.username")
.from("order")
.join("user on user.id = order.user_id")
.orderByDesc("create_time");
List
orderList = orderService.list(wrapper);
以上代码中,我们使用select关键词查询order.id、order.user_id、order.create_time和user.username这四个字段。其中,order表示主表,user表示需要联合的表。 使用from指定主表,使用join指定需要联合的表。在join语句中,需要使用on关键词来指定两张表之间的关联条件。例如,在以上代码中,我们指定了user.id = order.user_id这个关联条件,用于将用户表和订单表关联起来。 最后,在where语句中,我们可以指定查询条件。例如,按照订单创建时间倒序排列,可以使用orderByDesc关键词指定create_time字段。
二、单条件查询
除了基础查询语句之外,我们还可以在where语句中指定单个条件,以对查询结果进行筛选。 例如,在以上的查询中,如果我们只想查询某一个用户的订单信息,可以使用下面的代码:
Wrapper wrapper = new QueryWrapper
()
.select("order.id, order.user_id, order.create_time, user.username")
.from("order")
.join("user on user.id = order.user_id")
.eq("user.username", "testuser")
.orderByDesc("create_time");
List
orderList = orderService.list(wrapper);
上述代码中,我们在where语句中使用eq关键词指定了查询条件。其中,第一个参数表示需要查询的字段,第二个参数表示查询条件的值。在本例中,我们查询了username字段值为testuser的订单信息。
三、多条件查询
除了单个条件之外,我们还可以在where语句中指定多个条件,以进一步筛选查询结果。 例如,在一个论坛系统中,我们需要查询所有帖子的评论信息,并只显示回复时间在某个时间段内的评论信息,可以使用下面的代码:
LocalDateTime startDateTime = LocalDateTime.of(2021,7,1,0,0,0);
LocalDateTime endDateTime = LocalDateTime.of(2021,7,31,0,0,0);
Wrapper wrapper = new QueryWrapper
()
.select("comment.id, comment.content, comment.create_time, post.title, user.username")
.from("comment")
.join("post on post.id = comment.post_id")
.join("user on user.id = comment.user_id")
.between("create_time", startDateTime, endDateTime)
.eq("post.shielded", false)
.orderByDesc("create_time");
List
commentList = commentService.list(wrapper);
在以上代码中,我们使用了between关键词指定了查询时间段,使用eq关键词指定了不被屏蔽的帖子,用于筛选查询结果。
四、返回结果处理
在使用querywrapper联表查询时,我们得到的结果是一个List对象,其中包含查询出的所有数据。在处理这个List对象时,我们可以通过遍历或者使用Java 8的stream API进行处理。 例如,在查询所有评论信息时,可以使用下面的代码打印每条评论的信息:
commentList.forEach(comment -> {
System.out.println("id:" + comment.getId()
+ ", content:" + comment.getContent()
+ ", createTime:" + comment.getCreateTime()
+ ", postTitle:" + comment.getPost().getTitle()
+ ", username:" + comment.getUser().getUsername());
});
在以上代码中,我们遍历了List对象中所有的评论信息,并输出了每条评论的id、内容、创建时间、所属帖子标题和用户姓名等信息。
五、小结
通过学习以上例子,我们可以了解使用querywrapper联表查询的基本方法和技巧。在实际的开发工作中,我们可以通过这种方式轻松地查询多张表之间的数据,并对查询结果进行多种不同的处理。 但是,需要注意的是,在联表查询时,需要注意表之间的关联关系和数据量的问题,以防止查询效率过低或者查询结果不准确的情况发生。