当前位置: 首页 > 软件库 > 数据库相关 > >

sqli

授权协议 Apache-2.0 License
开发语言 C/C++
所属分类 数据库相关
软件类型 开源软件
地区 不详
投 递 者 梁池暝
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

sqli 简单的SQL拼写

http://sqli.xream.io

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);
}               
  • 什么是SQL注入? SQL注入(SQLi)通常被认为是一种注入攻击,其中攻击者可以执行恶意SQL语句。它控制Web应用程序的数据库服务器。由于SQL注入无助可能会影响使用基于SQL的数据库的任何站点或Web应用程序。弱点是最成熟,最普遍和最危险的Web应用程序漏洞之一。 通过使用SQL注入无助,在给定正确条件的情况下,攻击者可以使用它来回避Web应用程序的验证和批准组件并恢复整个数据库的实质内容。

 相关资料
  • 问题内容: 我修改了一个表格,以这种方式向其中添加状态列 但是,对于创建的任何新ITEM,SQLite似乎都不会将N添加到该列中。语法是否错误,或者SQLite及其对默认值的支持是否存在任何问题。 我正在使用SQLite 3.6.22 问题答案: 对我来说看上去很好。 这是文档。 转储您的模式,并 在调用ALTER TABLE之后但在INSERT之前 验证 表结构是否存在。如果它在事务中,请 确保

  • 问题内容: 如何在Android上的SQLite数据库中获取布尔字段的值? 我通常使用,等获取字段的值,但似乎没有方法。 问题答案: 它是:

  • 问题内容: 我在这个应用程序中有一个应该创建和使用数据库的类,但是Eclipse告诉我sqlite方法是未定义的。 似乎是一个上下文问题,但我不知道如何解决,我是否要扩展其他类而不是Activity? 谢谢你的帮助! 问题答案: 我建议您使用SQLiteOpenHelper。 如果数据库不可用,它会自动创建一个数据库。 示例代码: 像这样使用它: 我认为这很容易,您无需担心数据库是否已存在。 希望

  • 问题内容: 我有一个这样的课: 成本,利润和标价列为“ BigDecimal”,因为在原始(C#)应用中,它们为Decimal 因此定义了相应的SQLite表: 最接近Decimal(C#)或BigDecimal(Java)的SQLite是REAL,这是SQLite唯一的浮点数据类型。 在扩展SQLiteOpenHelper的类中,我试图从表中选择值并将它们存储在我的自定义类类型的ArrayLis

  • 问题内容: 我正在应用程序中处理许多不同的货币,我想知道将它们存储在SQLite3数据库中的“最佳”方法是什么。 我倾向于定点表示(即,将它们存储为整数,其中$ 3.59被存储为359,¥400被存储为40000)。这是一个好主意吗?如果我的输入数据以后更改并且需要更高的精度怎么办? 问题答案: 鉴于SQLite 3将最多使用8个字节来存储INTEGER类型,除非您要使用大于10 ^ 16的数字,

  • 问题内容: 尝试更新不赞成使用某些方法的旧应用程序。我发现,如果要使用显示来自db数据的ListView,应该使用LoaderManager + CursorLoader。CursorLoader与内容提供程序一起使用。因此,对于数据库中的每个表,我现在应该创建内容提供程序吗?我为什么要 ?据我所知,内容提供商用于与其他应用程序共享一些数据库信息,但我的应用程序不共享任何信息。所以我可以在没有内容

  • 问题内容: 有没有人有关于在SQLite中从Android上的libGDX存储数据的任何提示。我对Android SDK中使用的技术非常熟悉,但是我不知道如何从libGDX调用这些Android数据库函数。我知道从libGDX调用函数会使我的游戏无法在桌面上使用,但是我可以解决这个问题。 问题答案: 一种方法总是在您的主项目中创建一个界面,我们称它为。然后,让桌面和Android应用程序/活动都实

  • 问题内容: 我将数据保存在SQLite数据库中。我将日期保存为DATETIME数据类型在数据库中。 我只想从我的SQLite数据库中检索特定月份的数据。 我尝试使用下面的查询来检索数据,但是它没有用。它给了我数据,但不是特定月份。 问题答案: 这可能不是最佳选择,但您可以使用: