# fluentsql **Repository Path**: artlongs/fluentsql ## Basic Information - **Project Name**: fluentsql - **Description**: 我们不生产SQL,我们只是SQL的搬运工! - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 3 - **Created**: 2020-11-13 - **Last Updated**: 2025-09-14 ## Categories & Tags **Categories**: database-dev **Tags**: None ## README # Fluent-SQL [![Maven Central](https://img.shields.io/maven-central/v/com.artfii.fluentsql/fluentsql.svg)](https://search.maven.org/search?q=g:com.artfii.fluentsql%20a:fluentsql-*) 我们不生产SQL,我们只是SQL的搬运工! Lambda 风格的流式 SQL 查询工具,支持多表 lefjoin,from(子表),sum case , iif ,group by(子表属性)... 集成了SQL2O,JDBCTEMPLATE实现CRUD,分页查询等. 自我感觉良好,有了这个小工具,可以忘却 Hibernate,Mybatis... Fluent-SQL 优势所在: 1. 无须编写实体类,您只需创建简单的 POJO 一一对应数据表字段,即可. 2. 您无须关心各种多对多,一对多等各种 ORM 关联配置,您懂得使用 Left-Join 即可以关联任意数据表. 3. Fluent-SQL 自带了防 SQL 注入. 4. 在不考虑缓存的情况下,有那一种 ORM 方案会比原生 SQL 快呢? # 开发思历 世面上有的 ORM 我多数都用过,用得最多的是 Hibernate,Mybatis. 日子久了我就在想有没有一种 ORM 既易用而又高性能的呢?鱼与掌真的不能兼得吗? 要说高性能,原生SQL肯定是性能最高,可是原生SQL却有硬代码,并且因为前端的查询条件的可选性,自己手动拼接查询条件时,必然会有许许多多的 IF(null!=xx){sql}... , 这个缺点 Hibernate,Mybatis 一样也会有. 这催发了我 开发出 fluent-sql 这个项目, 这只是一个工具类, 却绝对会让你大叫: SHUANG! SHUANG! SHUANG! fluent-sql + sql2o ,就是性能与易用的经典示范! SQL2O 项目地址 : https://github.com/aaberg/sql2o # 约定: 1. 数据库字段默认风格是全小写加下划线分隔的 underline 风格 2. 使用 Attr.Property类型入参 fun(x::getMethod) 代表是使用默认的主表, 3. 使用 Attr.parse(x::getMethod) 入参,则使用你指定的 x 做为从表. 4. 不指定 spell 默认是把字段 AS 为驼峰格式 5. 如果选择的字段出现在子表查询里则要指定拼写为 Spell.UNDERLINE(受限于第一条约定) # 性能测试 ``` v0.0.8 新增加FluentSql 自己的基于原生JAVA JDBC的底层数据访问,可以完全不依赖第三方ORM实现CRUD,查询效率得到重大的提升。 测试结果如下(同一批数据,各ORM随机查询1000次): ====================================================================== RUNNING 1000 ITERATIONS THAT LOAD UP A POST ENTITY Select Results ------------------------- HandCoded took 11ms FluentSql took 13ms (18.18% slower) Sql2oTypical took 15ms (36.36% slower) ApacheDbUtilsTypical took 19ms (72.73% slower) Sql2oNameType took 22ms (100.00% slower) BeetlSqlTypical took 25ms (127.27% slower) FluentSqlNameType took 32ms (190.91% slower) JDBI took 44ms (300.00% slower) MyBatis took 51ms (363.64% slower) SpringJdbcTemplateTypical took 56ms (409.09% slower) SpringJdbcTemplateNameType took 60ms (445.45% slower) HibernateTypical took 66ms (500.00% slower) JOOQ took 81ms (636.36% slower) ====================================================================== 测试用例在:fluentsql-core包test目录下的PojoPerformanceTest.class ``` # 语法示例: ```sql SELECT user.user_name AS userName,dept.dept_name AS deptName FROM `user` AS user LEFT JOIN `dept` ON user.dept_id = dept.id WHERE (LOCATE (user.user_name,'jack')>0) GROUP BY user.dept_id HAVING (user.dept_id>0) ORDER BY user.dept_id ASC,user.user_name DESC ``` 等同与: ```java String sql = new Lq<>(User.class) .select(User::getUserName) .select(Attr.parse(Dept::getDeptName)) .leftJoin(Dept.class) .andLike(User::getUserName, "jack") .group(User::getDeptId) .having(User::getDeptId, Qe.Opt.GT, 0) .asc(User::getDeptId) .desc(User::getUserName) .build(); ``` # MAVEN 增加对本项目的使用,您可以按自己项目需求只选择对子项目的依赖 fluentsql-core | fluentsql-sql2o | fluentsql-jdbctemplate ```xml com.artfii.fluentsql fluentsql-core 0.0.17.20 ``` # Version更新内容 0.0.17.20 不在维护jdbctemplate/sql2o子项目