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

<a name="k9Sn5"></a>

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

<a name="XffCP"></a>

概述

  Foxnic-SQL 是基于Spring JDBC 开发的 SQL 语句执行与数据处理框架。她扩展与简化了 Spring JDBC 的功能,解决开发痛点,使基于数据库的开发更加高效简洁。

  项目地址:https://gitee.com/LeeFJ/foxnic

  关于 Foxnic-SQL 解决的痛点与设计初衷,可以跟进 Foxnic-SQL 的相关视频。

  视频地址:http://foxnicweb.com/docs/doc.html#0,4

  Foxnic-SQL 即支持以实体模型为中心的开发模式,也支持以SQL语句为中心(DBA视角)的开发模式。

  Foxnic-SQL 在技术和代码层面简化开发过程,目的是使开发人员由技术聚焦转到业务聚焦和数据聚焦,专注业务落地,体现系统价值。

引入依赖

  第一步:加入 Foxnic Repository 到 pom 文件

1<repository> 2 <id>foxnic</id> 3 <name>Foxnic Repository</name> 4 <url>http://foxnicweb.com:9091/repository/maven-releases/</url> 5</repository>

  第二步:引入 Foxnic-SQL 依赖

1<dependency> 2 <groupId>com.github.foxnic</groupId> 3 <artifactId>foxnic-sql</artifactId> 4 <version>1.6.0.RELEASE</version> 5</dependency>

  第三步:引入其它依赖包(可选)

1<dependency> 2 <groupId>com.github.foxnic</groupId> 3 <artifactId>foxnic-generator</artifactId> 4 <version>1.6.0.RELEASE</version> 5</dependency> 6<dependency> 7 <groupId>com.github.foxnic</groupId> 8 <artifactId>foxnic-dao</artifactId> 9 <version>1.6.0.RELEASE</version> 10</dependency>

<a name="IeuaZ"></a>

<a name="IeuaZ"></a>

功能特点

  Foxnic-SQL 将 SQL 语句对象化,简化 SQL 语句拼接,可调式、可输出。在语句执行上,向 JDBC 提供绑定变量的语句,向开发人员提供变量代入后的语句。所以她向 JDBC 是友好的,面对开发人员也是友好的。

<a name="NWZxj"></a>

SQL拼接示例-1 打开代码文件
1Insert insert = new Insert("bpm_demo_leave"); 2insert.set("id", id) 3 .set("type", "type-1") 4 .set("begin_time", new Date()) 5 .set("end_time", new Date()) 6 .set("reason", "天气不错,出去旅游"); 7System.out.println(insert.getSQL()); 8//输出 : INSERT INTO bpm_demo_leave ( id , type , begin_time , end_time , reason ) VALUES ( '001' , 'type-1' , str_to_date('2022-12-01 10:13:35','%Y-%m-%d %H:%i:%s') , str_to_date('2022-12-01 10:13:35','%Y-%m-%d %H:%i:%s') , '天气不错,出去旅游' )

<a name="xYKW5"></a>

SQL拼接示例-2 打开代码文件
1public class WhereDemo { 2 3 public Where makeWhere(String name,Integer height) { 4 Where where = new Where("valid = ?" ,1); 5 where.andLike("name",name); 6 where.andIf("height > ?",height); 7 return where; 8 } 9 10 11 public static void main(String[] args) { 12 13 WhereDemo demo=new WhereDemo(); 14 15 16 Where wh1=demo.makeWhere("leefj",18); 17 System.out.println(wh1); 18 //输出 : WHERE valid = 1 AND name like '%leefj%' AND height > 18 19 20 Where wh2=demo.makeWhere("leefj",null); 21 System.out.println(wh2); 22 //输出 : WHERE valid = 1 AND name like '%leefj%' 23 24 Where wh3=demo.makeWhere(null,18); 25 System.out.println(wh3); 26 //输出 : WHERE valid = 1 AND height > 18 27 28 } 29 30}

<a name="AhfsG"></a>

SQL输出示例(断点查看) 打开代码文件

image <a name="jMJU9"></a>

SQL输出示例(SQL执行详情)

image<br />同时,Foxnic-SQL 支持外部的SQL文件和SQL模板,轻松复用SQL语句。外置SQL语句可以对不同类型的数据库实现适配。

<a name="P6MAF"></a>

外部文件示例 打开代码文件
1// 在外部文件中定义语句 2[query-root-orgs] 3select m.*,(select count(1) from hrm_organization cm where m.id=cm.parent_id and cm.deleted=0) child_count,(select count(1) from hrm_position cm where m.id=cm.org_id and cm.deleted=0) position_count from hrm_organization m 4where m.parent_id='0' and company_id=? and tenant_id=? and m.deleted=0 order by type asc, sort asc
1private RcdSet queryChildOrgs(String parentId,String targetType) { 2 RcdSet nodes=null; 3 String tenantId= SessionUser.getCurrent().getActivatedTenantId(); 4 String companyId=SessionUser.getCurrent().getActivatedCompanyId(); 5 if(parentId==null || parentId.equals(IOrganizationService.ROOT_ID)) { 6 // 使用外部文件已经定义的 ID 执行语句 7 nodes=dao.query("#query-root-orgs",companyId,tenantId); 8 } else { 9 nodes=dao.query("#query-orgs-by-parent-id",companyId,tenantId,parentId); 10 } 11 return nodes; 12}

<a name="meVpU"></a>

数据库适配示例 打开代码文件
1// 默认数据库执行的语句 2[update-org-hierarchy-step2] 3UPDATE hrm_organization c, hrm_organization p 4SET c.hierarchy=CONCAT(p.hierarchy,'/',c.id) 5WHERE c.tenant_id=? and p.id=c.parent_id and c.hierarchy is null and p.hierarchy is not null 6 7// 在达梦数据库时执行该语句 8[update-org-hierarchy-step2:dm] 9UPDATE hrm_organization c SET 10c.hierarchy=CONCAT((select p.hierarchy from hrm_organization p WHERE p.id=c.parent_id and p.hierarchy is not null),'/',c.id) 11where c.hierarchy is null

Foxnic-SQL 从 DAO 出发,扩展出数据库元数据、序列生成、增删改查、SQL构建、数据集、实体、全局关系与Join等方面的特性。

<a name="Uo9Qi"></a>

元数据示例 打开代码文件
1public static void main(String[] args) { 2 3 // 创建DAO 4 DAO dao=DBInstance.DEFAULT.dao(); 5 // 获得所有表名 6 String[] tableNames=dao.getTableNames(); 7 // 遍历表名 8 for (String tableName : tableNames) { 9 System.out.println(tableName); 10 } 11 // 获得指定表的元数据 12 DBTableMeta tm=dao.getTableMeta("sys_user"); 13 // 遍历列 14 for (DBColumnMeta column : tm.getColumns()) { 15 System.out.println(column.getColumn()+"\t"+column.getLabel()); 16 } 17 18}

<a name="SQWVK"></a>

序列示例 打开代码文件
1public static void main(String[] args) { 2 // 创建DAO 3 DAO dao=DBInstance.DEFAULT.dao(); 4 String name="my-sample-demo"; 5 DBSequence sequence=dao.getSequence(name); 6 // 如果不存在就创建 7 if(!sequence.exists()) { 8 // 创建序列 9 sequence.create(SequenceType.AI,10,4); 10 } 11 // 循环取数 12 for (int i = 0; i < 100; i++) { 13 System.out.println(i+" = "+sequence.nextLong()); 14 } 15}

<a name="GXSil"></a>

数据集示例 打开代码文件
1public static void main(String[] args) { 2 // 创建DAO 3 DAO dao = DBInstance.DEFAULT.dao(); 4 RcdSet rs = dao.queryPage("select * from sys_dict where code like ?", 50, 1, "%o%"); 5 for (Rcd r : rs) { 6 System.out.println(r.toJSONObject()); 7 } 8}

<a name="FJ3KR"></a>

实体代码生成示例 打开代码文件
1/** 2* 实体类生成器 3* */ 4public class EntityGenerator { 5 6 private static final String BASE_PACKAGE = "com.leefj.foxnic.sql.demo"; 7 8 private DAO dao = null; 9 10 /** 11* 需要首先运行 ExampleDBMetaGenerator 生成 ExampleTables 类 12* */ 13 public static void main(String[] args) { 14 EntityGenerator generator = new EntityGenerator(); 15 generator.generate(ExampleTables.EXAMPLE_GOODS.$TABLE); 16 generator.generate(ExampleTables.EXAMPLE_ORDER.$TABLE); 17 generator.generate(ExampleTables.EXAMPLE_ORDER_ITEM.$TABLE); 18 generator.generate(ExampleTables.EXAMPLE_ADDRESS.$TABLE); 19 } 20 21 public EntityGenerator() { 22 dao = DBInstance.DEFAULT.dao(); 23 } 24 25 public void generate(DBTable table) { 26 String pkg = table.name().split("_")[0]; 27 String prefix = pkg + "_"; 28 ModuleContext context = new ModuleContext(GeneratorUtil.initGlobalSettings(),table,prefix,BASE_PACKAGE + "." + pkg); 29 context.setDomainProject(GeneratorUtil.getProject()); 30 context.setDAO(dao); 31 context.buildPo(); 32 } 33}

image <a name="ne7Tc"></a>

实体CRUD示例 打开代码文件
1public static void demo1() { 2 DAO dao = DBInstance.DEFAULT.dao(); 3 // 创建实体对象,并设置属性值 4 Goods goods = new Goods(); 5 String id = IDGenerator.getSnowflakeIdString(); 6 goods.setId(id) 7 .setName("大红枣") 8 .setPrice(new BigDecimal(2.5)); 9 // 插入数据 10 dao.insertEntity(goods); 11 // 查询数据 12 goods = dao.queryEntityById(Goods.class,id); 13 // 修改后保存 14 goods.setPrice(new BigDecimal(2.6)); 15 dao.updateEntity(goods, SaveMode.DIRTY_FIELDS); 16 // 再次查询 17 goods = dao.queryEntityById(Goods.class, id); 18 System.out.println(JSON.toJSON(goods)); 19}

<a name="w74LS"></a>

关系与Join示例 打开代码文件
1public static void demo_relation() { 2 3 DAO dao = DBInstance.DEFAULT.dao(); 4 // 创建订单 5 Order order=new Order(); 6 String orderId=IDGenerator.getSnowflakeIdString(); 7 order.setId(orderId); 8 order.setOrderNo(IDGenerator.getNanoId(8)); 9 order.setAmount(new BigDecimal(800)); 10 // 创建订单的收件地址 11 Address address=new Address(); 12 address.setId(IDGenerator.getSnowflakeIdString()); 13 address.setRegionType("国内"); 14 address.setRegionLocation("华东"); 15 address.setAddress("宁波"); 16 address.setName("LeeFJ"); 17 address.setPhoneNumber("13444025142"); 18 19 // 指定订单的地址ID 20 order.setAddressId(address.getId()); 21 22 // 保存地址和订单 23 dao.insertEntity(address); 24 dao.insertEntity(order); 25 26 // 从数据库查询订单 27 Order orderFromDB=dao.queryEntityById(Order.class,orderId); 28 // 使用 join 方法关联并填充地址对象 29 dao.join(orderFromDB, OrderMeta.ADDRESS); 30 31 // 打印输出的数据 32 System.out.println(JSON.toJSON(orderFromDB)); 33 System.out.println(JSON.toJSON(orderFromDB.getAddress())); 34 35}

  Foxnic-SQL 支持 Pojo 实体,也可以将 Pojo 类继承 Foxnic-SQL 的 Entity 类以获得更强大的功能 。以上示例中的实体数据操作、关系的Join特性就是一个很好的佐证。

  Foxnic-SQL 目前已经支持的数据库类型有 Oracle、MS SQL Server,MySQL、PG、DB2、达梦、OceanBase。

  接下来,让我们一起感受一下 Foxnic-SQL 带来的开发之旅吧。

<a name="Wk7yS"></a>

应用场景

<a name="Gh93F"></a>

Foxnic-Web

  Foxnic-Web 是一套直接面向业务模块开发的应用框架。在 Foxnic-Web 已经包含了常规应用所需的基础模块,在已有基础模块的支持下,开发者可以直接开始业务模块的开发。 Foxnic-Web 在 Spring Boot 体系上扩展,开发者容易理解与快速上手。

  项目地址:https://gitee.com/LeeFJ/foxnic-web

<a name="XliLp"></a>

Foxnic-EAM

  实现企业对资产的基本管理,包含对资产的登记、维修、调拨、转移等基本功能的支持,并提供对资产的耗材、库存进行管理,有完善的组织架构,非常适合中小企业的需求<br />EAM系统整体覆盖了基本的资产管理、合同管理、运维服务、运维服务、数据中心设备管理等多个模块。

  项目地址:https://gitee.com/lank/eam

<a name="ztTyi"></a>

Foxnic-Samples

  该项目用于展示和提供 Foxnic 相关的示例工程和模版代码,本文中提供的示例代码均可在 Foxnic-Samples 中找到。

  项目地址:https://gitee.com/LeeFJ/foxnic-samples

<a name="VZBg5"></a>

相关项目

  https://gitee.com/LeeFJ/foxnic<br />  https://gitee.com/LeeFJ/foxnic-web<br />  https://gitee.com/lank/eam<br />  https://gitee.com/LeeFJ/foxnic-samples

官方文档

  http://foxnicweb.com/docs/doc.html

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

Activiti 工作流入门指南

<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve

MySQL SQL语句是如果被执行的?(1)

一个SQL语句被发送到MySQL是如果被执行的?selectname,agefromuserwhereage8如上一个SQL语句,发送到MySQL服务器之后,会做什么,如何识别上边语句并返回结果?下面我们来详细说明这个过程。语法解析和预处理(Parser&Preprocessor)假如我

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.