CN108845793B - 一种orm设计方法及装置 - Google Patents
一种orm设计方法及装置 Download PDFInfo
- Publication number
- CN108845793B CN108845793B CN201810453017.0A CN201810453017A CN108845793B CN 108845793 B CN108845793 B CN 108845793B CN 201810453017 A CN201810453017 A CN 201810453017A CN 108845793 B CN108845793 B CN 108845793B
- Authority
- CN
- China
- Prior art keywords
- interface
- type
- entity
- entity type
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明提出一种ORM设计方法及装置。主要设计思想如下:1)将任何DB表对应的实体类型看作是无区别的一种抽象类型,使用泛型作为面向对象方式接口方法传入的实体参数类型;2)将传入suid方法的泛型实体参数类型转换成对应的sql语句;3)根据传入的实体类型结构和反射机制自动将查询结果装配成对应的实体类型结构的结果。本发明涉及的装置至少包括:面向对象方式suid接口模块,对象转sql语句模块,底层接口操作DB及自动装配返回结果模块和上下文模块。开发人员只需要使用面向对象方式suid接口模块中的接口。本发明涉及的装置,编码复杂度C(n)为O(l)。使用统一的dao操作DB,即使需要完成的DB操作的JavaBean增加,也不用开发人员再写任何具体的dao实现。
Description
技术领域
本发明涉及计算机技术领域和软件技术领域,特别涉及一种实现对象关系映射(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)=0(n)。
Hibernate及Mybatis存在的问题:
实体JavaBean与DB表的map映射文件太多。
实体JavaBean文件注解用得太泛滥,太多注解难以记忆,增加开发人员负担。
编码复杂度C(n)=0(n),即会随实体的增长,编码量呈线性增长。当n较大时,会增加许多人力物力消耗。
Hibernate,Mybatis想让ORM框架做完db所有的事情,使Hibernate,Mybatis框架本身增加复杂度。
Hibernate,Mybatis本来是为了解决直接操作数据库带来的烦锁重复工作,但Hibernate,Mybatis却引入了其它的烦锁工作,如编写过多的JavaBean与DB表的map映射文件,及JavaBean文件注解用得太泛滥,还影响性能。对于有一定sql基础的人,还用不上sql方面的经验。Hibernate还存在n+l查询问题。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)由0(n)变为0(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,如图3所示。面向对象方式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代码如下所示。
根据约定优于配置原则,数据库的表名及字段名和JavaBean的类名及属性名使用的命名规则,可以在两种名称之间通过转换对应。如DB字段的名称my_bee与JavaBean的属性名myBee可以互相转换,即DB下划线命名与Java驼峰命名可以自动转换。另外,推荐对应的数据库表名和JavaBean类名,对应的数据库表的字段名和JavaBean属性名使用一样的名字,在数据库与Java间不再需要作名称的转换。这样可以提高程序的运行效率。使用约定命名后,不再有DB表与JavaBean的map映射文件;JavaBean模型也不再需要注解。根据DB表的元数据信息,获取表的字段名及其类型,自动生成DB表对应的JavaBean文件。
本发明的装置,ORM的编码复杂度C(n)由0(n)变为0(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配合使用,实现分布式缓存的功能。如图4所示,当执行一个查询操作时,首先访问缓存,若缓存有所要的结果,则直接返回相应的结果;若缓存没有所要的结果,则通过查询数据库返回结果,同时将得到的结果存入缓存中。
由于本发明涉及的装置的设计特点,不会存在n+1查询问题。
尽管已经示出和描述了本发明的实施例,但并不用于限制本发明申请。对于本领域的技术人员来说,在本申请可以有各种更改和变化,包括实现的计算机语言不同。在不脱离本发明的原理和设计思想的情况下,对这些实施例进行多种变化、修改、替换和变型等,均应包含在本发明申请的权利要求范围之内。
Claims (5)
1.一种ORM设计方法,包括:函数应用在接口或类中,其特征在于,包括:
面向对象方式操作DB的suid接口,具有与SQL对应的查询、更新、插入与删除的接口函数,还包括接口的实现类;
对象转sql语句,使用传入的泛型实体类型参数转换成对应的sql语句;
底层接口操作DB及自动装配返回结果,使用对象转sql语句转换得来的sql语句或用户直接传入的语句调用底层接口操作DB;根据传入的泛型实体类型参数将查询结果装配成对应的实体类型结构的结果;
suid接口将任何DB表对应的实体类型看作是无区别的一种抽象类型;函数参数列表中实体类型参数使用泛型和返回值类型使用泛型,或者函数参数列表中实体类型参数使用泛型;类或接口层次没有实体类型参数或泛型参数,类或接口层次不与具体实体类型耦合;仅通过函数传递实体类型参数;不需要从函数参数或函数名传递实体类型的其它信息;
编码复杂度为O(1)。
2.根据权利要求1所述方法,其特征在于,实体JavaBean文件与DB表对应或与视图对应。
3.根据权利要求1所述方法,其特征在于,不需要实体JavaBean与数据库表的映射文件,实体JavaBean不需要注解。
4.一种ORM装置,包括:上下文模块(34)用于存放所述装置的相关配置信息和使用到的上下文信息,其特征在于,包括:
面向对象方式suid接口模块(31),提供面向对象方式操作DB的接口,提供与SQL对应的查询、更新、插入与删除的接口函数;该模块还包括接口的实现类;
对象转sql语句模块(32),使用传入的泛型实体类型参数转换成对应的sql语句;
底层接口操作DB及自动装配返回结果模块(33),使用对象转sql语句模块转换得来的sql语句或用户直接传入的语句调用底层接口操作DB;根据传入的泛型实体类型参数将查询结果装配成对应的实体类型结构的结果;
面向对象方式suid接口模块(31)中,suid接口将任何DB表对应的实体类型看作是无区别的一种抽象类型;函数参数列表中实体类型参数使用泛型和返回值类型使用泛型,或者函数参数列表中实体类型参数使用泛型;类或接口层次没有实体类型参数或泛型参数,类或接口层次不与具体实体类型耦合;
仅通过函数传递实体类型参数;不需要从函数参数或函数名传递实体类型的其它信息;开发人员只需使用面向对象方式suid接口模块(31)完成面向对象方式操作数据库,其它模块不需要直接使用;
编码复杂度为O(1)。
5.根据权利要求4所述的装置,其特征在于,通过以下步骤完成面向对象方式操作数据库:
步骤一,传入实体类型对象到面向对象方式suid接口模块(31)的相应函数;
步骤二,根据实体类型对象生成对应的sql语句;
步骤三,将生成的sql语句传给底层操作DB的接口;若是查询类型函数,将实体类型对象也一起传给底层操作DB的接口,根据传入的实体对象类型对象和反射机制自动将查询结果装配成对应的实体类型结构的结果;
步骤四,返回生成的结果;
步骤二至步骤四是装置自动完成的;开发人员只需要使用步骤一中的接口。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810453017.0A CN108845793B (zh) | 2018-05-03 | 2018-05-03 | 一种orm设计方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810453017.0A CN108845793B (zh) | 2018-05-03 | 2018-05-03 | 一种orm设计方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108845793A CN108845793A (zh) | 2018-11-20 |
CN108845793B true CN108845793B (zh) | 2022-04-15 |
Family
ID=64212988
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810453017.0A Active CN108845793B (zh) | 2018-05-03 | 2018-05-03 | 一种orm设计方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108845793B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111159198B (zh) * | 2019-12-31 | 2024-04-19 | 中国银行股份有限公司 | 参数交易处理方法及装置、计算机设备及可读存储介质 |
CN113722392A (zh) * | 2020-05-26 | 2021-11-30 | 北京达佳互联信息技术有限公司 | 数据同步方法和装置、数据同步系统、服务器、存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6163776A (en) * | 1998-03-23 | 2000-12-19 | Software Tree, Inc. | System and method for exchanging data and commands between an object oriented system and relational system |
CN103699620A (zh) * | 2013-12-19 | 2014-04-02 | 珠海世纪鼎利通信科技股份有限公司 | 面向对象中利用orm框架实现数据库操作的方法及系统 |
CN103870555A (zh) * | 2014-03-04 | 2014-06-18 | 赛特斯信息科技股份有限公司 | Spring data JPA实现动态查询的方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8601016B2 (en) * | 2011-08-30 | 2013-12-03 | International Business Machines Corporation | Pre-generation of structured query language (SQL) from application programming interface (API) defined query systems |
-
2018
- 2018-05-03 CN CN201810453017.0A patent/CN108845793B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6163776A (en) * | 1998-03-23 | 2000-12-19 | Software Tree, Inc. | System and method for exchanging data and commands between an object oriented system and relational system |
CN103699620A (zh) * | 2013-12-19 | 2014-04-02 | 珠海世纪鼎利通信科技股份有限公司 | 面向对象中利用orm框架实现数据库操作的方法及系统 |
CN103870555A (zh) * | 2014-03-04 | 2014-06-18 | 赛特斯信息科技股份有限公司 | Spring data JPA实现动态查询的方法 |
Non-Patent Citations (3)
Title |
---|
"ORM查询语言(OQL)简介--实例篇";深蓝医生;《https://www.cnblogs.com/bluedoctor/archive/2013/04/01/2992981.html》;20130401;正文第1-15页 * |
"基于IBatisNet(MyBatis.Net)的Repository";娃都会打酱油了;《https://blog.csdn.net/starfd/article/details/43482263》;20150204;正文第1-4页 * |
娃都会打酱油了."基于IBatisNet(MyBatis.Net)的Repository".《https://blog.csdn.net/starfd/article/details/43482263》.2015, * |
Also Published As
Publication number | Publication date |
---|---|
CN108845793A (zh) | 2018-11-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5937409A (en) | Integrating relational databases in an object oriented environment | |
US5295256A (en) | Automatic storage of persistent objects in a relational schema | |
US8429601B2 (en) | Code completion for object relational mapping query language (OQL) queries | |
US11526656B2 (en) | Logical, recursive definition of data transformations | |
WO2016123920A1 (zh) | 支持多类型数据库操作的集成接口的实现方法及系统 | |
US7289997B1 (en) | System and method for an extensible metadata driven application framework | |
US7007266B1 (en) | Method and software system for modularizing software components for business transaction applications | |
CN111125440B (zh) | 一种基于Monad的持久层复合条件查询方法与存储介质 | |
CN103049251B (zh) | 一种数据库持久层装置及数据库操作方法 | |
US20060282452A1 (en) | System and method for mapping structured document to structured data of program language and program for executing its method | |
CN113467785B (zh) | 一种拟态数据库的sql转译方法和系统 | |
CN102681852A (zh) | 基于JavaEE的敏捷开发方法 | |
CN108845793B (zh) | 一种orm设计方法及装置 | |
US7529764B2 (en) | GUI for data pipeline | |
CN113761040A (zh) | 数据库与应用程序双向映射方法、设备、介质及程序产品 | |
CN111782195A (zh) | 一种基于在请求参数上添加注解拼接成sql的查询方法 | |
CN111176658A (zh) | 基于元对象机制的AADL到Simulink模型自动转换方法 | |
CN116450110A (zh) | 基于自定义属性的数据库的访问代码自动生成方法及系统 | |
US20030233373A1 (en) | Method, computer program product, and system for automatic class generation with simultaneous customization and interchange capability | |
US20050154696A1 (en) | Pipeline architecture for data summarization | |
CN115687317B (zh) | 一种实现基于Java端多叉树对象增删改查服务的方法 | |
Troelsen et al. | Exploring Entity Framework Core | |
Monk | View definition in an object-oriented database | |
KR100309670B1 (ko) | 씨에이에스이모형정보스키마변환시스템 | |
Güting et al. | Secondo Programmer’s guide |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |