上篇文章,讲到我编写的插件,对通用增删改查以及分页查询的操作,当时插件还未支持关联查询,所以未做解释。这篇文章就带你一起来解析下如何使用关联查询以及子查询
首先,我需要解释下,设计的原理,我们在SQL中,编写一个复杂的查询语句,可以把它当做一个视图表,因此,可以设计一个视图类和其对应,保证具有实际含义。
所有的操作都基于实体,给我们的增删改查操作带来了巨大的便利。
//视图实体类,只是定义不同,使用方法和普通的实体类无差别
@ViewTable //标识当前类是视图实体类
public class UserClassesView {
@Condition(column = "teacherId",value = "1") //定义查询条件
@MainTable(tableAlias = "userOne") //定义视图查询的主表信息(其也可是视图实体)
private TeacherView teacherView;
//定义join查询的关系
@ReferTable(tableAlias = "aliasClass",relation = "left join",condition = "userOne.id = aliasClass.classesId and userOne.userName = aliasClass.name")
private Classes classes;
//定义排序字段
@OrderBys({
@OrderBy(column = "teacherId",direct = "desc")
})
//定义多个查询条件
@Conditions({
@Condition(column = "teacherId",value = "1"),
@Condition(column = "teacherName",value = "8")
})
//定义join查询关系
@ReferTable(tableAlias = "teacher",relation = "left join",condition = "userOne.id = teacher.teacherId",includeColumns = {"teacherName"})
private Teacher teacher;
}
我们可以很清楚的知道,当前视图类的定义方式,其中有几个注解我需要详细说明一下
以下注解可以用在视图实体上也可用在普通的实体上
@Condition
作用在属性上,定义查询条件
@OrderBy
作用在属性上,定义排序字段,默认倒序
以下注解用在视图实体属性上
@Conditions
,作用在视图实体的属性上,是@condition
注解的复数形式,可同时定义多个条件
@OrderBys
作用在视图实体的属性上,可同时定义多个排序字段
@ViewTable
作用在类上,标识当前类是视图实体类
@MainTable
作用在视图实体属性上,定义主表信息
@ReferTable
作用在视图实体属性上,定义关联表的信息
可以根据上述的实体类,解析出对应的SQL语句如下:
SELECT
userOne.teacherId,
userOne.teacherName,
userOne.userName,
userOne.id,
aliasClass.CLASSES_ID AS classesId,
aliasClass.NAME AS classesName,
teacher.TEACHER_NAME AS teacherName
FROM
(
SELECT
oneOs.TEACHER_ID AS teacherId,
oneOs.TEACHER_NAME AS teacherName,
op.user_name AS userName,
op.ID AS id
FROM
TEACHER oneOs
INNER JOIN USER op ON oneOs.TEACHER_ID = op.ID
) userOne
LEFT JOIN CLASSES aliasClass ON userOne.id = aliasClass.CLASSES_ID
AND userOne.userName = aliasClass.
NAME LEFT JOIN TEACHER teacher ON userOne.id = teacher.TEACHER_ID
WHERE
( userOne.teacherId = '1' AND teacher.TEACHER_ID = '1' AND teacher.TEACHER_NAME = '8' )
ORDER BY
teacher.TEACHER_ID DESC
仔细分析和对比一下,很容易发现其中的规律特点。
1、传入的条件可以由前端传入,也可以在后端预先定义,也可以是前端传入和后端定义相结合的方式,是后期的维护更加方便。
2、针对简单的关联查询和子查询,不需要手写SQL语句,大幅度提升代码的可读性
3、系统方便简洁,统一的Service处理增删改查,让使用者没有繁杂的配置,可以快速上手
虽然多增加了一个实体定义方式,但是使用方式和上一篇文章的使用方式无差别。上一篇文章以及 git地址
1、目前正在着手准备使用PrepareStatement替换掉String类型的SQL语句
2、目前的子查询只支持From子查询,继续支持where子查询