一种ORM设计方法及装置

著录项
  • CN201810453017.0
  • 20180503
  • CN108845793A
  • 20181120
  • 蔡廷超;黄艳凤
  • 蔡廷超;其他发明人请求不公开姓名
  • G06/F830
  • G06/F830 G06/F1730

  • 广东省深圳市南山区南头中山西街34号
  • 广东(44)
摘要
本发明提出一种ORM设计方法及装置。主要设计思想如下:1)将任何DB表对应的实体类型看作是无区别的一种抽象类型,使用泛型作为面向对象方式接口方法传入的实体参数类型;2)将传入suid方法的泛型实体参数类型转换成对应的sql语句;3)根据传入的实体类型结构和反射机制自动将查询结果装配成对应的实体类型结构的结果。本发明涉及的装置至少包括:面向对象方式suid接口模块,对象转sql语句模块,底层接口操作DB及自动装配返回结果模块和上下文模块。开发人员只需要使用面向对象方式suid接口模块中的接口。本发明涉及的装置,编码复杂度C(n)为O(l)。使用统一的dao操作DB,即使需要完成的DB操作的JavaBean增加,也不用开发人员再写任何具体的dao实现。
权利要求

1.一种ORM设计方法,其特征在于,

将任何DB表对应的实体类型看作是无区别的一种抽象类型;

方法参数列表中实体类型参数使用泛型和返回值类型使用泛型(11),或者

方法参数列表中实体类型参数使用泛型(12);

方法应用在接口(13)或类中。

2.根据权利要求1所述方法,其特征在于,编码复杂度为0(1)。

3.根据权利要求1所述方法,其特征在于,使用方法参数列表中泛型实体参数类型生成对应的sql语句。

4.根据权利要求1所述方法,其特征在于,使用方法参数列表中泛型实体参数类型自动将查询结果装配成对应的实体类型结构的结果。

5.根据权利要求1所述方法,其特征在于,类或接口层次没有实体类型参数或泛型参数。

6.根据权利要求1所述方法,其特征在于,实体JavaBean文件可以与DB表对应,也可以与视图对应。

7.根据权利要求1所述方法,其特征在于,不需要实体JavaBean与数据库表的映射文件,实体JavaBean不需要注解。

8.一种ORM装置,其特征在于,包括:

面向对象方式suid接口模块(31),提供面向对象方式操作DB的接口,提供与SQL语句对应的查询、更新、插入与删除对应的接口方法;该模块还包括接口的实现类;

对象转sql语句模块(32),使用传入的泛型实体参数类型转换成对应的sql语句;

底层接口操作DB及自动装配返回结果模块(33),使用对象转sql语句模块转换得来的sql语句或用户直接传入的语句调用底层接口操作DB;可以根据传入的泛型实体参数类型将查询结果装配成对应的实体模型结构的结果;

上下文模块(34)用于存放本发明涉及装置的相关配置信息和使用到的上下文件信息。

9.根据权利要求8所述的装置,其特征在于,

开发人员只需使用面向对象方式suid接口模块(31)完成面向对象方式操作数据库,其它模块不需要直接使用;

编码复杂度为O(1)。

10.根据权利要求8所述的装置,其特征在于,通过以下步骤完成面向对象方式操作数据库:

步骤一,传入实体类型对象到面向对象方式suid接口模块(31)的相应方法;

步骤二,根据实体类型对象生成对应的sql语句;

步骤三,将生成的sql语句传给底层操作DB的接口;若是查询类型方法,将实体类型对象也一起传给底层操作DB的接口,根据传入的实体对象类型对象和反射机制自动将查询结果装配成对应的实体类型结构的结果;

步骤四,返回生成的结果;

步骤二至步骤四是装置自动完成的;开发人员只需要使用步骤步骤一中的接口。

说明书
技术领域

本发明涉及计算机技术领域和软件技术领域,特别涉及一种实现对象关系映射(ORM)的方法及装置。

术语或简称说明:

ORM:对象关系映射(Object Relational Mapping)。ORM是面向对象编程中对象概念与关系数据库中表的概念进行映射对应;由此将直接对数据库的操作,改为用面向对象的方式进行操作,从而通过操作对象间接操作DB的表。实现ORM的装置应该具有自动转换向对象与关系数据库之间的数据格式或数据结构的功能。

方法:如下所示,类User有方法getName,setName。String name为方法setName的参数列表。有的计算机语言也称方法为函数。

DB:database,即数据库。

JDBC:Java数据库连接(Java DataBase Connectivity)Sun公司制定的一种Java数据库连接的Java API,可以为多种关系数据库提供统一访问接口。JDBC提供了一种标准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

MVC:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC将代码分为控制层,模型层和视图层。在大型软件开发中,这样划分有利于软件重用,容易维护,方便同时开发MVC各个部分。

JavaBean:一种包含类属性及其对应的get,set方法的java类文件。常用于与DB表对应的模型实体,也称为实体类型。

泛型:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。泛型将类型参数化可以达到代码复用提高软件开发效率的目的。Java泛型的参数可以是类或接口。

SUID:对数据库的SQL命令查询、更新、插入与删除(select、update、insert、delete)四种操作的简称(SUID为四种操作首字母)。

编码复杂度C(n):在MVC编程中,一般会涉及到action,service,dao,model(实体)。当用面向对象方式操作一个DB表时,要写一份dao;当操作两个表时,要写两份dao;当操作n个表时,要写n份dao;则此时编码的复杂度会随着问题规模增长为n,编码复杂度也变成n。关于问题n的编码复杂度(Coding Complexity)用C(n)表示。则上面描述的问题编码复杂度为:C(n)=O(n)。

Hibernate及Mybatis存在的问题:

实体JavaBean与DB表的map映射文件太多。

实体JavaBean文件注解用得太泛滥,太多注解难以记忆,增加开发人员负担。编码复杂度C(n)=O(n),即会随实体的增长,编码量呈线性增长。当n较大时,会增加许多人力物力消耗。

Hibernate,Mybatis想让ORM框架做完db所有的事情,使Hibernate,Mybatis框架本身增加复杂度。

Hibernate,Mybatis本来是为了解决直接操作数据库带来的烦锁重复工作,但Hibernate,Mybatis却引入了其它的烦锁工作,如编写过多的JavaBean与DB表的map映射文件,及JavaBean文件注解用得太泛滥,还影响性能。对于有一定sql基础的人,还用不上sql方面的经验。Hibernate还存在n+1查询问题。Mybatis需要写过多的sql语句,编写和调试sql语句需要大量时间,降低开发效率。

本发明旨在至少解决上述技术问题之一。

为此,本发明的一个目的在于提出一种解决上述问题的方法;另一个目的在于提出一种解决上述问题的装置。

为了实现上述第一个目的,本发明提出如下技术方案:

1)将任何DB表对应的实体类型看作是无区别的一种抽象类型,使用泛型作为面向对象方式接口方法传入的实体参数类型;类或接口层次不与具体实体类型耦合;

2)将传入suid方法的泛型实体参数类型转换成对应的sql语句;

3)根据传入的实体类型结构和反射机制自动将查询结果装配成对应的实体类型结构的结果;

4)不需要实体JavaBean与数据库表的映射文件,实体JavaBean不需要注解;

5)接口有具体的实现类,不用Java反射技术动态生成实现类,从而提高程序运行效率;

6)自动生成DB表对应的实体JavaBean文件;

7)可以使用sql语句直接调用底层接口操作DB;

8)实体JavaBean文件可以与DB表对应,也可以与视图对应。

为了实现上述第二个目的,本发明提出如下技术方案:

本发明涉及的装置至少包括:面向对象方式suid接口模块,对象转sql语句模块,底层接口操作DB及自动装配返回结果模块和上下文模块。面向对象方式suid接口模块是开发人员使用面向对象方式操作DB的接口,接口提供简单的且易于使用的查询、更新、插入与删除方法;该模块还包括接口的实现类。对象转sql语句模块将传入suid方法的泛型实体参数类型转换成对应的sql语句。底层接口操作DB及自动装配返回结果模块,使用对象转sql语句模块转换得来的sql语句或用户直接传入的语句调用底层接口操作DB;当是查询类型时,可以根据传入的泛型实体参数类型将查询结果装配成对应的实体模型结构的结果。上下文模块用于存放本发明涉及装置的相关配置信息和使用到的上下文件信息;如对象转sql语句模块在转换非标准的sql语句时,需要获取当前使用的具体数据库名称,以便转换成对应数据库的sql语句。

本发明达到的有益效果:

ORM的编码复杂度C(n)由O(n)变为O(1)。本发明的装置使用统一的dao操作DB,不用开发人员再写任何具体的dao实现。不需要JavaBean与数据库表的映射文件,降低程序所占用的内存资源,提高运行效率。JavaBean模型不再有注解,利于代码移植。开发人员只需关注本发明装置的面向对象方式suid接口的使用即可。当问题规模很大时,却不需要额外的劳动付出。

应用SQL模块接口,可以通过sql语句直接调用底层接口操作DB。这样可以满足系统数据处理量巨大,对性能要求极为苛刻,需要通过高度优化的SQL语句或存储过程才能达到系统性能设计指标的要求。

对于不公开真实DB表结构或复杂查询的场景,可以定义DB视图,JavaBean实体模型与视图对应映射解决。

不存在n+1查询问题。

图1,是使用泛型设计的面向对象方式的SUID(select、update、insert、delete)接口;

图2,是根据本发明一个实施例的ORM装置执行面向对象方式操作DB的流程图;

图3,是根据本发明一个实施例的ORM装置模块图;

图4,是根据本发明一个实施例的查询与访问缓存流程图。

本发明的具体实施方式提供一种ORM设计方法及装置。

下面通过结合附图描述的实施例(涉及具体语言描述时,采用Java语言描述)只是本发明的其中一种实施方式,而不能理解为对本发明的限制。

将任何DB表对应的实体类型看作是无区别的一种抽象类型,如图1所示。方法参数列表中实体类型参数使用泛型和返回值类型使用泛型(如图1中11所示),或者方法参数列表中实体类型参数使用泛型(如图1中12所示);方法应用在接口(如图1中13所示)或类中。类或接口层次没有实体类型参数或泛型参数(如图1中13所示)。接口有具体的实现类,不用Java反射技术动态生成实现类,从而提高程序运行效率。

本发明的具体实施方式提供一种ORM执行面向对象方式操作DB的流程图,如图2所示。

步骤21,传入实体类型对象到相应的Suid接口方法。

步骤22,根据实体类型对象生成对应的sql语句。可以利用反射原理实现,根据实体类型对象获取对应的类信息,包括字段、方法及字段对应的值。

步骤23,将生成的sql语句传给底层操作DB的接口。在Java语言中,可以使用JDBC访问数据库。其中对DB的操作可以用Statement,也可以用PreparedStatement;为防止SQL注入攻击,使用PreparedStatement,且可以提高执行效率;转换的sql语句要用占位的格式,且在该步骤中要将值与占位符对应顺序设置。若是查询类型方法,将实体类型对象也一起传给底层操作DB的接口,根据传入的实体对象类型对象和反射机制自动将查询结果装配成对应的实体类型结构的结果。

步骤24,返回生成的结果。

在本发明提供的ORM装置中,步骤22-步骤24是装置自动完成的;开发人员只需要使用步骤21中的接口。

本发明涉及的装置至少包括:面向对象方式suid接口模块31,对象转sql语句模块32,底层接口操作DB及自动装配返回结果模块33和上下文模块34。面向对象方式suid接口模块是开发人员使用面向对象方式操作DB的接口,接口提供简单的且易于使用的查询、更新、插入与删除方法;该模块还包括接口的实现类。对象转sql语句模块将传入suid方法的泛型实体参数类型转换成对应的sql语句。底层接口操作DB及自动装配返回结果模块,使用对象转sql语句模块转换得来的sql语句或用户直接传入的语句调用底层接口操作DB;当是查询类型时,可以根据传入的泛型实体参数类型将查询结果装配成对应的实体模型结构的结果。上下文模块用于存放本发明涉及装置的相关配置信息和使用到的上下文件信息;如对象转sql语句模块在转换非标准的sql语句时,需要获取当前使用的具体数据库名称,以便转换成对应数据库的sql语句。

各模块接口名称和实现类名称如下表所示:

Suid接口提供基本的select,update,insert,delete四种方法。SuidRich接口提供较为丰富的select,update,insert,delete相关的操作方法;但代码给出的只是部分实例,还可以根据实际需要添加相关接口方法。ObjToSQL接口负责为Suid生成对应的sql语句提供对应接口;ObjToSQLRich则与SuidRich对应。SQL接口则负责根据生成的sql语句,提供操作DB的接口。开发人员,可以只使用Suid和SuidRich接口就可以完成面向对象方式的DB操作,其余工作由本发明提供的装置完成。接口有具体的实现类,不用Java反射技术动态生成实现类,从而提高程序运行效率。

接口部分的Java代码如下所示。

Suid.java文件:

SuidRich.java文件:

ObjToSQL.java文件:

ObjToSQLRich.java文件:

SQL.java文件:

根据约定优于配置原则,数据库的表名及字段名和JavaBean的类名及属性名使用的命名规则,可以在两种名称之间通过转换对应。如DB字段的名称my_bee与JavaBean的属性名myBee可以互相转换,即DB下划线命名与Java驼峰命名可以自动转换。另外,推荐对应的数据库表名和JavaBean类名,对应的数据库表的字段名和JavaBean属性名使用一样的名字,在数据库与Java间不再需要作名称的转换。这样可以提高程序的运行效率。使用约定命名后,不再有DB表与JavaBean的map映射文件;JavaBean模型也不再需要注解。根据DB表的元数据信息,获取表的字段名及其类型,自动生成DB表对应的JavaBean文件。

本发明的装置,ORM的编码复杂度C(n)由O(n)变为O(1)。本发明的装置使用统一的dao操作DB,即使需要完成的DB操作的JavaBean增加,也不用开发人员再写任何具体的dao实现。不需要JavaBean与数据库表的映射文件,降低程序所占用的内存资源,提高运行效率。JavaBean模型不再有注解,利于代码移植。开发人员只需关注本发明装置的面向对象方式suid接口如何使用即可。当问题规模很大时,却不需要额外的劳动付出。接口有具体的实现类,不用Java反射技术动态生成实现类,从而提高程序运行效率。

当开发人员需要使用自己定义的sql语句时,可以直接使用底层接口操作DB及自动装配返回结果模块33中的接口。如举例的SQL.java文件的接口。这样可以满足系统数据处理量巨大,对性能要求极为苛刻,需要通过高度优化的SQL语句或存储过程才能达到系统性能设计指标的要求。

对于不公开真实DB表结构或复杂查询的场景,可以定义DB视图,JavaBean实体模型与视图对应映射,即可解决相应问题。

ORM不可能做完db所有的事,ORM不应被面向对象束缚,DB表与JavaBean的映射关系,不用完全转换为面向对象的方式。如多表的外键关联,可以使用视图辅助查询,只将其中的视图转换为一个JavaBean即可。

本发明涉及的装置具有批处理功能和事务处理功能。其中一个实施方式,可以封装底层JDBC的批处理和事务处理功能。

本发明涉及的装置与redis配合使用,实现分布式缓存的功能。当执行一个查询操作时,首先访问缓存,或缓存有所要的结果,则直接返回相应的结果;若缓存没有所要的结果,则通过查询数据库返回结果,同时将得到的结果存入缓存中。

由于本发明涉及的装置的设计特点,不会存在n+1查询问题。

尽管已经示出和描述了本发明的实施例,但并不用于限制本发明申请。对于本领域的技术人员来说,在本申请可以有各种更改和变化,包括实现的计算机语言不同。在不脱离本发明的原理和设计思想的情况下,对这些实施例进行多种变化、修改、替换和变型等,均应包含在本发明申请的权利要求范围之内。

本文发布于:2024-09-24 00:21:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/72945.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议