应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Springboot撞上NebulaGraphNGbatis

  本文首发于NebulaGraph公众号https:mp。weixin。qq。comsz56o6AEz1Z4RmS8Zdx6dTA
  大家好,我是开源项目NGbatis的发起人大叶(〔CorvusYeGitHub〕(https:github。comCorvusYe))。目前NGbatis也已成为NebulaGraph开源生态项目之一。在过去的4个月里,NGbatis从提交第一行代码以来,已经发布了3个版本,正在一步步变得越来越好。感谢一路同行的人们。
  这里给大家贴上仓库地址:https:github。comnebulacontribngbatis,欢迎大家在仓库下方留言提出建议反馈。一、目前有哪些参与者?
  其中,Szt1做了和SpringCloud和Nacos的兼容,liuxiaocs7完善了文档,soulgin做了Java与数据库之间属性别名的映射,Nicole00做了项目自动化与代码规范,weygu提了很多有利于项目发展的建议并做了国际化。DawnZzzzz、hejiahuichengxuyuan、yarodai与LiuTianyou则提了不少issues,issues让人获得不少灵感。
  可以说现阶段的NGbatis是使用者与开发者想法碰撞后的共同产物。二、什么是NGbatis?
  NGbatis是一款针对NebulaGraphSpringBoot的数据库ORM框架。借鉴于MyBatis的使用习惯进行开发。包含了一些类似于mybatisplus的单表操作,另外还有一些图特有的实体关系基本操作。
  如果是Java后端服务的开发人员,相信看到这里,大家对NGbatis的用途有了比较清晰的理解。接下来会从几个问题出发,跟读者们介绍NGbatis:关于NGbatis有哪些思考?NGbatis能做什么?NGbatis是怎么实现的?NGbatis怎么使用?三、关于NGbatis有哪些思考?Q:最原始的诉求是什么?A:与MyBatis相同,想实现GQL与Java代码的分离。Q:为什么不直接使用MyBatis集成?A:MyBatis遵循JDBC规范,而JDBC规范更适合于传统数据库,图数据库存在与传统数据库不同的、图特有的结构,如果采用JDBC规范,会受到一定局限。想为图数据库量身定制一款ORM,随着图数据库的发展,方便拓展。Q:是否可以基于JDBC拓展出GJDBC的规范?A:个人能力有限,不敢想,或许NebulaGraph官方可以考虑下。Q:为什么版本号从v1。1。0开始,缺失了v1。0。0的版本号?A:最开始的版本是用来适配Neo4j,后来选用了NebulaGraph,保留了一个不曾发布的小版本。第一次接触的NebulaGraph是v3。1。0,兼容性方面重点放在v3。1。0的版本
  以上,便是开发之初对NGbatis的一些方案选择的思考,做了一些取舍,是好处多一些还是坏处多一些,我自己目前也还在纠结中。比如说放弃JDBC的规范后也意味着放弃其背后的生态,比如说优秀的第三方连接池方案。
  纠结归纠结,既然做了决定,路还是要往下走。开胃菜上完了,也该上正餐了。四、NGbatis能做什么?
  一个项目诞生最恰当的理由是:想要用它解决一些问题。以解决问题为中心,可以让项目走得更远。NGbatis的任务就是尽可能地减少日常开发中或重复或繁琐的工作。在代码里频繁地做字符串字符串一遍一遍地重复处理ResultSet业务对象重复写单表基本的增、删、改、查在集成时,做过多配置,为什么万事就一定是开头难,简单点,集成的方式简单点需要关注与业务关系不是很密切的Session问题
  我们生活在一个基础设施相对完善的时代,好处在于问题产生的同时,答案的模型也同时存在,我们需要做的只是在问题与答案之间做适配,这里真诚地对作出贡献的前辈们表示感谢。
  以上问题就要求NGbatis需要做到以下几点:开箱即用,实现与Springboot、Springcloud的快速集成实现GQL与Java代码分离,使用XML统一管理使用模板引擎,解决GQL参数拼接繁琐、容易写错的问题实现ResultSet与Java对象根据属性名自动转换单表基本增、删、改、查以及分页本地Session管理,降低资源消耗
  方向有了,剩下的就是工程问题了。五、NGbatis是怎么实现的?
  我们最本质的要求就是:把GQL语句执行到NebulaGraph当中。我们以带参的HelloNebula为例,即:
  根据最朴素的Java开发方法,可以想到的是:先通过XML给GQL定义一个坐标,再定义一个接口,最后编写一个实现类按坐标读取GQL语句,使用模板引擎替换参数。即:XMLmappernamespacecom。example。dao。TestDaoselectidgreetRETURNHello{p0}selectmapperDAO接口packagecom。example。dao;publicinterfaceTestDao{Stringgreet(Stringwho);}DAO实现(伪代码)packagecom。example。dao;publicclassTestDaoImplimplementsTestDao{OverridepublicStringgreet(Stringwho){Object〔〕var2newObject〔〕{who};Stringnamespacecom。example。dao。TestDao;StringmethodNamegreet;有一个函数,可以完成以下事情:1。根据坐标读取GQL2。使用模板引擎完成参数拼接(Beetl)3。执行到数据库4。转换ResultSet形成业务对象returnfoo(namespace,methodName,var2);}}
  做到这里其实就剩下foo怎么编写的问题了。到这里,相信读者们都有自己的思路。大家有兴趣的话可以参考org。nebula。contrib。ngbatis。proxy。MapperProxy。
  但这里引入了另一个问题:每个dao的方法,写法基本是一样的,又带来了重复的工作,有悖于NGbatis的初衷。因此,使用动态代理,从XML与DAO信息中自动生成TestDaoProxy,这边使用的代理方案是基于字节码技术ASM来生成。上述的例子生成的字节码反编译后的结果如下:packagecom。example。dao;importorg。nebula。contrib。ngbatis。proxy。MapperProxy;publicclassTestDaoProxyimplementsTestDao{OverridepublicStringgreet(Stringvar1){Object〔〕var2newObject〔〕{var1};return(String)MapperProxy。invoke(com。example。dao。TestDao,greet,var2);}}
  因此,开发者便不需要再重复编写诸多TestDaoImpl,定义好XML与DAO,剩下的工作可以放心地交给NGbatis。
  最后剩下一个问题,参数替换问题:这个问题应该是与开发者关系最为密切的问题。所以,这里不得不提的模板引擎框架:Beetl是国内流行模板引擎,也是NGbatis一个重要的组成部分,链接是官网的API。在调用时,将入参json化成nebulajava可以接收的参数形式(List、Set、Map、字符串、基本类型。。。):{Stringhellodao。greet(Nebula);p0:Nebula}最后以XML内容为模板,进行替换:RETURNHello{p0}RETURNHelloNebula六、全局流程图
  七、NGbatis该如何集成到自己的Springboot项目添加依赖dependencygroupIdorg。nebulacontribgroupIdngbatisartifactIdversion1。1。0rcversiondependency配置NebulaGrpah数据库nebula:hosts:127。0。0。1:19669,ip:port,。。。。username:rootpassword:nebulaspace:testpoolconfig:minconnssize:0maxconnssize:10timeout:0idletime:0intervalidle:1waittime:0minclusterhealthrate:1。0enablessl:false添加扫描包以引入NGbatisbeanSpringBootApplication(exclude{DataSourceAutoConfiguration。class},scanBasePackages{org。nebula。contrib,your。domain})publicclassYourSpringbootApplication{}声明主键生成器importorg。nebula。contrib。ngbatis。PkGenerator;ComponentpublicclassCustomPkGeneratorimplementsPkGenerator{OverridepublicTTgenerate(StringtagName,ClassTpkType){Objectidnull;此处自行对id进行设值。return(T)id;}}
  到此,对于集成工作来说,任务已经完成,剩下就是开发的工作了。
  开发人员只需要做三件事:定义接口:packageyour。domain;importorg。nebula。contrib。ngbatis。proxy。NebulaDaoBasic;publicinterfacePersonDaoextendsNebulaDaoBasicPerson,String{PersonselectByName(Param(name)Stringparam);}在resourcesmapperPersonDao。xml中编写GQLmappernamespaceyour。domain。PersonDaoselectidselectByNameMATCH(n:person)WHEREn。person。namenameRETURNnLIMIT1selectmapper
  调用
  注入:
  调用自定义接口Persontomdao。selectByName(Tom);
  调用基类接口不管属性是否为空,如果数据库中已有对应id的值,则覆盖publicvoidinsert(Personperson){dao。insert(person);}仅写入非空属性publicvoidinsertSelective(Personpreson){dao。insertSelective(person);}此处,Person的主键栏name为String,则入参为StringpublicPersonselectById(Stringid){returndao。selectById(id);}按属性查询publicListPersonselectBySelective(Personperson){returndao。selectBySelective(person);}八、尾声
  以上就是本次交流的全部内容。如果NGbatis实现方式也是你喜欢的,issue、pr、star都是ok的。如果对项目感兴趣,也可以参与到开发中来,从中获得成就感。仓库地址:https:github。comnebulacontribngbatis。
  最后,希望NGbatis能给越来越多的开发者带来开发上的便利。
  谢谢你读完本文()
  NebulaGraphDesktop,Windows和macOS用户安装图数据库的绿色通道,10s拉起搞定海量数据的图服务。通道传送门:http:c。nxw。soblVC6
  想看源码的小伙伴可以前往GitHub阅读、使用、()star它

家里有孩子装修千万别大意!这样的设计不仅美观还放心,实用得很对于有孩子的家庭来说,装修不仅要考虑到自己的需求,还应该将孩子的安全考虑进去,因为在孩子的眼里,什么都可以是玩具,一个大意就容易使孩子受伤。在这里给大家列出几样需要特别注意的事……唏嘘!一个反向榜眼,只用三年时间,就成了马刺的当家球星马刺的反向榜眼圣安东尼奥马刺送走了怀特和穆雷,一个去到了凯尔特人,帮助球队打进了总决赛,一个来到了亚特兰大老鹰,成为了特雷杨的好帮手。怀特和穆雷都是反向榜眼,也就是首轮2……一周前沿科技盘点全固态锂电池氢燃料电池研发同步取得重大进展编者按:汇聚中科院、工程院、医科院、农科院、985高校及新型研发机构等近200家科研院所、单位发布的研究成果,通过多源动态提取信息因子,按领域维度、期刊级别、创新载体、学……打卡川西蓝色海洋,邂逅木格措的雪山与杜鹃!(一)五月高山杜鹃花季,观赏正当时都说人间四月芳菲尽,雪域杜鹃始盛开!五月,正是高山杜鹃花开的时节木格措的杜鹃峡更是一片热闹找个机会一起去木格措赏花避暑……日语翻译软件外贸SEO优化必备的各大语言翻译软件日语翻译软件,今天给大家分享一款免费的翻译软件,我们为什么要选择这款好用的翻译软件,因为汇集了世界最好的几个翻译平台(百度谷歌有道),第一点翻译质量高,选择性多。第二点支持各种……优酷诉天堂电影App侵权获赔涉及战狼2七月与安生等版权中国网财经6月29日讯(记者钟文鑫)据北京法院审判信息网,近日,两则优酷信息技术(北京)有限公司与成都惟诚科技有限公司相关侵害作品信息网络传播权纠纷一审法律文书公布。图片……苹果手机各个版本到底区别在哪?差价如何产生?第一种版本解释:手机版本就是我们常常接触的大陆行货、港行、港水、新加坡版、美版、日版、韩版、亚太版等等。事实上,行货与水货的区别在于地区的销售及其服务不同。而我们购……奥运冠军参加综艺遭针对!私底下大家都不理她,无奈宣布退赛6月17日,中国自由式滑雪空中技巧运动员、北京冬奥会自由式滑雪女子空中技巧金牌得主徐梦桃在个人社交平台上写道:我在乘风破浪唱演舞台完美收官,我很满意!另外,徐梦桃还对在节目中帮……拉克布在NBA并非首富,他只是最大方的老板北京时间6月16日,据美国媒体报道,金州勇士队时隔两年重返总决赛,如今已经拿到总冠军赛点的他们,距离总冠军仅一步之遥。但是球队全年总投入联盟第一,外界不少人认为他们的成绩都是用……雪容融设计团队讲述幕后故事125秘密基地大半年24小时紧闭窗北京冬奥会、冬残奥会的设计项目,全球发布前必须严格保密,因此常常以代号称呼。比如飞扬火炬代号花卷儿,雪容融的设计项目就以入围的日子称125。吉艺为主创团队安排的专家公寓,也就被……全球IT富豪榜从亚马逊创始人JeffBezos到英伟达的黄仁勋,以下是入选《福布斯》2022年全球亿万富豪榜单的20位科技大佬。没必要为全世界最有钱的亿万富豪们拉小提琴唱赞歌,不过要知……牙买加包揽百米前三!36岁女飞人夺世锦赛百米第5金,超越博尔北京时间7月18日,尤金田径世锦赛继续进行,女子100米决赛上演,牙买加女队展现了集团优势,包揽了金银铜牌,展现了在这一项目上的霸主地位。36岁的袖珍女飞人弗雷泽拿到了世锦赛第……
大受震撼!鞍山湿地迎来候鸟迁徙大军太壮观了,从来没看到过这么多的鸟在一起云集飞翔!近日,鞍山市台安县大麦科湿地附近发现大批野鸭在水面上觅食、嬉戏,成群结队飞舞盘旋,万鸟翔集的场面让人大饱眼福。秋沙鸭……灌篮高手在大学球队眼里,为何他们更在意高砂,而不选三井?头条创作挑战赛灌篮高手中湘北打完山王,就进入剧情年了,在这一年里不少球队都会损失一定的名将,因为他们已经高中毕业了,要去上大学了,所有人几乎是分道扬镳,而实力强悍的选手已……2023贵州游玩指南,含各景点玩法1。季节和交通贵州的旅游季节从每年3月开始,34月的樱花和杜鹃花,然后就正常进入夏季,一直到国庆后11月前,都是贵州旅游的好时机。来贵州旅游一般落地贵阳龙洞堡机场,……98年超模尤物身材太火辣,逛个超市都被围观!现在这个社会人美女一抓一大把,而且美女的年龄都已经不是能衡量的,现在的美女年龄大的有,小的也有特别是当她们亮相时,旁人不得不多瞅两眼!接下来,小编给大家介绍一位美女,听说逛个超……我们的宇宙可能有第五维度,它将颠覆我们对物理学的一切了解1905年,阿尔伯特爱因斯坦在他的狭义相对论中表明,空间通过光的宇宙速度极限与时间密切相关,因此,严格来说,我们生活在一个具有四个时空维度的宇宙中。包括我们在空间的三个维度(南……孟美岐晒近照,穿衣尺度还是很大胆,因私生活的问题让人唏嘘近日,孟美岐的营业照片被曝光,还被网友称穿衣尺度很大胆。网友在分享孟美琪的营业照片时,还表示衣服剪裁设计非常考验身材,但是孟美琪依然穿了这一件衣服,实在是勇气可嘉啊。……小鲁尼破门助曼联U13击败曼城夺得北部冠军,上赛季56球28直播吧3月21日讯据进球网报道,曼联传奇球星鲁尼的大儿子凯伊鲁尼(KaiRooney)最近取得进球,帮助曼联U13梯队击败了曼城U13。凯伊是鲁尼的大儿子,目前在曼联U1……国外已经开始推行四天工作制了,国内还有人996福报随着全球化的加速和人们对工作生活平衡的需求越来越强烈,越来越多的国外公司开始尝试缩短工作时间,实行更加灵活的工作制度。最近,有越来越多的公司开始试行四天工作制,而这一新型工作模……背靠背赛事连败近16个月首次安赛龙时代即将结束?近两周举行的全英、瑞士羽毛球公开赛,丹麦名将安赛龙均被挡在决赛赛外,爆出国际羽坛一大冷门。近两年,安赛龙在羽坛男子单打赛场展现出绝对统治力,他不仅仅囊括奥运会、世锦赛金牌,国际……孩子长高的秘诀,你知道吗?看完这篇文章,你就明白了!孩子长高这样吃今天我想和大家分享一下孩子长高需要怎么吃的话题。我相信很多家长都希望自己的孩子能够健康快乐地成长,身高也是一个重要的指标。那么,我们应该如何给孩子提供合理的……可立克2022年预计净利1亿394。87下游新能源市场需求旺挖贝网1月29日,可立克(002782)近日发布2022年年度业绩预告,预计2022年归属于上市公司股东的净利润10,000万元13,000万元,上年同期盈利2,626。96万……桑乔救主!英格兰新星助红魔晋级,但巅峰仍遥不可及!曼联在周日的足总杯四分之一决赛中,从落后一球的困境中逆袭,31击败富勒姆晋级半决赛。桑乔在关键时刻脱颖而出,改变了比赛的局面,但这位英格兰小将依然距离他的巅峰状态有很大的差距。……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网