# jSqlBox **Repository Path**: yourkeychen/jsqlbox ## Basic Information - **Project Name**: jSqlBox - **Description**: Java全功能数据库持久层工具 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 98 - **Created**: 2021-08-05 - **Last Updated**: 2021-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: 数据库 ## README
English instructions please see "README_ENG.md"
基于DbUtils内核的全功能数据库持久层工具
## 简介 | Intro jSqlBox是一个全功能开源Java数据库持久层工具,在架构、功能、易用性等方面都不输于其它持久层工具,可以说,只要是与数据库操作相关的功能,jSqlBox都已具备,如DDL操作、分页、分库分表、声明式事务、分布式事务、关联映射查询等,所有这些功能都包含在一个1M大小的jar包中,不依赖任何第三方库。 jSqlBox的最大特点是拥抱SQL,提倡直接在Java里写出可维护的SQL,它首创了参数内嵌式SQL写法。 比如说下面这种传统SQL写法是不可维护的,当要添加或删除字段时会很麻烦,因为要找到列名和参数之间的对应关系是很花时间的: ``` insert into tb_price_setting (id,code,adult_price,child_price,total_price,adult_note,child_note,currency,type,time_zone,status,include_tax,adult_discount,child_discount,total_discount,created_at,updated_at,) values(1200, "BJD837434", 50, 30, 80, "15以上全价", "8-15半价", "USD, 8, "UTC", "A", 3.03, 0, 0, 0, "2019-09-17 04:07:55", "2020-03-10 22:43:00"); ``` 而采用jSqlBox,写法如下,这种写法在不降低原生SQL的可读性的前提下,极大地提高了原生SQL的可维护性: ``` DB.exe("insert into tb_price_setting (", // "id,", par(1200), // "code,", par("BJD837434"), // "adult_price,", par(50), // "child_price,", par(30), // "total_price,", par(80), // "adult_note,", par("15以上全价"), // "child_note,", par("8-15半价"), // "currency,", par("USD"), // "type,", par(8), // "time_zone,", par("UTC"), // "status,", par("A"), // "include_tax,", par(3.03), // "adult_discount,", par(0), // "child_discount,", par(0), // "total_discount,", par(0), // "created_at,", par("2019-09-17 04:07:55"), // "updated_at,", par("2020-03-10 22:43:00"), // ")", valuesQuestions()); ``` 再进一步,利用jSqlBox的根据数据库生成Q类插件(详见用户手册"支持重构的SQL"一节),还可以写出可重构的SQL来,进一步提高原生SQL的可维护性: ``` QTbPriceSetting p=QTbPriceSetting.instance; DB.exe("insert into ",p," (", // p.id, ",", par(1200), // p.code, ",", par("BJD837434"), // p.adult_price, ",", par(50), // p.child_price, ",", par(30), // p.total_price, ",", par(80), // p.adult_note, ",", par("15以上全价"), // p.child_note, ",", par("8-15半价"), // p.currency, ",", par("USD"), // p.type, ",", par(8), // p.time_zone, ",", par("UTC"), // p.status, ",", par("A"), // p.include_tax, ",", par(3.03), // p.adult_discount, ",", par(0), // p.child_discount, ",", par(0), // p.total_discount, ",", par(0), // p.created_at, ",", par("2019-09-17 04:07:55"), // p.updated_at, par("2020-03-10 22:43:00"), // ")", valuesQuestions()); ``` 使用jSqlBox并不意味要使用它的所有功能,对于小项目来说,上述的SQL式写法就足够支撑普通CRUD开发了,不一定要引入复杂的ORM。 ## jSqlBox与其它持久层工具对比 请见[与其它DAO工具对比](https://gitee.com/drinkjava2/jsqlbox/wikis/pages?sort_id=1010925&doc_id=92178), 可以对jSqlBox的功能与特点有一个大概的了解。 ## 架构 | Architecture  ## 主要优点 | Advantages - **不依赖任何第三方库**:jSqlBox只有一个约1M大小的单个Jar包,不依赖任何第三方库。 - **架构合理**:模块式架构,各个子模块(jBeanBox,jDbPro,jDialects,jTransaction)都可以脱离jSqlBox单独存在。 - **跨数据库**:基于jDialects模块,支持80多种数据库的分页、DDl脚本生成、从数据库生成实体源码、函数变换、主键生成等功能。 - **与DbUtils兼容**:内核基于DbUtils, 原有基于DbUtils的旧项目可以无缝升级到jSqlBox。 - **多种SQL写法**:Inline方法、模板方法、DataMapper、ActiveRecord、链式写法、缓存翻译等。 - **多项技术创新**:参数内嵌式SQL写法、多行文本支持、实体关联查询、树结构查询等。 - **动态配置**:除了支持实体Bean注解式配置,jSqlBox还支持在运行期动态更改配置。 - **无会话设计**:无会话设计(Sessionless),是一个真正轻量级的、全功能的持久层工具,也可以作为其它持久层工具的补丁来使用。 - **主从、分库分表**:无需引入第三方工具,jSqlBox本身就具备主从、分库分表功能。 - **自带声明式事务**:内置微型IOC/AOP工具,不依赖Spring就可提供声明式事务。 - **自带分布式事务**:无需引入第三方工具,jSqlBox本身就提供无侵入的分布式事务功能,和Seata项目类似,它可以自动生成回滚SQL,但源码远比Seata简洁。 - **学习曲线平滑**:模块化学习,了解了各个子模块,就掌握了jSqlBox,jSqlBox主体模块源码只有40多个类。 - **兼容主要JPA注解**:jSqlBox可以识别并兼容JPA实体类的主要注解(15个)。 ## 文档 | Documentation [中文](https://gitee.com/drinkjava2/jsqlbox/wikis/pages) | [English](https://github.com/drinkjava2/jsqlbox/wiki) | [JavaDoc](http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22jsqlbox%22) | [PDF](https://gitee.com/drinkjava2/jsqlbox/wikis/pages/export?type=pdf&info_id=92178) ## 配置 | Configuration 在pom.xml中加入以下依赖即可: ```xml