HiSql语法

为什么要有hisql语句?

平常我们在使用sqlserver,mysql,oralce,postgreesql,hana 时有没有发现都是sql语句各自的语法都有差别?在sqlserver写的查询语句是无法在mysql直接运行的

很多ORM框架都是用Lambda表达式解析成目标库的sql语句来实现跨平台,但Lambda的运行只能写死在代码中无法像执行一个原生sql语句一样进行跨平台执行

如下样例所示如要将Where的表达式进行动态拼接通过Lambda表达式实现是极复杂的,大部分的开发伙伴在这处情况下都会用原生的sql来进行拼接,然后用原生拼接的SQL是无法跨平台实现的

db.Queryable<Student>().Where(it=>it.Id==1).ToList();
1

基于以上原因hisql语法就诞生了

sqlClient.HiSql("select * from Hi_TabModel").ToSql();
1

可能很多人一看这不就是一条sql吗?与原生的sqlserver sql语句不一样吗? 是这就是一样sql语句学过sql的人一看就明白。如果你有兴趣连接不同的数据库如【sqlserver,mysql,oralce,postgresql,hana】再来执行这个语句你发现他都能执行,是的这个hisql语句就是跨平台的。

HiSql ORM框架底层内置了语法解析器,先将hisql->词法分析->语法分析->构建AST语法树->解析成目标sql

有了hisql语法 不再需要自定义一个json to sql 这种复杂的结构,让代码更直观更简洁

hisql语法demo样例

  1. 单表查询 查询表Hi_FieldModel 所有字段数据及记录
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel").ToTable();
1
  1. 单表条件
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>10 and TabName='HTest'").ToTable();
1
  1. 排序

asc 升序 desc 降序

DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>10 and TabName='HTest' order by SortNum asc").ToTable();
1
  1. 分组
DataTable dt=sqlClient.HiSql("select TabName FieldType,count(FieldName) as Fcount from Hi_FieldModel group by TabName, FieldType  ").ToTable();
1
  1. having

having 一定要结合group by 使用

DataTable dt=sqlClient.HiSql("select TabName FieldType,count(FieldName) as Fcount from Hi_FieldModel group by TabName, FieldType  having count(FieldName)>2").ToTable();
1
  1. 去重
   DataTable dt=sqlClient.HiSql("select distinct * from Hi_FieldModel").ToTable();
1
  1. 参数化条件

参数化最大的优势就是可以防注入,对于前端输入的参数防止传入恶意代码进行非法操作。在HiSql语法解析底层已经对非法参数进行了处理有效的对注入代码防护。

注意:参数名称要用[$] 包函,如果定义了参数在参数中以没有体现那么将出抛出异常

DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>[$fieldtype$] and TabName=[$tabname$]",
new Dictionary<string, object> { { "[$fieldtype$]", "10" }, { "[$tabname$]", "HTest" } }
).ToTable();
1
2
3

最新的参数化用法(建议)

参数化的用户可以有效的解决SQL注入问题,hisql不是原生sql是一套中间sql语句,前端可以拼接hisql语法结构实现动态查询,比json to sql更好用更直观

DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>@FieldType and TabName=@TabName",
new {FieldType=11,TabName="H_TEST"}
).ToTable();

1
2
3
4
  1. 多表关联查询 可以实现inner join ,left inner join,outer join 常用表关联方式
DataTable dt=sqlClient.HiSql("select b.TabName,a.FieldName from Hi_FieldModel as a  inner join  Hi_TabModel as b on a.TabName = b.TabName where a.FieldType>10 and a.TabName='HTest'").ToTable();
1
  1. 分页

Take 表示每页显示的大小 Skip 表示显示的页码 最小为1

DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel").Take(1000).Skip(1).ToTable();

1
2