All Projects → x-ream → Sqli

x-ream / Sqli

Licence: apache-2.0
orm sql interface, Criteria, CriteriaBuilder, ResultMapBuilder

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Sqli

Ebean
Ebean ORM
Stars: ✭ 1,172 (-28.71%)
Mutual labels:  orm, jdbc, mysql
incubator-linkis
Linkis helps easily connect to various back-end computation/storage engines(Spark, Python, TiDB...), exposes various interfaces(REST, JDBC, Java ...), with multi-tenancy, high performance, and resource control.
Stars: ✭ 2,459 (+49.57%)
Mutual labels:  presto, jdbc, impala
Linkis
Linkis helps easily connect to various back-end computation/storage engines(Spark, Python, TiDB...), exposes various interfaces(REST, JDBC, Java ...), with multi-tenancy, high performance, and resource control.
Stars: ✭ 2,323 (+41.3%)
Mutual labels:  jdbc, presto, impala
Sqlpad
Web-based SQL editor run in your own private cloud. Supports MySQL, Postgres, SQL Server, Vertica, Crate, ClickHouse, Trino, Presto, SAP HANA, Cassandra, Snowflake, BigQuery, SQLite, and more with ODBC
Stars: ✭ 4,113 (+150.18%)
Mutual labels:  presto, mysql, clickhouse
Freesql
🦄 .NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, 翰高 orm, 南大通用 orm, Click house orm, MsAccess orm.
Stars: ✭ 3,077 (+87.17%)
Mutual labels:  orm, mysql, clickhouse
Jooq
jOOQ is the best way to write SQL in Java
Stars: ✭ 4,695 (+185.58%)
Mutual labels:  orm, jdbc, mysql
Jplusone
Tool for automatic detection and asserting "N+1 SELECT problem" occurences in JPA based Spring Boot Java applications and finding origin of JPA issued SQL statements in general
Stars: ✭ 91 (-94.46%)
Mutual labels:  orm, jdbc
Prisma
Next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, SQLite & MongoDB (Preview)
Stars: ✭ 18,168 (+1005.11%)
Mutual labels:  orm, mysql
Sftnow
这是一个PHP企业门户网站(包括后台管理系统), 实现了新闻分类管理及发布管理, 角色菜单权限等系统管理
Stars: ✭ 94 (-94.28%)
Mutual labels:  orm, mysql
Xorm
xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常简便。本库是基于原版xorm的定制增强版本,为xorm提供类似ibatis的配置文件及动态SQL支持,支持AcitveRecord操作
Stars: ✭ 1,394 (-15.21%)
Mutual labels:  orm, mysql
Scalikejdbc
A tidy SQL-based DB access library for Scala developers. This library naturally wraps JDBC APIs and provides you easy-to-use APIs.
Stars: ✭ 1,139 (-30.72%)
Mutual labels:  jdbc, mysql
Fastsql
Database rapid development framework for Java(数据库快速开发框架).
Stars: ✭ 100 (-93.92%)
Mutual labels:  orm, jdbc
Ymate Platform V2
YMP是一个非常简单、易用的轻量级Java应用开发框架,涵盖AOP、IoC、WebMVC、ORM、Validation、Plugin、Serv、Cache等特性,让开发工作像搭积木一样轻松!
Stars: ✭ 106 (-93.55%)
Mutual labels:  orm, jdbc
Chloe
A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET --C#
Stars: ✭ 1,248 (-24.09%)
Mutual labels:  orm, mysql
Butterfly
🔥 蝴蝶--【简单】【稳定】【好用】的 Python web 框架🦋 除 Python 2.7,无其他依赖; 🦋 butterfly 是一个 RPC 风格 web 框架,同时也是微服务框架,自带消息队列通信机制实现分布式
Stars: ✭ 82 (-95.01%)
Mutual labels:  orm, mysql
Leoric
👑 JavaScript ORM for MySQL, PostgreSQL, and SQLite.
Stars: ✭ 94 (-94.28%)
Mutual labels:  orm, mysql
Spring Boot 2.x Examples
Spring Boot 2.x code examples
Stars: ✭ 104 (-93.67%)
Mutual labels:  presto, mysql
Servicestack.ormlite
Fast, Simple, Typed ORM for .NET
Stars: ✭ 1,532 (-6.81%)
Mutual labels:  orm, mysql
Haproxy Configs
80+ HAProxy Configs for Hadoop, Big Data, NoSQL, Docker, Elasticsearch, SolrCloud, HBase, MySQL, PostgreSQL, Apache Drill, Hive, Presto, Impala, Hue, ZooKeeper, SSH, RabbitMQ, Redis, Riak, Cloudera, OpenTSDB, InfluxDB, Prometheus, Kibana, Graphite, Rancher etc.
Stars: ✭ 106 (-93.55%)
Mutual labels:  presto, mysql
X7
x7-repo: simple orm based on spring jdbcTemplate + sqli; x7-reyc: httpClient or httpTemplate + resilience4j for k8s, plus distribution transaction
Stars: ✭ 1,573 (-4.32%)
Mutual labels:  jdbc, xream

sqli 简单的SQL拼写

http://sqli.xream.io

license maven Codacy Badge Gitter

WIKI

sqli/sqli-builder
sqli/sqli-core
sqli/sqli-dialect
sqli/sqli-repo

sqli-repo

使用方法

sqli仅仅是SQL的编程接口,需要整合到已有的框架或项目中,
在io.xream.x7项目里实现了和Spring-Boot/Spring-JdbcTemplate的整合

@EnableX7Repostory  // code at x7/x7-spring-boot-starter
public class App{
    main() 
    ....
}
    <dependency>
         <groupId>io.xream.x7</groupId>
         <artifactId>x7-spring-boot-starter</artifactId>
         ....
    </dependency>
更多代码片段:

@Repository
public interface FooRepository extends BaseRepository<Foo> {}

@Repository
public interface FooFindRepository extends ResultMapRepository {}

@X.Mapping("t_foo")//默认是foo
public class Foo {
    @X.Key
    private Long id;
    @X.Mapping("full_name") //默认是fullName
    private String fullName;
}

@Service
public class FooServiceImpl implements FooService {

    @Autowired
    private FooRepository fooRepository;
    @Autowired
    private FooFindRepository fooFindRepository;
    
    // 临时表, 原生SQL, 则直接注入, 不支持代理
    @Autowired
    private TemporaryRepository temporaryRepository;
    @Autowired
    private NativeRepository nativeRepository;

BaseRepository API

        1. in(property, inList) //in查询, 例如: 页面上需要的主表ID或记录已经查出后,补充查询其他表的文本说明数据时使用
        2. list(Object) //对象查列表
        3. find(Criteria) //标准拼接查询,返回对象形式记录,返回分页对象
        4. list(Criteria) //标准拼接查询,返回对象形式记录,不返回分页对象
        5. get(Id) //根据主键查询记录
        6. getOne(Object) //数据库只有一条记录时,就返回那条记录
        7. list() //无条件查全表, 几乎没使用场景
        8. creaet(Object) //插入一条, 不支持返回自增键, 建议用外部机制生成ID
        9. createBatch(List<Object>) //批量插入
        10. refresh(RefreshCondition) //根据主键更新
        11. refreshUnSafe(RefreshCondition)//不根据主键更新
        12. remove(Id)//根据主键删除
        13. removeRefreshCreate(RemoveRefreshCreate<T>) //编辑页面列表时写数据库

ResultMapRepository API

        14. find(ResultMapCriteria) //标准拼接查询,返回Map形式记录,返回分页对象
        15. list(ResultMapCriteria) //标准拼接查询,返回Map形式记录,不返回分页对象
        16. listPlainValue(Class<K>, ResultMapCriteria)//返回没有key的单列数据列表 (结果优化1)
        17. findToHandle(ResultMapCriteria, RowHandler<Map<String,Object>>) //流处理API

TemporaryRepository API

        1. creaet(Object) //插入一条
        2. createBatch(List<Object>) //批量插入, 适用于数据导入场景     
        3. findToCreate(Class, Criteria.ResultMapCriteria) //builder.resultKey("foo.fooName","foo_name"), 
                //仅在临时表需要设置foo_name, 如果不设置, sqli默认按顺序设置c0,c1...., 无法和临时表匹配
        4. createRepository(Class)
        5. dropRepository(Class) //在最后调用此API, 其他框架不会关闭连接而删除临时表
        
        提醒: 不建议基于临时表调用refresh(RefreshCondition), 建议尝试调用findToHandle(....)流处理API,
              异步更新, 用fallback替代事务

标准拼接API

    CriteriaBuilder // 返回Criteria, 查出对象形式记录
    CriteriaBuilder.ResultMapBuilder //返回ResultMapCriteria, 查出Map形式记录,支持连表查询
    RefreshBuilder //构建要更新的字段和条件
    
    没有copy构建要素, 即构建一次, 只可运行一次
    
    代码片段:
        {
            CriteriaBuilder builder = CriteriaBuilder.builder(Order.class); 
            builder.eq("userId",obj.getUserId()).eq("status","PAID");
            Criteria criteria = builer.build();
            orderRepository.find(criteria);
        }
    
        {
            CriteriaBuilder.ResultMapBuilder builder = CriteriaBuilder.resultMapBuilder();
            builder.resultKey("o.id");
            builder.eq("o.status","PAID");
            builder.beginSub().gt("o.createAt",obj.getStartTime()).lt("o.createAt",obj.getEndTime()).endSub();
            builder.beginSub().eq("o.test",obj.getTest()).or().eq("i.test",obj.getTest()).endSub();
            builder.sourceScript("FROM order o INNER JOIN orderItem i ON i.orderId = o.id");
            builder.paged(obj);
            Criteria.ResultMapCriteria resultMapCriteria = builder.build();
            omsRepository.find(resultMapCriteria);
        }
        
        {
            orderRepository.refresh(
                RefreshBuilder.builder().refresh("status","PAYING").eq("id",1).eq("status","UN_PAID").build()
            );
        }
    
    条件构建API  (CriteriaBuilder | ResultMapBuilder)
        1. and // AND 默认, 可省略,也可不省略
        2. or // OR
        3. eq // = (eq, 以及其它的API, 值为null,不会被拼接到SQL)
        4. ne // !=
        5. gt // >
        6. gte // >=
        7. lt // <
        8. lte // <=
        9. like //like %xxx%
        10. likeRight // like xxx%
        11. notLike // not like %xxx%
        12. in // in
        13. nin // not in
        14. isNull // is null
        15. nonNull // is not null
        16. x // 简单的手写sql片段, 例如 x("foo.amount = bar.price * bar.qty") , x("item.quantity = 0")
        17. beginSub // 左括号
        18. endSub // 右括号

    MAP查询结果构建API  (ResultMapBuilder)
        19. distinct //去重
        20. reduce //归并计算
                // .reduce(ReduceType.SUM, "dogTest.petId") 
                // .reduce(ReduceType.SUM, "dogTest.petId", Having.of(Op.GT, 1))
                //含Having接口 (仅仅在reduc查询后,有限支持Having)
        21. groupBy //分组
        22. resultKey //指定返回列
        23. resultKeyFunction //返回列函数支持
                // .resultKeyFunction(ResultKeyAlia.of("o","at"),"FFF(o.createAt, ?)", 100000) 
        24. resultWithDottedKey //连表查询返回非JSON格式数据,map的key包含"."  (结果优化2)
       
    连表构建API  (ResultMapBuilder)
        25. sourceScript(joinSql) //简单的连表SQL,不支持LEFT JOIN  ON 多条件; 多条件,请用API[28]
        26. sourceBuilder().source("order").alia("o") //连表里的主表
        27. sourceBuilder().source("orderItem").alia("i").join(JoinType.LEFT_JOIN)
                                          .on("orderId", JoinFrom.of("o","id")) //fluent构建连表sql
        28.               .more().[1~18] // LEFT JOIN等, 更多条件
        29. sourceBuilder().sub(....) // INNER JOIN (....) i  有限支持clickhouse等数据库
                        .alia("i").join("ANY INNER JOIN").on("orderId", JoinFrom.of("o","id")) //fluent构建连表sql
    
    分页及排序API  (CriteriaBuilder | ResultMapBuilder)
        30. sort("o.id", Direction.DESC)
        31. paged().ignoreTotalRows().page(1).rows(10).last(10000) //设置last(long),会忽略page(int); 
                                       
    更新构建API  (RefreshCondition)
        32. refresh
        
    框架优化
        sourceScript/sourceBuilder
            如果条件和返回都不包括sourceScript里的连表,框架会优化移除连接(但目标连接表有用时,中间表不会
            被移除)。
            关闭优化: builder.withoutOptimization()
        in
            每500个条件会切割出一次in查询
        
    不支持项
        in(sql) // 和连表查询及二级缓存的设计有一定的冲突
        union // 过于复杂
        
    特别提醒
        Retry和Fallback的正确姿势: add retry at controller, or remote client
        不能在代码的service和repository层加retry, 和fallback
        在不适合或没必要用分布式框架(seata, x-ream/reliable)的情况下, 做fallback的时候, 需要小心

二级缓存

在x7项目里实现了springBoot的Enable
    
@EnableX7L2Caching
public class App{
    main()

二级缓存是基于redis.multiGet的高速缓存实现。

二级缓存建议返回记录条数不超过20条。调用带二级缓存的API,返回记录条数超过了
20条,请关闭二级缓存。
如果需要开启二级缓存,所有对数据库的写操作项目都需要开启二级缓存。

支持二级缓存的BaseRepository的API:
        1. in(property, inList)
        2. list(Object)
        3. find(Criteria)
        4. list(Criteria)
        5. get(Id)
        6. getOne(Object)
    
不支持二级缓存的BaseRepository, ResultMapRepository的API:
        1. list()
        2. find(ResultMapCriteria)
        3. list(ResultMapCriteria)
        4. listPlainValue(ResultMapCriteria)
    
以上设计意味着,如果in和list查询返回记录条数超过20条, 二级缓存
会失去高速响应的效果,请务必关闭二级缓存. 
如果需要返回很多条记录,需要自定义返回列, 请使用:
    find(ResultMapCriteria)
    list(ResultMapCriteria)
    listPlainValue(ResultMapCriteria)
    
用户级的过滤
{
    CacheFilter.filter(userId);
    this.orderRepository.create(order); // refresh and remove
}

{
    CacheFilter.filter(userId);
    this.orderRepository.find(criteria);
}               
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].