yang-sql转换器二

前言

上篇文章,讲到我编写的插件,对通用增删改查以及分页查询的操作,当时插件还未支持关联查询,所以未做解释。这篇文章就带你一起来解析下如何使用关联查询以及子查询

1、原理

首先,我需要解释下,设计的原理,我们在SQL中,编写一个复杂的查询语句,可以把它当做一个视图表,因此,可以设计一个视图类和其对应,保证具有实际含义。
所有的操作都基于实体,给我们的增删改查操作带来了巨大的便利。

2、视图定义

//视图实体类,只是定义不同,使用方法和普通的实体类无差别
@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

仔细分析和对比一下,很容易发现其中的规律特点。

3、优势

1、传入的条件可以由前端传入,也可以在后端预先定义,也可以是前端传入和后端定义相结合的方式,是后期的维护更加方便。
2、针对简单的关联查询和子查询,不需要手写SQL语句,大幅度提升代码的可读性
3、系统方便简洁,统一的Service处理增删改查,让使用者没有繁杂的配置,可以快速上手

4、使用

虽然多增加了一个实体定义方式,但是使用方式和上一篇文章的使用方式无差别。上一篇文章以及 git地址

5、下一版本更新

1、目前正在着手准备使用PrepareStatement替换掉String类型的SQL语句
2、目前的子查询只支持From子查询,继续支持where子查询

你可能感兴趣的:(项目研发)