# sql-light-rail **Repository Path**: SolarisNeko/sql-light-rail ## Basic Information - **Project Name**: sql-light-rail - **Description**: Java SQL 链式写法,代替重量级 ORM 框架。 具备以下特点: 1、Plugin 2、自定义 SQL 执行器 3、基于 SQL 语法,向上适配 Hive、Kylin、等 BigData JDBC 协议的特殊语法。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: https://github.com/SolarisNeko/sql-light-rail - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-20 - **Last Updated**: 2023-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SQL Light Rail ## 简介 ### 介绍 SQL Light Rail (SQL 轻轨) 1. class SqlLightRail = SQL 链式编写 2. class ShardingKey = ShardingId 计算 3. class RepositoryManager = 多数据源管理 License 为 Apache-2.0 ## Download ### Maven ```xml com.neko233 sql-light-rail 1.1.0 ``` ### Gradle ```groovy implementation group: 'com.neko233', name: 'sql-light-rail', version: '1.1.0' ``` ## 初衷 / 痛点 因 mybatis-plus/flux 等好用的 ORM 框架, 都依赖于 mybatis. 但一旦离开了 mybatis 生态圈, 很多好用的机制不能拿出来独立使用. 所以, 该项目做了以下的模块化: 1. 独立的 SQL stream 写法, 直接生成 sql 语句. 无需 mybatis-plus 重量级依赖. 2. 独立的 ORM 机制. 3. 独立的 Sharding DB 机制 4. Plugin Chain (插件化) 处理 SQL 执行过程. # Use Dependency ## maven ```xml com.neko233 sql-light-rail 1.1.0 mysql mysql-connector-java 8.0.25 ``` ## gradle ```kotlin implementation("com.neko233:sql-light-rail:1.1.0") implementation("mysql:mysql-connector-java:8.0.25") ``` # Code ## Sql Builder 链式构建 SQL ```java public class SelectTest { /** * 模拟复杂业务场景,动态维度 SQL */ @Test public void businessSelectDynamicDimension() { boolean isGroupByPackageId = true; // 1 Base SQL SelectCondition selectCondition = SelectCondition.builder() .column("app_id") .column("channel_id") .column("sum(pay_money)", "sum_money") .column("register_time") .column("pay_time"); WhereCondition whereCondition = WhereCondition.builder() .equalsTo("app_id", PLACEHOLDER) .equalsTo("channel_id", "-1") .equalsTo("package_id", "-1") .lessThanOrEquals("register_time", PLACEHOLDER) .lessThanOrEquals("register_time", PLACEHOLDER); GroupByCondition groupByCondition = GroupByCondition.builder() .groupBy("register_time", "pay_time", "channel_id"); // 2 [Business Rule] dynamic sql add by batch if (isGroupByPackageId) { selectCondition.column("package_id"); groupByCondition.groupBy("package_id"); } // 3 build SQL String select = Sql233.selectTable("traffic_statistics_report") .select(selectCondition.build()) .where(whereCondition.build()) .groupBy(groupByCondition) .build(); // 4 execute System.out.println(select); String target = "SELECT app_id, channel_id, sum(pay_money) as 'sum_money', register_time, pay_time, package_id FROM traffic_statistics_report WHERE app_id = ? and channel_id = '-1' and package_id = '-1' and register_time <= ? and register_time <= ? GROUP BY register_time, pay_time, channel_id, package_id"; Assert.assertEquals(target, select); } // ... } ``` ## ORM ### Select 定义对象 ```java /** * @author SolarisNeko * Date on 2022-02-20 */ @Data @NoArgsConstructor @AllArgsConstructor @Builder public class User { @Column("id") private int id; @Column("name") private String name; } ``` 查询部分 ```java public class SelectDbTest { Db db = new Db(MyDataSource.getDefaultDataSource()); public SelectDbTest() throws Exception { } @Test public void selectTest_IntegerOrm() throws Exception { List testIntValue = db .executeQuery("Select 1 From dual ", Integer.class); Assert.assertEquals(1, testIntValue.get(0).intValue()); } @Test public void selectTest_ObjectOrm() throws Exception { List users = db.executeQuery("Select id, name From user Limit 0, 1 ", User.class); Assert.assertTrue(users.size() > 0); } @Test public void selectTest_paramsSet() throws Exception { Object[] params = {1}; List users = db .executeQuery("Select id, name From user Where id != ? Limit 0, 1 ", params, User.class); Assert.assertTrue(users.size() > 0); } } ```