一种基于Monad的持久层复合条件查询方法与存储介质与流程

文档序号:20684949发布日期:2020-05-08 18:45阅读:170来源:国知局
一种基于Monad的持久层复合条件查询方法与存储介质与流程

本发明属于计算机领域,尤其涉及一种于monad的持久层复合条件查询方法与存储介质。



背景技术:

当前,随着互联网规模的急剧增长,越来越多的企业更看重软件应用的开发速率以争取在激烈的市场竞争中占得先机,在实际软件开发过程中,软件应用需要频繁的对数据库中的记录进行查询和更新操作,也就是说,实现数据库交互的代码的工作量所占据的比例不容小觑,软件开发人员会花费大量的时间去编写数据库交互的代码。

数据在应用系统中以对象的形式存在,而在数据库中表现为带有关系的元组,所以在应用中与数据库交互时需要将对象转换为关系型数据并结合数据库能识别的sql语句进行操作,由于与数据库交互是非常频繁的操作,所以在开发过程中必然伴随大量重复的转换工作,而持久层框架作为关系型数据库与面向对象语言之间”阻抗不匹配”矛盾的一种解决方案被广泛使用,持久层在应用层与数据库之间建立表与对象之间的映射关系,通过持久层框架实现将对对象的操作转换为sql与数据库交互,一定程度上降低重复繁琐的工作量、提升程序的可扩展性、移植性,目前,被广泛使用的持久层框架有mybatis与hibernate,本文将在mybatis的基础之上结合两种持久层框架的优点设计一种更加灵活、有助于提升开发效率的持久层工具。

主流的持久层框架可以按照使用风格分为两种,一种是以hibernate为代表的全自动持久层框架,hibernate为开发人员提供通过使用javaapi构建sql语句的方式与数据库交互,另一种是mybatis为代表的半自动持久层框架,mybtais需要开发人员手动记录需要的sql语句,mybatis提供参数与执行结果的自动封装、动态sql与sql集中管理等功能简化开发工作量和降低耦合性。

hibernate是一个全自动的持久层框架,也是目前较为流行的持久层框架,它通过将数据库资源映射为对象模型,将面向数据库资源的各种业务操作以对象的属性和方法展示,使开发人员将更多的精力放在业务逻辑的实现上,不必在意直接与数据库交互的细节问题,如数据库sql差异等,hibernate目前是面向对象思想体现得最完善的一种持久层框架,同时也是最符合jpa规范的。

mybatis是一个半自动化的持久层框架,它在持久层为数据库中的表与业务层中的对象建立映射关系,从而实现操作对象与数据库交互。其核心思想是通过xml文件集中式的记录管理sql语句,每条sql语句都存在id与对应接口中的方法绑定,同时,通过配置带入的参数类型与返回的参数类型,mybatis为其自动封装实体类参数与结果,总的来说,mybatis是一种半自动化的orm框架,对于熟练使用面向对象编程的程序开发人员来说,通过mybatis来操作对象就可以对关系数据库进行操作,这一点和hibernate是一样的,但是最主要的不同之处在于mybatis需要自己配置接口sql接口文件与装载sql的xml文件,并建立两个文件中方法与sql的对应关系:

mybatis需要多个映射文件并手动在xml文件中记录需要的sql语句才可以实现关系对象映射的功能,这种实现方式较为灵活、实现的难度也较低,但是在数据库迁移的时候可能由于语法问题修改大量的配置文件。

hibernate为业务层提供操作数据库的javaapi,但是由于对底层封装得过于彻底,并没有提供可以对生成sql进行优化的接口,所以,对于后期可能存在的并发量提升所带来的性能瓶颈无能为力,只能通过更换持久层框架来解决,造成大量可以避免的资源消耗,增加维护与优化的成本。

mybatis为开发人员提供灵活可配置的sql定制功能,开发人员可以根据自己的需求修改、优化底层的sql语句,但是在开发过程中,存在以下问题。

1)需要映射的文件较多,每个实体类都会对应相应的sql接口与xml文件,同时,增加一个方法也需要同时修改sql接口文件与xml文件,在开发阶段,频繁增加方法存在大量的工作量。

2)无法适应多条件组合的灵活查询需求,查询操作可能存在多个字段组合的情况,且字段可能存在不同的查询方式,比如范围查询、相等查询、模糊查询等,所以对于一个实体,查询的方式可能是极多的,对于n个字段的实体,如果以两个字段组合为一个方法的话,那么存在种可能,如果是任意数量的字段组合且考虑字段查询的方式的话,存在的可能更多。



技术实现要素:

本发明旨在解决以上现有技术的问题。提出了一种基于monad的持久层复合条件查询方法与存储介质。本发明的技术方案如下:

一种基于monad的持久层复合条件查询方法,其所述持久层在mybatis基础上增加linq风格的查询模块;通过动态生成单表sql的基础注解与sql双向同步机制,通过链式api调用取代部分接口方法与xml文件的手动录入,查询方法包括以下步骤:

步骤1、将查询操作符大致分为单表与多表查询两种类型,分别进行单表操作和多表级联查询;

步骤2、将步骤1中的查询数据转换为持久层框架mybatis底层能够识别的sql资源对象,通过继承并重写mybatis的注册器并在其中对获取到的sql接口字节码对象判断,若其被基础数据操作注解修饰,则获取注解中单表对应实体类字节码,与基础操作方法结合mybatis动态sql组合生成mybatis能够识别的sql资源对象,并注册与保存在配置缓存中;

步骤3、通过对操作符生成的sql与sql管理模版的双向同步绑定提升sql后期的可扩展性,在使用操作符生成查询语句时,对操作符操作与生成的sql进行分析获取其唯一标识,判断其是否已经存在于配置对象的缓存中,若存在直接使用配置缓存中的sql,反之则将根据操作符生成sql资源对象并将其注册与记录与sql模板文件中,在项目运行期间,检测sql模板是否被改动,若被更新则进行热部署。

进一步的,步骤1中:对于单表操作,设计表示基础crud操作的四种基础注解对sql接口进行标识,注解属性包括单表对应实体类与命名风格转换在内的信息,框架本身通过反射获取属性信息生成单表增删查改的基础方法对应的资源对象并进行注册,基础方法默认是根据主键或者字段键值对进行筛选。

对于多表级联查询或者是多条件单表查询,结合monad模式设计出常用的操作符,为开发人员提供持久层框架内嵌的链式查询操作符,通过操作符避免由于查询参数的不同所导致频繁修改mybatis映射文件所带来的无意义工作,在项目启动期间分析操作符获取对应的sql与主键并将其记录在对应sql模版文件与注册在mybatis底层配置对象中,最大程度得复用mybatis的原有功能模块,比如底层sql执行、参数与结果实体类转换等。

进一步的,所述步骤2对于查询操作符实现的多条件或复杂sql查询,框架生成对应的虚拟实体类、sql对象与虚拟的方法名最后生成sql资源对象,并完成注册。

进一步的,在使用查询api构建查询并执行时,持久层根据链式调用的函数与调用函数的顺序结合生成一个sql编号,并在资源配置对象存储的sql编号集合中进行查找,如果其中存在,则调用其对应的sql语句并向其中填充参数,否则,说明当前查询在存储sql的xml文件中并不存在映射的sql记录,则结合jaxp中的sax向其中写入相应的sql记录,生成的sql格式按照mybatis的方式,持久层会判断在xml对应的配置缓存中是否已经链式查询映射的sql记录,如果不存在的话会在xml中写入查询sql并存入资源配置对象中,链式查询在xml文件中的映射sql记录的编号为查询调用方法按照顺序组合而成。

一种存储介质,该存储介质内部存储计算机程序,其所述计算机程序被处理器读取时,执行上述任一项的方法。

本发明的优点及有益效果如下:

1、本发明有助于在mybatis的基础之上构建一种更简便、快捷的灵活查询sql构建方式,使用这种查询方式构建sql在最大程度复用mybatis底层基础功能的同时,在构建多条件查询时可以避免大量的繁杂配置文件与为开发人员提供更有效的编译期错误检测,提升了开发的效率与降低了错误的概率。

2、相比较于传统hibernate对于多条件查询的解决方案,本发明中提出的sql双向同步机制可以有效的避免由于通过java动态生成sql所导致的后期扩展困难、sql管理过于分散等问题,通过该机制可以将传统的orm框架的优势结合起来,即避免了hibernate后期sql优化与扩展困难的问题,同时,也解决了mybatis在构建多条件查询时配置繁琐的问题。

本发明主要创新点为:实现了一种灵活、方便的查询sql构建方法,弥补了传统mybatis多条件查询构建需要大量配置的问题,能够提升项目开发的效率,同时,每个通过内置查询方法构建的sql都与存在对应的sql模版文件,并且通过双向同步机制保证sql可以实现双向同步更新,使用这种方式不会导致后期sql分散与优化困难等问题。

附图说明

图1是本发明提供优选实施例的结构示意图;

图2是本发明的主要功能流程图;

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、详细地描述。所描述的实施例仅仅是本发明的一部分实施例。

本发明解决上述技术问题的技术方案是:

通过构建灵活的内置sql查询工具与基础注解避免繁杂配置文件,本发明所述的持久层工具是在持久层框架mybatis的基础之上进行功能扩展实现的,为了更好的继承框架原有的sql管理模式、数据库连接管理等,以及考虑到第三方插件对原框架的功能扩展与优化等,它将最大程度得复用框架的原有功能模块,比如底层sql执行、参数与结果实体类转换等。

mybatis分为执行器、类型转换、sql节点、sql生成器等模块,mybatis会读取xml中的sql语句并存入sql资源配置对象中,再根据调用的方法生成编号匹配对应的sql语句,同时,对传入的参数进行类型转换填充具体的sql语句等,最后执行sql并将结果进行实体类参数转换。

而本发明中提出的持久层工具在mybatis基础上增加了linq风格的查询模块、支持动态生成单表sql的基础注解与sql双向同步机制,通过链式api调用取代部分接口方法与xml文件的手动录入,简化流程、降低工作量实现提升开发效率,同时,通过sql双向同步机制避免后期sql优化困难的问题。

本发明中的查询功能的主要目的是为了让开发人员避免由于查询参数的不同所导致频繁修改mybatis映射文件所带来的无意义工作,查询功能借鉴monad模式设计并实现了一种类似linq风格的链式调用达到针对任意数量字段的多条件查询功能,mybatis主要组件包括结果实体处理器resultsethandler、执行器executor、类型转换器typehandler与资源配置对象均为mybatis自身提供的组件,通过继承和组合的方式复用并扩展其功能,使其扩展部分可以满足问本发明中查询功能的使用,具体的使用如下:

queryconfig.getquery(user.class).andeq("name","zhangsan").andlike("address","cq").getresult(),其中queryconfig作为查询配置类,主要为指定的实体类或者联合多表查询对象生成对应的查询对象,再调用相关条件构建函数,如上所示,结合monad模式实现链式调用并生成相应的sql,在获取相关信息生成sql资源对象注册在mybatis中,最后,通过resultsethandler的实现类queryresulthandler实现数据与实体类数据之间的类型转换,由mybatis执行底层与数据库交互等相关功能,另外,实现单表的多条件快速查询,针对多表查询也有相应的查询api可供调用,主功能流程设计如图2所示,其中操作符操作如下所示:

queryconfig.leftjoinquery(queryconfig.getquery(user.class).getquery(),queryconfig.getquery(unit.class).getquery(),).andon(“unit”,”unit”).andlefteq(“name”,”zhangsan”).getresult();

通过getquery()获取单表查询的查询对象并将其作为参数带入leftjoinquery()中实现量表联合查询,联合查询的实现使用了monad模式对细粒度的操作符进行组合,对于多表联合查询只需要将表查询对象两两之间进行组合并获取查询对象作为leftjoinquery()的参数执行即可,但是对于过于复杂的sql通过api链式调用虽然可以实现其功能,过于复杂繁琐的api调用从程序代码的可读性上并不令人满意,所以,还是需要与mybatis的原生sql模版功能互补使用才能更快更好得完成开发。

通过双向sql同步机制可以避免类似hibernate通过api生成的sql无法优化所导致的后期性能瓶颈,通过这种机制可以有效地将查询api的便捷性与sql模版的灵活性结合在一起,将hibernate与mybatis优势互补实现高效、灵活的查询。

在使用查询api构建查询并执行时,持久层会根据链式调用的函数与调用函数的顺序结合生成一个sql编号,并在资源配置对象存储的sql编号集合中进行查找,如果其中存在,则调用其对应的sql语句并向其中填充参数,否则,说明当前查询在存储sql的xml文件中并不存在映射的sql记录,则结合jaxp中的sax向其中写入相应的sql记录,生成的sql格式按照mybatis的方式,便于开发人员理解,持久层会判断在xml对应的配置缓存中是否已经链式查询映射的sql记录,如果不存在的话会在xml中写入查询sql并存入资源配置对象中,这样就可以在避免繁琐更改配置文件的工作量的同时,使生成的查询sql具备可优化的潜力,避免其成为在后期用户访问量剧增后的性能瓶颈,同时,链式查询在xml文件中的映射sql记录的编号为查询调用方法按照顺序组合而成,这样便于开发人员在对sql进行优化时可以快速根据链式查询找到对应的sql记录,同时,本文中提出的持久层也为开发人员提供自定义sql编号的功能,开发人员可以根据开发团队的命名规范对查询进行自定义定制,如下所示:

queryconfig.getquery(user.class,”queryuserbynameandaddress”).andeq("name","zhangsan").andlike("address","cq").getresult(),如上所示,在获取查询对象时为其设置编号”queryuserbynameandaddress”,使其生成的sql记录的编号与mybatis中接口方法中命名风格类似,从整体上,向mybatis风格靠拢,便于同团队内其他成员理解,也有利于后期维护人员对应的快速适应与熟悉。

另外,由于复用了mybatis中配置对象、配置xml文件的读取,所以,再减少了部分工作量的同时,也使查询映射xml文件具备了热部署的功能,在程序运行期间根据编辑了的xml文件动态得更新资源配置对象中的sql数据,实现动态优化sql。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来完成,该程序可以存储于计算机可读存储介质中,存储介质可以包括:rom、ram、磁盘或光盘等。

以上这些实施例应理解为仅用于说明本发明而不用于限制本发明的保护范围。在阅读了本发明的记载的内容之后,技术人员可以对本发明作各种改动或修改,这些等效变化和修饰同样落入本发明权利要求所限定的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1