当前位置: 首页 > 后端技术 > Java

Foxnic-SQL(一)——快速入门(QuickStart)

时间:2023-04-02 09:36:40 Java

Foxnic-SQL(一)——快速入门(QuickStart)概述Foxnic-SQL是一个基于SpringJDBC开发的SQL语句执行和数据处理框架。她对SpringJDBC的功能进行了扩展和简化,解决了开发痛点,让基于数据库的开发更加高效简洁。项目地址:https://gitee.com/LeeFJ/foxnic关于Foxnic-SQL解决的痛点和设计初衷,可以关注Foxnic-SQL的相关视频。视频地址:http://foxnicweb.com/docs/doc.html#0,4Foxnic-SQL不仅支持以实体模型为中心的开发模式,还支持以SQL语句为中心的开发模式(DBA视角)。Foxnic-SQL在技术和代码层面简化了开发过程。目的是让开发者从以技术为中心转向以业务为中心和以数据为中心,聚焦业务落地,体现系统价值。第一步引入依赖:在pom文件中添加FoxnicRepositoryfoxnicFoxnicRepositoryhttp://foxnicweb.com:9091/repository/maven-releases/第二步:导入Foxnic-SQL依赖com.github.foxnicfoxnic-sql1.6.0.RELEASE第三步:引入其他依赖包(可选)com.github.foxnicfoxnic-generator1.6.0.RELEASEcom.github.foxnicfoxnic-dao<版本>1.6.0.RELEASE/dependency>特点Foxnic-SQL将SQL语句对象化,简化了SQL语句的拼接,可调整可输出。在语句执行方面,为JDBC提供绑定变量的语句,为开发者提供变量替换后的语句。所以她对JDBC很友好,对开发者也很友好。SQL拼接示例-1打开代码文件Insertinsert=newInsert("bpm_demo_leave");insert.set("id",id).set("type","type-1").set("begin_time",newDate()).set("end_time",newDate()).set("reason","天气好,去旅行吧");System.out.println(insert.getSQL());//输出:INSERTINTObpm_demo_leave(id,type,begin_time,end_time,reason)VALUES('001','type-1',str_to_date('2022-12-0110:13:35','%Y-%m-%d%H:%i:%s'),str_to_date('2022-12-0110:13:35','%Y-%m-%d%H:%i:%s'),'天气好,出去旅游')SQL拼接示例-2打开代码文件publicclassWhereDemo{publicWheremakeWhere(Stringname,Integerheight){wherewhere=newWhere("有效=?",1);where.andLike("姓名",姓名);where.andIf("身高>?",身高);返回哪里;}publicstaticvoidmain(String[]args){WhereDemodemo=newWhereDemo();其中wh1=demo.makeWhere("leefj",18);System.out.println(wh1);//输出:WHEREvalid=1ANDnamelike'%leefj%'ANDheight>18Wherewh2=demo.makeWhere("leefj",null);System.out.println(wh2);//输出:WHEREvalid=1ANDnamelike'%leefj%'Wherewh3=demo.makeWhere(null,18);System.out.println(wh3);//Output:WHEREvalid=1ANDheight>18}}SQL输出示例(断点查看)打开代码文件SQL输出示例(SQL执行详情)同时,Foxnic-SQL支持外部SQL文件和SQL模板,方便重用SQL语句外部SQL语句可以适配不同类型的数据库。外部文件示例打开代码文件//在外部文件中定义语句[query-root-orgs]selectm.*,(selectcount(1)fromhrm_organizationcmwherem.id=cm.parent_idandcm.deleted=0)child_count,(selectcount(1)fromhrm_positioncmwherem.id=cm.org_idandcm.deleted=0)position_countfromhrm_organizationmwherem.parent_id='0'andcompany_id=?和tenant_id=?andm.deleted=0orderbytypeasc,sortascprivateRcdSetqueryChildOrgs(StringparentId,StringtargetType){RcdSetnodes=null;}StringtenantId=SessionUser.getCurrent().getActivatedTenantId();StringcompanyId=SessionUser.getCurrent().getActivatedCompanyId();if(parentId==null||parentId.equals(IOrganizationService.ROOT_ID)){//使用外部文件中定义的ID执行语句nodes=dao.query("#query-root-orgs",companyId,tenantId);}else{nodes=dao.query("#query-orgs-by-parent-id",companyId,tenantId,parentId);}returnnodes;}数据库适配示例打开代码文件//默认数据库执行的语句[update-org-hierarchy-step2]UPDATEhrm_organizationc,hrm_organizationpSETc.hierarchy=CONCAT(p.hierarchy,'/',c.id)WHEREc.tenant_id=?andp.id=c.parent_idandc.hierarchyisnullandp.hierarchyisnotnull//在大梦数据库中执行这条语句[update-org-hierarchy-step2:dm]UPDATEhrm_organizationcSETc.hierarchy=CONCAT((selectp.hierarchyfromhrm_organizationpWHEREp.id=c.parent_idandp.hierarchyisnotnull),'/',c.id)wherec.hierarchyisnullFoxnic-SQL从DAO开始,扩展数据库元数据,序列生成、CRUD、SQL构造、数据集、实体、全局关系和Join等功能元数据示例打开代码文件publicstaticvoidmain(String[]args){//创建DAODAOdao=DBInstance.DEFAULT.dao();//获取所有表名String[]tableNames=dao.getTableNames();//遍历表名for(StringtableName:tableNames){System.out.println(tableName);}//获取指定表的元数据DBTableMetatm=dao.getTableMeta("sys_user");//遍历列for(DBColumnMetacolumn:tm.getColumns()){System.out.println(column.getColumn()+"\t"+column.getLabel());}}序列示例打开代码文件publicstaticvoidmain(String[]args){//创建DAODAOdao=DBInstance.DEFAULT.dao();字符串名称=“我的样本演示”;DBSequencesequence=dao.getSequence(名称);//创建if(!sequence.exists()){//创建一个序列sequence.create(SequenceType.AI,10,4);}//循环获取数字for(inti=0;i<100;i++){System.out.println(i+"="+sequence.nextLong());}}数据集示例打开代码文件publicstaticvoidmain(String[]args){//创建DAODAOdao=DBInstance.DEFAULT.dao();RcdSetrs=dao.queryPage("select*fromsys_dictwherecodelike?",50,1,"%o%");for(Rcdr:rs){System.out.println(r.toJSONObject());}}实体代码生成示例打开代码文件/***实体类生成器**/publicclassEntityGenerator{privatestaticfinalStringBASE_PACKAGE="com.leefj.foxnic.sql.demo";私有DAOdao=null;/***需要首先运行ExampleDBMetaGenerator生成ExampleTables类**/publicstaticvoidmain(String[]args){EntityGeneratorgenerator=newEntityGenerator();generator.generate(ExampleTables.EXAMPLE_GOODS.$TABLE);generator.generate(ExampleTables.EXAMPLE_ORDER.$TABLE);generator.generate(ExampleTables.EXAMPLE_ORDER_ITEM.$TABLE);generator.generate(ExampleTables.EXAMPLE_ADDRESS.$TABLE);}publicEntityGenerator(){dao=DBInstance.DEFAULT.dao();}publicvoidgenerate(DBTabletable){Stringpkg=table.name().split("_")[0];字符串前缀=pkg+"_";ModuleContextcontext=newModuleContext(GeneratorUtil.initGlobalSettings(),table,prefix,BASE_PACKAGE+"."+pkg);context.setDomainProject(GeneratorUtil.getProject());context.setDAO(dao);context.buildPo();}}entityCRUD示例打开代码文件publicstaticvoiddemo1(){DAOdao=DBInstance.DEFAULT.dao();//创建实体对象并设置属性值Goodsgoods=newGoods();字符串id=IDGenerator.getSnowflakeIdString();goods.setId(id).setName("大红枣").setPrice(newBigDecimal(2.5));//插入数据dao.insertEntity(goods);//查询数据goods=dao.queryEntityById(Goods.class,id);//修改后保存goods.setPrice(newBigDecimal(2.6));dao.updateEntity(商品,SaveMode.DIRTY_FIELDS);//再次查询商品=dao.queryEntityById(Goods.class,id);System.out.println(JSON.toJSON(goods));}RelationshipandJoinexample打开代码文件publicstaticvoiddemo_relation(){DAOdao=DBInstance.DEFAULT.dao();//创建订单Orderorder=newOrder();字符串orderId=IDGenerator.getSnowflakeIdString();order.setId(orderId);order.setOrderNo(IDGenerator.getNanoId(8));order.setAmount(newBigDecimal(800));//创建订单的接收地址Addressaddress=newAddress();address.setId(IDGenerator.getSnowflakeIdString());address.setRegionType("国内");address.setRegionLocation("华东地区");address.setAddress("宁波");address.setName("LeeFJ");地址.setPhoneNumber("13444025142");//指定订单的地址IDorder.setAddressId(address.getId());//保存地址和订单dao.insertEntity(address);dao.insertEntity(顺序);//从数据库查询订单orderFromDB=dao.queryEntityById(Order.class,orderId);//使用join方法关联并填充地址对象dao.join(orderFromDB,OrderMeta.ADDRESS);//打印出数据System.out.println(JSON.toJSON(orderFromDB));System.out.println(JSON.toJSON(orderFromDB.getAddress()));}Foxnic-SQL支持Pojo实体,Pojo类也可以继承Foxnic-SQLEntity类获得更强大的功能。证据。Foxnic-SQL目前支持Oracle、MSSQLServer、MySQL、PG、DB2、大梦、OceanBase等数据库类型。接下来,就让我们一起来感受一下Foxnic-SQL带来的开发之旅吧。应用场景Foxnic-WebFoxnic-Web是一套直接面向业务模块开发的应用框架。Foxnic-Web已经包含了常规应用程序所需的基本模块。在现有基础模块的支持下,开发者可以直接开始业务模块的开发。Foxnic-Web在SpringBoot系统上进行了扩展,方便开发者理解和快速上手。项目地址:https://gitee.com/LeeFJ/foxnic-webFoxnic-EAM实现企业对资产的基础管理,包括对资产登记、维护、分配、流转等基础功能的支持,并提供资产的耗材,库存管理,具有完整的组织结构,非常适合中小企业的需求。EAM系统整体涵盖基础资产管理、合同管理、运维服务、运维服务、数据中心设备管理等多个模块。项目地址:https://gitee.com/lank/eamFoxnic-Samples本项目用于展示和提供Foxnic相关的示例项目和模板代码。本文提供的示例代码可以在Foxnic-Samples中找到。项目地址:https://gitee.com/LeeFJ/foxnic-samples