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();
基于以上原因hisql语法就诞生了
sqlClient.HiSql("select * from Hi_TabModel").ToSql();
可能很多人一看这不就是一条sql吗?与原生的sqlserver sql语句不一样吗? 是这就是一样sql语句学过sql的人一看就明白。如果你有兴趣连接不同的数据库如【sqlserver,mysql,oralce,postgresql,hana】再来执行这个语句你发现他都能执行,是的这个hisql语句就是跨平台的。
HiSql ORM框架底层内置了语法解析器,先将hisql->词法分析->语法分析->构建AST语法树->解析成目标sql
有了hisql语法 不再需要自定义一个json to sql 这种复杂的结构,让代码更直观更简洁
hisql语法demo样例
- 单表查询 查询表
Hi_FieldModel
所有字段数据及记录
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel").ToTable();
- 单表条件
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>10 and TabName='HTest'").ToTable();
- 排序
asc
升序 desc
降序
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>10 and TabName='HTest' order by SortNum asc").ToTable();
- 分组
DataTable dt=sqlClient.HiSql("select TabName FieldType,count(FieldName) as Fcount from Hi_FieldModel group by TabName, FieldType ").ToTable();
- 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();
- 去重
DataTable dt=sqlClient.HiSql("select distinct * from Hi_FieldModel").ToTable();
- 参数化条件
参数化最大的优势就是可以防注入,对于前端输入的参数防止传入恶意代码进行非法操作。在HiSql语法解析底层已经对非法参数进行了处理有效的对注入代码防护。
注意:参数名称要用[$] 包函,如果定义了参数在参数中以没有体现那么将出抛出异常
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel where FieldType>[$fieldtype$] and TabName=[$tabname$]",
new Dictionary<string, object> { { "[$fieldtype$]", "10" }, { "[$tabname$]", "HTest" } }
).ToTable();
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();
2
3
4
- 多表关联查询 可以实现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();
- 分页
Take
表示每页显示的大小 Skip
表示显示的页码 最小为1
DataTable dt=sqlClient.HiSql("select * from Hi_FieldModel").Take(1000).Skip(1).ToTable();
2