掌桥专利:专业的专利平台
掌桥专利
首页

一种绑定关联对象的方法和装置

文献发布时间:2023-06-19 11:35:49


一种绑定关联对象的方法和装置

技术领域

本发明涉及计算机技术领域,具体而言涉及一种绑定关联对象的方法和装置。

背景技术

在软件开发过程中离不开进行对象关联的处理,尤其在进行SQL查询时,往往涉及到跨表查询,这就更需要进行对象关联的处理,即对关联对象进行绑定。以公司的人事档案电子化管理为例子进行说明。员工需要和部门、档案、员工履历等信息相关联,即在employee(员工)对象与department(部门)对象、profile(员工档案)、work experience(员工履历)等对象有关联关系。为了数据管理方便,在建立数据库表时往往会建立多个表,例如employee表、department表、profile表、work_experience表。当在执行前端UI界面的数据显示和处理时,需要把对象数据及其关联对象的数据进行绑定在一起,通过一个接口提供数据给前端UI界面。

对于上述的应用实例,现有的处理方法是对employee(员工)对象接口的关联对象(department(部门)对象、profile(员工档案)、work experience(员工履历)等)存储于不同的数据库表,这就需要开发人员将所有相关的数据查询出来,然后将结果逐个进行绑定。继续举例,前端UI界面需要提供“员工”列表查看功能,其中“所属部门”这一列需要显示的是部门的名称。如表1所示:

表1

这个UI界面需要的接口数据,以json格式为例是以下这种结构:

其中departmentName:所属部门,取值来自department表的name字段。而数据库的存储结构一般是:department表中存储的是id(部门id)、name(部门名称)等字段。

在employee表中存储的是id(员工id)、name(姓名)、birthdate(生日)、department_id(部门id)。其中这个department_id是外键关联到department表的id,作为前端显示时需要转换成name(部门名称)。参见以下示例表:

employee表的示例

department表的示例

通过这个简单的对象关联的应用场景可知,需要开发人员手写大量的SQL语句来实现对象的关联或绑定。当在UI界面上显示employee(员工)对象的详情页面时,该详情页面除了展示上述的基本信息外,往往还会展示或提供查看员工的更多其他信息,例如“员工档案”(表employee_profile,包含employee_id列关联至employee表)、“工作履历”(表work_experience,包含employee_id列关联至employee表)。

针对类似这种跨表关联对象的绑定场景,需要开发人员手写大量的SQL语句来完成目的。现有的关联对象的绑定方法具有以下缺点:

1、书写SQL语句的工作量大且很复杂,代码编写的难度大、门槛高;

2、开发人员在书写代码的过程中极易出错,产生bug;

3、复杂的关联性使得执行查询的效率低、容易带来软件性能上的负面影响。

发明内容

本发明的目的在于提供一种绑定关联对象的方法和装置,以改善上述问题。

本发明的第一实施例提供了一种绑定关联对象的方法,包括:

自定义待绑定对象的注解并声明该注解的配置参数,该配置参数包括但不限于:该注解使用的范围、该注解的生命周期、该注解的继承、待绑定的从对象的类、关联条件、绑定字段;

声明待绑定主对象及其属性和从对象及其属性与数据库中的数据表及其列的映射关系;

基于命名映射规则,利用注解中的待绑定从对象的实体类名来得到该待绑定从对象在数据库中的数据表名,或者通过@Table注解获得指定的该待绑定从对象在数据库中的数据表名;

对注解中的关联条件进行解析以得到关联条件中的主对象在数据库中对应的数据表的列名,基于命名映射规则得到所述主对象的数据表的列名所对应的属性名和待绑定从对象在数据库中对应的数据表的列名;

基于得到的所述主对象的数据表的列名所对应的属性名,通过反射机制得到该主对象的属性值;

基于得到的待绑定从对象在数据库中的数据表名和列名,将得到所述主对象的属性值作为查询输入参数值,基于关联条件和外键约束规则能够查询到该待绑定从对象的在对应所述数据表名的数据表中的列值匹配于该查询输入参数值的相应列的全部记录信息,利用反射机制将查询结果赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

其中,所述映射关系包括但不限于:主键、外键、列和字段的映射关系。

其中,所述关联条件是从对象的实体类名或某个属性字段。

其中,当查询的匹配列值归属于从对象的多个数据表时,先将查询的全部记录信息转换为从对象的数据集合,再通过反射机制将将该数据集合赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

本发明的第二实施例提供了一种绑定关联对象的装置,其包括:

注解定义模块,用于自定义待绑定对象的注解并声明该注解的配置参数,该配置参数包括但不限于:该注解使用的范围、该注解的生命周期、该注解的继承、待绑定的从对象的类、关联条件、绑定字段;

声明模块,用于声明待绑定主对象及其属性和从对象及其属性与数据库中的数据表及其列的映射关系;

数据处理模块,用于基于命名映射规则,利用注解中的待绑定从对象的实体类名来得到该待绑定从对象在数据库中的数据表名,或者通过@Table注解获得指定的该待绑定从对象在数据库中的数据表名;对注解中的关联条件进行解析以得到关联条件中的主对象在数据库中对应的数据表的列名,基于命名映射规则得到所述主对象的数据表的列名所对应的属性名和待绑定从对象在数据库中对应的数据表的列名;基于得到的所述主对象的数据表的列名所对应的属性名,通过反射机制得到该主对象的属性值;

绑定执行模块,用于基于得到的待绑定从对象在数据库中的数据表名和列名,将得到所述主对象的属性值作为查询输入参数值,基于关联条件和外键约束规则能够查询到该待绑定从对象的在对应所述数据表名的数据表中的列值匹配于该查询输入参数值的相应列的全部记录信息,利用反射机制将查询结果赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

其中,所述映射关系包括但不限于:主键、外键、列和字段的映射关系。

其中,所述关联条件是从对象的实体类名或某个属性字段。

其中,所述绑定执行模块工作时,当查询的匹配列值归属于从对象的多个数据表时,先将查询的全部记录信息转换为从对象的数据集合,再通过反射机制将将该数据集合赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

根据本发明提供的一种绑定关联对象的方法和装置,其能够带来的优点:1、通过注解声明对象间的关联方式,开发人员仅需要关注对象间的关联条件,极大地降低了开发难度。

2、该方法对比传统的对象关联场景的SQL代码编写,大大减少了SQL的代码量,使得代码出错率更低,更容易维护。

3、因该方法的实现是将复杂关联查询拆解为多个简单查询,可以让缓存效率更高,有效减少锁竞争。

4、同时在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

附图说明

图1是本发明第一实施例提供的绑定关联对象的方法的流程图;

图2是本发明第二实施例提供的绑定关联对象的装置的示意性框图。

具体实施方式

下面将结合具体实施例和附图,对本发明提出的技术方案进行清楚、完整地描述,显然所描述的示例性实施例仅仅出于说明目的而非限定。

为了改善上述的技术问题,本申请的发明人想到了利用注解功能来实现相关联的主对象和从对象之间的绑定。

相关术语:

实体类:与数据库表定义对应的类,其中类名映射到表名,类中的属性名映射到表中的列名。

命名映射规则:一般数据库表列名与实体的类名属性名命名之间有固定的映射规则,如驼峰式命名转换为小写下划线的蛇形命名,WorkExperience映射为work_experience。

主对象和从对象:一般将主表对应的对象称之为“主对象”,与主表关联的从表对应的对象称之为“从对象”。

主键:能确定一条记录的唯一标识。

外键:用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性。

图1是本发明第一实施例提供的绑定关联对象的方法的流程图。如图1所示,本发明第一实施例提供的一种绑定关联对象的方法包括:

S1:自定义待绑定对象的注解并声明该注解的配置参数,该配置参数包括但不限于:该注解使用的范围、该注解的生命周期、该注解的继承、待绑定的从对象的类、关联条件、绑定字段。

注解是从Java 1.5引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring。注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响。

在代码编写过程中,使用注解功能之前需要先自定义注解和声明注解的配置参数。在本发明里,自定义待绑定对象的注解并声明该注解的配置参数,该配置参数包括但不限于:该注解使用的范围、该注解的生命周期、该注解的继承、待绑定的从对象的类、关联条件、绑定字段。其中:

使用@Target声明注解使用的范围,使用@Retention声明注解的生命周期,使用@Inherited声明注解的继承。另外,还可以使用@Document声明注解是由javadoc来记录。

另外,可以使用Class entity()声明待绑定的从对象的类,使用Stringcondition()声明关联条件,使用String condition()声明绑定字段。

下面提供一个实例来说明定义一个注解。

S2:声明待绑定主对象及其属性和从对象及其属性与数据库中的数据表及其列的映射关系。

现在的编程方法都是面向对象的编程,所有的值、操作都是基于对象的概念,而数据库还是关系数据库,因此需要在对象和数据库之间建立映射关系,即对象关系映射。

另外,在进行SQL查询时,当数据库中表与表之间有关联时,在对数据库进行操作时,就不只是针对某一张表了,需要联表查询或跨表查询,因此也需要在多表之间建立映射关系。

所述映射关系包括但不限于:主键、外键、列和字段的映射关系。其中主键和外键的用途就是在多表之间建立映射关系。

主键是能确定一条记录的唯一标识,其不能有重复的,也不允许为空,且只能有一个主键。比如,一条记录包括身份证号、姓名、年龄。身份证号是能确定这个人的唯一标识,其他都可能有重复,所以身份证号可以是主键,或者也可以指定一个唯一ID作为主键。

外键是能确定另一张表记录的字段,用于保持数据的一致性,其可以有重复的,一个表可以有多个外键,外键用于和其他表建立关联。

如果一个字段X在一张表(表1)中是主关键字(主键),而在另外一张表(表2)中不是主关键字(主键),则字段X称为表2的外键。

关于建立和声明上述的映射关系,可以采用公知技术。更具体的,建立涉及主键、外键、列和字段等方面的映射关系,例如可以通过@TableId、@Column注解标识所述的映射关系,这对于本领域技术人员来说是容易做到的,这里不再举例和赘述。

S3:基于命名映射规则,利用注解中的待绑定从对象的实体类名来得到该待绑定从对象在数据库中的数据表名,或者通过@Table注解获得指定的该待绑定从对象在数据库中的数据表名。

一般情况下,数据库表列名与实体的类名属性名命名之间有固定的映射规则,如驼峰式命名转换为小写下划线的蛇形命名,WorkExperience映射为work_experience。此时,基于命名映射规则,就能够利用注解中的待绑定从对象的实体类名来得到该待绑定从对象在数据库中的数据表名,例如注解中的待绑定从对象的实体类名是WorkExperience,利用骆峰式命名法规则,可以知道该待绑定从对象在数据库中的数据表名为work_experience。但在某些场景下,编程人员有可能没有按命名映射规则对从对象的实体类名和在数据库中的数据表名进行命名,或者说,从对象的实体类名和在数据库中的数据表名进行命名不符合命名映射规则,此时可以通过@Table注解获得指定的该待绑定从对象在数据库中的数据表名。

S4:对注解中的关联条件进行解析以得到关联条件中的主对象在数据库中对应的数据表的列名,基于命名映射规则得到所述主对象的数据表的列名所对应的属性名和待绑定从对象在数据库中对应的数据表的列名。例如注解中的待绑定从对象的属性名是departmentId,利用骆峰式命名法规则,可以知道该待绑定从对象在数据库中的数据表的列名为department_id。

所述关联条件是从对象的实体类名或某个属性字段。举一个例程进行说明。

所述关联条件可以是部门名称、员工档案、员工履历等,其中从对象的实体类名例如是EmployeeProfile,从对象的属性字段例如是department_id。

对注解中的关联条件进行解析,在这个例程里,例如已知@BindEntity(entity=EmployeeProfile.class,condition=”this.id=employee_id”),通过注解中的关联条件entity=EmployeeProfile.class,基于命名映射规则可以得知待绑定从对象的实体类是EmployeeProfile。通过注解定义中的condition="this.id=employee_id"(为了便于区分主对象列还是从对象列,可以给主对象列添加this.前缀),可以解析出关联条件中的主对象在数据库中对应的数据表的列名是id,基于命名映射规则,可以得到所述主对象的数据表的列名所对应的属性名是id字段,以及待绑定从对象在数据库中对应的数据表的列名employee_id。

S5:基于得到的所述主对象的数据表的列名所对应的属性名,通过反射机制得到该主对象的属性值。

继续上面的例子,基于得到的所述主对象的数据表的列名所对应的属性名,即id字段记录的信息,通过反射机制得到该主对象的属性值,例如借助Spring方法,

BeanWrapper wrapper=PropertyAccessorFactory.forBeanPropertyAccess(employeeVO);

return wrapper.getPropertyValue(“id”)。

S6:基于得到的待绑定从对象在数据库中的数据表名和列名,将得到所述主对象的属性值作为查询输入参数值,基于关联条件和外键约束规则能够查询到该待绑定从对象的在对应所述数据表名的数据表中的列值匹配于该查询输入参数值的相应列的全部记录信息,利用反射机制将查询结果赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

先介绍一下外键约束规则,即具有关联关系的两个表之间需要满足:一张表的外键是另一张表的主键,且外键值与主键值匹配。

在使用上,从表数据依赖于主表,主表含有主键,从表含有外键,主表可用于存储主要信息,如客户资料(客户编号,客户名称,客户公司,客户单位等),从表用来存储客户扩展信息(客户订单信息,客户地址信息,客户联系方式信息等)。

由于前面介绍的可知,所述主对象的属性值在主表中是主键,又是从表中的外键,即所述主对象的属性值与从对象的属性值相同,这样基于所得到的待绑定从对象在数据库中的数据表名和列名,将得到所述主对象的属性值作为查询输入参数值,基于关联条件和外键约束规则能够查询到该待绑定从对象的在对应所述数据表名的数据表中的列值匹配于该查询输入参数值的相应列的全部记录信息。

继续上面的例子,假设所述主对象的属性值为1,则将1作为输入参数值,基于得到的待绑定从对象在数据库中的数据表名employee_profile和列名employee_id就能查询该待绑定从对象的在对应所述数据表名的数据表中的employee_id列值等于1的全部记录信息,即员工档案对象数据。

再利用反射机制将查询结果赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。也就是说,通过反射机制,将查询到的employee_id为1的员工档案对象数据赋值给所述主对象中注解对应的属性,这样就实现了主对象和关联的从对象之间的绑定。

在实际编程过程中,在赋值之前,需要将数据库的对象数据格式转换为Java对象EmployeeProfile,再通过反射机制将EmployeeProfile的员工档案对象数据赋值给该注解对应的属性employeeProfile。如借助Spring:

BeanWrapper wrapper=PropertyAccessorFactory.forBeanPropertyAccess(employeeVO);

wrapper.setPropertyValue(“employeeProfile”,employeeProfile)。

在一个优选实施例中,当查询的匹配列值归属于从对象的多个数据表时,先将查询的全部记录信息转换为从对象的数据集合,再通过反射机制将该数据集合赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

在上面示例的例程中,workExperienceList属性上有@BindEntityList注解:

@BindEntityList(entity=WorkExperience.class,condition=”this.id=employee_id”)。

关联条件是:WorkExperience,执行上述步骤S3-S6,可以得到work_experience表全部的工作履历数据,将其转换为Java对象集合List,再通过反射机制将List的工作履历对象数据赋值给该注解对应的属性workExperienceList,例如借助Spring:

BeanWrapper wrapper=PropertyAccessorFactory.forBeanPropertyAccess(employeeVO);

wrapper.setPropertyValue(“workExperienceList”,workExperienceList)。

下面也通过示例来说明关联条件是从对象的某个属性字段情况的绑定过程。

在上面示例的例程中,departmentName属性上有@BindEntityList注解:

@BindField(entity=Department.class,condition=”this.department_id=id”,field=”name”)

关联条件是:Department,执行上述步骤S3-S6,可以得到departmentId字段记录的部门名称,假设为“研发部”,并通过查询得到name为“研发部”的全部记录数据,再通过反射机制将”研发部”的数据赋值给departmentName属性,例如:

BeanWrapper wrapper=PropertyAccessorFactory.forBeanPropertyAccess(employeeVO);

wrapper.setPropertyValue(“departmentName”,departmentName)。

根据本发明提供的一种绑定关联对象的方法,其能够带来的优点:

1、通过注解声明对象间的关联方式,开发人员仅需要关注对象间的关联条件,极大地降低了开发难度。

2、该方法对比传统的对象关联场景的SQL代码编写,大大减少了SQL的代码量,使得代码出错率更低,更容易维护。

3、因该方法的实现是将复杂关联查询拆解为多个简单查询,可以让缓存效率更高,有效减少锁竞争。

4、同时在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

图2是本发明第二实施例提供的绑定关联对象的装置的示意性框图。如图2所示,本发明第二实施例提供的绑定关联对象的装置包括:

注解定义模块1,用于自定义待绑定对象的注解并声明该注解的配置参数,该配置参数包括但不限于:该注解使用的范围、该注解的生命周期、该注解的继承、待绑定的从对象的类、关联条件、绑定字段;

声明模块2,用于声明待绑定主对象及其属性和从对象及其属性与数据库中的数据表及其列的映射关系;

数据处理模块3,用于基于命名映射规则,利用注解中的待绑定从对象的实体类名来得到该待绑定从对象在数据库中的数据表名,或者通过@Table注解获得指定的该待绑定从对象在数据库中的数据表名;对注解中的关联条件进行解析以得到关联条件中的主对象在数据库中对应的数据表的列名,基于命名映射规则得到所述主对象的数据表的列名所对应的属性名和待绑定从对象在数据库中对应的数据表的列名;基于得到的所述主对象的数据表的列名所对应的属性名,通过反射机制得到该主对象的属性值;

绑定执行模块4,用于基于得到的待绑定从对象在数据库中的数据表名和列名,将得到所述主对象的属性值作为查询输入参数值,基于关联条件和外键约束规则能够查询到该待绑定从对象的在对应所述数据表名的数据表中的列值匹配于该查询输入参数值的相应列的全部记录信息,利用反射机制将查询结果赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

其中,所述映射关系包括但不限于:主键、外键、列和字段的映射关系。

其中,所述关联条件是从对象的实体类名或某个属性字段。

其中,所述绑定执行模块工作时,当查询的匹配列值归属于从对象的多个数据表时,先将查询的全部记录信息转换为从对象的数据集合,再通过反射机制将将该数据集合赋值给所述主对象中注解对应的属性以实现对关联对象的绑定。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述第二实施例描述的装置的具体工作过程,可以参考前述第一实施例中的对应过程,前述第一实施例及相应的优选实施例中列举的例子和相关描述,同样适用于解释第二实施例描述的装置的工作过程,在此不再重复描述。

根据本发明提供的一种绑定关联对象的装置,其能够带来的优点:

1、通过注解声明对象间的关联方式,开发人员仅需要关注对象间的关联条件,极大地降低了开发难度。

2、该方法对比传统的对象关联场景的SQL代码编写,大大减少了SQL的代码量,使得代码出错率更低,更容易维护。

3、因该方法的实现是将复杂关联查询拆解为多个简单查询,可以让缓存效率更高,有效减少锁竞争。

4、同时在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

以上已参照图1和图2描述了根据本申请示例性实施例的绑定关联对象的方法和装置。然而,应理解的是:附图2所示出的装置及其单元模块可被分别配置为执行特定功能的软件、硬件、固件或上述项的任意组合。例如,这些装置或单元模块可对应于专用的集成电路,也可对应于纯粹的软件代码,还可对应于软件与硬件相结合的模块。此外,这些装置或单元模块所实现的一个或多个功能也可由物理实体设备(例如,处理器、客户端或服务器等)中的组件来统一执行。

此外,上述配置数据管理方法可通过记录在计算可读介质上的程序来实现,例如,根据本申请示例性实施例,可提供一种计算机可读存储介质,其中在所述计算机可读存储介质上记录有当被处理器执行时实现如第一实施例所述的方法或其与相应优选实施例的组合所述的方法的计算机程序。另外,还可提供一种计算机可读存储介质,其中在所述计算机可读存储介质上记录有当被处理器执行时实现如第二实施例所述的方法或其与相应优选实施例的组合所述的方法的计算机程序。

上述计算机可读存储介质中的计算机程序可在诸如客户端、主机、代理装置、服务器等计算机设备中部署的环境中运行,应注意,所述计算机程序还可用于执行除了上述步骤以外的附加步骤或者在执行上述步骤时执行更为具体的处理,这些附加步骤和进一步处理的内容已经在参照图1和2进行相关方法的描述过程中提及,因此这里为了避免重复将不再进行赘述。

此外,上述配置数据管理方法还可以通过记录在计算装置上的程序来实现。该计算装置包括存储部件和处理器,存储部件中存储有计算机可执行指令集合,当所述计算机可执行指令集合被所述处理器执行时,执行如第一实施例所述的方法步骤或其与相应优选实施例的组合所述的方法步骤;或者执行如第二实施例所述的方法步骤或其与相应优选实施例的组合所述的方法步骤。

具体说来,所述计算装置可以部署在服务器或客户端中,也可以部署在分布式网络环境中的节点装置上。此外,所述计算装置可以是PC计算机、平板装置、个人数字助理、智能手机、web应用或其他能够执行上述指令集合的装置。

这里,所述计算装置并非必须是单个的计算装置,还可以是任何能够单独或联合执行上述指令(或指令集)的装置或电路的集合体。计算装置还可以是集成控制系统或系统管理器的一部分,或者可被配置为与本地或远程(例如,经由无线传输)以接口互联的便携式电子装置。

在所述计算装置中,处理器可包括中央处理器(CPU)、图形处理器(GPU)、可编程逻辑装置、专用处理器系统、微控制器或微处理器。作为示例而非限制,处理器还可包括模拟处理器、数字处理器、微处理器、多核处理器、处理器阵列、网络处理器等。

根据本申请示例性实施例的方法中所描述的某些操作可通过软件方式来实现,某些操作可通过硬件方式来实现,此外,还可通过软硬件结合的方式来实现这些操作。

处理器可运行存储在存储部件之一中的指令或代码,其中,所述存储部件还可以存储数据。指令和数据还可经由网络接口装置而通过网络被发送和接收,其中,所述网络接口装置可采用任何已知的传输协议。

存储部件可与处理器集成为一体,例如,将RAM或闪存布置在集成电路微处理器等之内。此外,存储部件可包括独立的装置,诸如,外部盘驱动、存储阵列或任何数据库系统可使用的其他存储装置。存储部件和处理器可在操作上进行耦合,或者可例如通过I/O端口、网络连接等互相通信,使得处理器能够读取存储在存储部件中的文件。

此外,所述计算装置还可包括视频显示器(诸如,液晶显示器)和用户交互接口(诸如,键盘、鼠标、触摸输入装置等)。计算装置的所有组件可经由总线和/或网络而彼此连接。

根据本申请示例性实施例的方法所涉及的操作可被描述为各种互联或耦合的功能块或功能示图。然而,这些功能块或功能示图可被均等地集成为单个逻辑装置或按照非确切的边界进行操作。

尽管以上描述了本申请的示例性实施例,但是应理解:上述描述仅是示例性的,并非穷尽性的。本申请不限于所披露的各示例性实施例,并且在不偏离本申请的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。因此,本申请的保护范围应该以权利要求的范围为准。

相关技术
  • 一种绑定关联对象的方法和装置
  • 一种关联对象的识别方法及装置
技术分类

06120112986336