hisql ORM 框架研究(国内第一个支持HANA的ORM框架)
HiSql 操作说明文档 V1.0
下一代ORM框架 国内第一个支持HANA的ORM框架
git clone https://github.com/tansar/HiSql.git
测试源码地址hisql与sqlsugar freesql测试源码
git clone https://github.com/tansar/HiSqlTestDemo.git
特点
- 支持无实体数据交互,(无需要创建实体类)
- 数据动态检测(类型,长度 与表结构预先匹配)
- 语法更帖近于原生SQL
- 支持超时监控(如监控过5S的执行的SQL语 并记录)
- 支持多种库,可自主选择需要支持的库
- 性能优越(会出一篇与FreeSql,SugarSql 的性能对比文章)
适用于场景
HiSql 适用于开发企业的内部管理系统如OA,工作流平台,ERP系统
项目引用
- 引用HiSql.dll文件
- 根据使用数据库的需要可以引用以下数据库实现的sdk
- HiSql.SqlServer.dll 已经支持
- HiSql.Hana.dll 已经支持(国内第一个支持HANA的ORM框架)
- HiSql.MySql.dll 已经支持
- HiSql.Oracle.dll 已经支持
- HiSql.PostGreSql 已经支持
- HiSql.SqlLite 即将发布
配置数据库连接
HiSqlClient sqlclient = new HiSqlClient(
new ConnectionConfig()
{
DbType = DBType.SqlServer,
DbServer="local-HoneBI",
ConnectionString = "server=(local);uid=sa;pwd=H---#$3;database=hisql;",//;
Schema = "dbo",
IsEncrypt = true,
IsAutoClose = false,
SqlExecTimeOut=60000,
AppEvents = new AopEvent()
{
OnDbDecryptEvent = (connstr) =>
{
//解密连接字段
//Console.WriteLine($"数据库连接:{connstr}");
return connstr;
},
OnLogSqlExecuting = (sql, param) =>
{
//sql执行前 日志记录 (异步)
//Console.WriteLine($"sql执行前记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
},
OnLogSqlExecuted = (sql, param) =>
{
//sql执行后 日志记录 (异步)
//Console.WriteLine($"sql执行后记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
},
OnSqlError = (sqlEx) =>
{
//sql执行错误后 日志记录 (异步)
Console.WriteLine(sqlEx.Message.ToString());
},
OnTimeOut=(int timer)=>
{
//Console.WriteLine($"执行SQL语句超过[{timer.ToString()}]毫秒...");
}
}
}
);
表数据插入
单表单条数据插入
Insert语法
参1:"Hi_DataElement"可以是一个物理表也可以是临时表
临时表的写法如 "#Hi_DataElement" 用1个#号表示 本地临时表 两个#号表示是全局临时表
变更表写法如"@Hi_DataElement" 注:仅对sqlserver数据库支持参2:new { domain = "UTYPE" }
可以是匿名类也可以是实体类,匿名类的属性不区分大小写 如字段写的是[domain] 数据库中的字段为Domain 也默认就是对应的是Domain
注:HiSql将会自动校验插入的值的类型,长度是否与底层目标数据库相匹配如果不匹配将会检测报错
sqlclient.Insert("Hi_DataElement", new { domain = "UTYPE" });以上语句并不会立即执行插入如要执行插入如下所示
sqlclient.Insert("Hi_DataElement", new { domain = "UTYPE" }).ExecCommand();
如果要监控该语句生成的目标数据库的sql语句可以在连接配置事件
执行前或执行后都可以监控到OnLogSqlExecuting = (sql, param) =>
{
//sql执行前 日志记录 (异步) //Console.WriteLine($"sql执行前记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
},
OnLogSqlExecuted = (sql, param) =>
{
//sql执行后 日志记录 (异步)
//Console.WriteLine($"sql执行后记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
}
也可以直接返回Sql语句如下所示
sqlclient.Insert("Hi_DataElement", new { domain = "UTYPE" }).ToSql();
批量插入数据
对表操作无需像其它框架一样需要体实体,HiSql可以不要实体,当然如果习惯了用实体也可以使用实体插入
int _times = 100000;
List<object> lstobj = new List<object>();
for (int i = 0; i < _times; i++)
{
lstobj.Add(new { Domain = $"{i}", DomainDesc = $"用户类型{i}" }); }
sqlclient.Insert("Hi_Domain", new { Domain = "UTYPE", DomainDesc = "用户类型" }).ExecCommand();
表数据查询
单表查询
返回结构可以ToTable ToJson ToList ToDynamic 本例演示ToTable
查询返回一个DataTable 同时这里也用到了排序
DataTable DT_RESULT1= sqlclient.Query("DataDomain").Field("Domain").Sort(new SortBy { { "createtime" } }).ToTable();
对表定义别名
DataTable DT_RESULT2 = sqlclient.Query("DataDomain").As("a").Field("a.Domain").Sort(new SortBy { { "a.createtime" } }).ToTable();
查询返回一个实体
查询该表的所有字段在Field方法中传入"*"List<Hi_Domain> lstefresult = sqlclient.Query("Hi_Domain").Field("*").Sort("createtime asc", "moditime").ToList<Hi_Domain>();分页查询
DataTable DT_RESULT3 = sqlclient.Query("DataDomain").As("a").Field("a.Domain").Sort(new SortBy { { "a.createtime" } }).Skip(1).Take(100).ToTable();
多表简单关联查询
多表关联并实现条件过滤且进行分页
DataTable DT_RESULT = sqlclient.Query("Hi_FieldModel", "A").Field("A.FieldName as Fname")
.Join("Hi_TabModel").As("B").On(new JoinOn { { "A.TabName", "B.TabName" } })
.Where(new Filter {
{"A.TabName", OperType.EQ, "Hi_FieldModel"},
{"A.FieldType",OperType.BETWEEN,new RangDefinition(){ Low=10,High=99} },
})
.Skip(1).Take(10).ToTable();
实现分组查询 group分组
DataTable DT_RESULT = sqlclient.Query("Hi_FieldModel", "A").Field("A.FieldName as Fname")
.Join("Hi_TabModel").As("B").On(new JoinOn { { "A.TabName", "B.TabName" } })
.Where(new Filter {
{"A.TabName", OperType.EQ, "Hi_FieldModel"},
{"A.FieldType",OperType.BETWEEN,new RangDefinition(){ Low=10,High=99} },
})
.Group(new GroupBy { { "A.FieldName" } })
.ToTable();
带统计函数查询
DataTable dt_resultfun = sqlclient.Query("Hi_FieldModel", "A").Field("A.FieldName as Fname", "count(*) as avgFieldLen")
.Join("Hi_TabModel").As("B").On(new JoinOn { { "A.TabName", "B.TabName" } })
.Where(new Filter {
{"A.TabName", OperType.EQ, "Hi_FieldModel"},
{"A.FieldType",OperType.BETWEEN,new RangDefinition(){ Low=10,High=99} }, })
.Group(new GroupBy { { "A.FieldName" } })
.ToTable();
支持的函数
- count 样例 count(*) as scount
- avg 样例 avg("score") as avgscore 注:score必须是数值型否则HiSql将会出现错误提示
- sum 样例 sum("score") as sumscore 注:score必须是数值型否则HiSql将会出现错误提示
- min 样例 min("score") as minscore
- max 样例 max("score") as maxscore
多表关联分页查询
可以对组数据数据进行分页查询
DataTable dt_resultfun = sqlclient.Query("Hi_FieldModel", "A").Field("A.FieldName as Fname", "count(*) as avgFieldLen")
.Join("Hi_TabModel").As("B").On(new JoinOn { { "A.TabName", "B.TabName" } })
.Where(new Filter {
{"A.TabName", OperType.EQ, "Hi_FieldModel"},
{"A.FieldType",OperType.BETWEEN,new RangDefinition(){ Low=10,High=99} }, })
.Group(new GroupBy { { "A.FieldName" } })
.Skip(2).Take(10)
.ToTable();
复杂子表关联union all查询
DataTable dt_resultuinon = sqlclient.Query(
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.IN,
sqlclient.Query("Hi_TabModel").Field("TabName").Where(new Filter { {"TabName",OperType.IN,new List<string> { "Hone_Test", "H_TEST" } } })
} }),
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.EQ, "DataDomain" } }),
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.EQ, "Hi_FieldModel" } })
)
.Field("TabName", "count(*) as CHARG_COUNT")
.Group(new GroupBy { { "TabName" } }).ToTable();复杂子表关联 分组排名
WithRank方法 可以查询结果进行排序排名
DbRank.DENSERANK 不跳号排名
DbRank.RANK 跳号排名
DbRank.ROWNUMBER 按记录行号排名
DataTable dt_resultuinon = sqlclient.Query(
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.IN,
sqlclient.Query("Hi_TabModel").Field("TabName").Where(new Filter { {"TabName",OperType.IN,new List<string> { "Hone_Test", "H_TEST" } } })
} }),
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.EQ, "DataDomain" } }),
sqlclient.Query("Hi_FieldModel").Field("*").Where(new Filter { { "TabName", OperType.EQ, "Hi_FieldModel" } })
)
.Field("TabName", "count(*) as CHARG_COUNT")
.WithRank(DbRank.DENSERANK, DbFunction.NONE, "TabName", "rowidx1", SortType.ASC)
.WithRank(DbRank.ROWNUMBER, DbFunction.COUNT, "*", "rowidx2", SortType.ASC)
.WithRank(DbRank.RANK, DbFunction.COUNT, "*", "rowidx3", SortType.ASC)
.Group(new GroupBy { { "TabName" } }).ToTable();
hisql ORM 框架研究(国内第一个支持HANA的ORM框架)的更多相关文章
- 企业架构研究总结(38)——TOGAF架构能力框架之架构能力建设和架构治理
为了确保架构功能在企业中能够被成功地运用,企业需要通过建立适当的组织结构.流程.角色.责任和技能来实现其自身的企业架构能力,而这也正是TOGAF的架构能力框架(Architecture Capabil ...
- polaris: 一个用go实现的支持restful的web框架
介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计. 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好 ...
- SSH框架之Spring第一篇
1.1. spring概述: 1.1.1 spring介绍 : Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control : 反 ...
- SSH框架之Hibernate第一篇
1.2Hibernate的概述: 1.2.1 什么Hibernate? Hibernate(开发源代码的对象关系映射框架)是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它 ...
- Newbe.Claptrap 框架入门,第一步 —— 开发环境准备
Newbe.Claptrap 框架依托于一些关键性的基础组件和一些可选的辅助组件.本篇我们来介绍一下如何准备一个开发环境. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如 ...
- Android 框架学习之 第一天 okhttp & Retrofit
最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...
- 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...
- 《连载 | 物联网框架ServerSuperIO教程》- 17.支持实时数据库,高并发保存测点数据。附:3.4 发布与版本更新说明。
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)
上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...
随机推荐
- 重量级&轻量级
重量级 就是说包的大小,还有就是与个人项目的耦合程度,重量级的框架与项目耦合程度大些 代表EJB容器的服务往往是"买一送三",不要都不行 轻量级 就是相对较小的包,当然与项目的耦合 ...
- SOUI3界面编辑器使用说明
SOUI一直没有官方的界面编辑器,关键是我自己一直坚持手写界面更好控制. 大概是2年前,网友"指尖"开发了一个SOUI2的编辑器,功能非常多,特点是可以拖动控件来实现可视化布局. ...
- Jenkins监控
目录 一.Monitoring插件 二.Prometheus监控 一.Monitoring插件 Monitoring插件(monitoring)使用JavaMelody,对Jenkins进行监控.插件 ...
- Nginx 中 location 的匹配顺序
nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...
- 子组件dispatch导致其他页面刷新问题解决
问题: 现在有一个页面,包含"项目基本要素"和"供应链管控要素"多个组件,其中一个组件有表单级联,通过产品类型的不同选取去调接口获得产品名称的下拉 调接口是通过 ...
- Table.ReorderColumns移动…Reorder…(Power Query 之 M 语言)
数据源: 至少两列 目标: 列顺序重新排列 操作过程: 选取待移动的列>鼠标拖放列标题 选取待移动的列>[转换]>[移动]>选取 M公式: = Table.ReorderCo ...
- HTTPS握手-混合加解密过程
SSL协议通信过程 (1) 浏览器发送一个连接请求给服务器;服务器将自己的证书(包含服务器公钥S_PuKey).对称加密算法种类及其他相关信息返回客户端; (2) 客户端浏览器检查服务器传送到CA证书 ...
- MIUI12.5扫码之后无法连接MIUI+,显示连接失败
设置-应用设置-应用管理-小米互联通信服务(如果没有找到,进行搜索即可)-清除数据 重新扫码连接就可以连上了 (感觉不怎么样,不知道是不是我网卡,用起来卡卡的...)
- JAVA实现查询栏目、类别(菜单)返回树结构(递归)
其中Channel.java是栏目结构,ChannelDto是我自己封装的返回给前端的数据,可以根据自己的来 这个的逻辑就是双重循环遍历每个类别,然后判断如果当前类别是其他类别的父级,那么就把其他类别 ...
- nim_duilib之msgbox用法(23)
概述 本文将介绍 msgbox 的用法 更多用法,请参考 源码 改进了原有的xml样式 一个样式 xml结构 整体垂直布局 xml源码 demo源码下的msg/msg.xml文件内容 改为如下 注意: ...