HiSql 操作说明文档 V1.0

下一代ORM框架 国内第一个支持HANA的ORM框架

hisql源码下载

git clone https://github.com/tansar/HiSql.git

测试源码地址hisql与sqlsugar freesql测试源码

git clone https://github.com/tansar/HiSqlTestDemo.git

特点

  1. 支持无实体数据交互,(无需要创建实体类)
  2. 数据动态检测(类型,长度 与表结构预先匹配)
  3. 语法更帖近于原生SQL
  4. 支持超时监控(如监控过5S的执行的SQL语 并记录)
  5. 支持多种库,可自主选择需要支持的库
  6. 性能优越(会出一篇与FreeSql,SugarSql 的性能对比文章)

适用于场景

HiSql 适用于开发企业的内部管理系统如OA,工作流平台,ERP系统

项目引用

  1. 引用HiSql.dll文件
  2. 根据使用数据库的需要可以引用以下数据库实现的sdk
    1. HiSql.SqlServer.dll 已经支持
    2. HiSql.Hana.dll 已经支持(国内第一个支持HANA的ORM框架)
    3. HiSql.MySql.dll 已经支持
    4. HiSql.Oracle.dll 已经支持
    5. HiSql.PostGreSql 已经支持
    6. 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()}]毫秒...");
}
}
}
);

表数据插入

  1. 单表单条数据插入

    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();
  2. 批量插入数据

    对表操作无需像其它框架一样需要体实体,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();

表数据查询

  1. 单表查询

    返回结构可以ToTable ToJson ToList ToDynamic 本例演示ToTable

    1. 查询返回一个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();
    2. 查询返回一个实体

      查询该表的所有字段在Field方法中传入"*"

      List<Hi_Domain> lstefresult = sqlclient.Query("Hi_Domain").Field("*").Sort("createtime asc", "moditime").ToList<Hi_Domain>();
      
      
    3. 分页查询

      DataTable DT_RESULT3 = sqlclient.Query("DataDomain").As("a").Field("a.Domain").Sort(new SortBy { { "a.createtime" } }).Skip(1).Take(100).ToTable();
      
      
  2. 多表简单关联查询

    1. 多表关联并实现条件过滤且进行分页

      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();
    2. 实现分组查询 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();
    3. 带统计函数查询

      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
    4. 多表关联分页查询

      可以对组数据数据进行分页查询

      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();
  3. 复杂子表关联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();
  4. 复杂子表关联 分组排名

    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框架)的更多相关文章

  1. 企业架构研究总结(38)——TOGAF架构能力框架之架构能力建设和架构治理

    为了确保架构功能在企业中能够被成功地运用,企业需要通过建立适当的组织结构.流程.角色.责任和技能来实现其自身的企业架构能力,而这也正是TOGAF的架构能力框架(Architecture Capabil ...

  2. polaris: 一个用go实现的支持restful的web框架

    介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计. 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好 ...

  3. SSH框架之Spring第一篇

    1.1. spring概述: 1.1.1 spring介绍 : Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control : 反 ...

  4. SSH框架之Hibernate第一篇

    1.2Hibernate的概述: 1.2.1 什么Hibernate? Hibernate(开发源代码的对象关系映射框架)是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它 ...

  5. Newbe.Claptrap 框架入门,第一步 —— 开发环境准备

    Newbe.Claptrap 框架依托于一些关键性的基础组件和一些可选的辅助组件.本篇我们来介绍一下如何准备一个开发环境. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如 ...

  6. Android 框架学习之 第一天 okhttp & Retrofit

    最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...

  7. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 17.支持实时数据库,高并发保存测点数据。附:3.4 发布与版本更新说明。

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

    上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...

随机推荐

  1. 重量级&轻量级

    重量级 就是说包的大小,还有就是与个人项目的耦合程度,重量级的框架与项目耦合程度大些 代表EJB容器的服务往往是"买一送三",不要都不行 轻量级 就是相对较小的包,当然与项目的耦合 ...

  2. SOUI3界面编辑器使用说明

    SOUI一直没有官方的界面编辑器,关键是我自己一直坚持手写界面更好控制. 大概是2年前,网友"指尖"开发了一个SOUI2的编辑器,功能非常多,特点是可以拖动控件来实现可视化布局. ...

  3. Jenkins监控

    目录 一.Monitoring插件 二.Prometheus监控 一.Monitoring插件 Monitoring插件(monitoring)使用JavaMelody,对Jenkins进行监控.插件 ...

  4. Nginx 中 location 的匹配顺序

    nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...

  5. 子组件dispatch导致其他页面刷新问题解决

    问题: 现在有一个页面,包含"项目基本要素"和"供应链管控要素"多个组件,其中一个组件有表单级联,通过产品类型的不同选取去调接口获得产品名称的下拉 调接口是通过 ...

  6. Table.ReorderColumns移动…Reorder…(Power Query 之 M 语言)

    数据源: 至少两列 目标: 列顺序重新排列 操作过程: 选取待移动的列>鼠标拖放列标题 选取待移动的列>[转换]>[移动]>选取 M公式:  = Table.ReorderCo ...

  7. HTTPS握手-混合加解密过程

    SSL协议通信过程 (1) 浏览器发送一个连接请求给服务器;服务器将自己的证书(包含服务器公钥S_PuKey).对称加密算法种类及其他相关信息返回客户端; (2) 客户端浏览器检查服务器传送到CA证书 ...

  8. MIUI12.5扫码之后无法连接MIUI+,显示连接失败

    设置-应用设置-应用管理-小米互联通信服务(如果没有找到,进行搜索即可)-清除数据 重新扫码连接就可以连上了 (感觉不怎么样,不知道是不是我网卡,用起来卡卡的...)

  9. JAVA实现查询栏目、类别(菜单)返回树结构(递归)

    其中Channel.java是栏目结构,ChannelDto是我自己封装的返回给前端的数据,可以根据自己的来 这个的逻辑就是双重循环遍历每个类别,然后判断如果当前类别是其他类别的父级,那么就把其他类别 ...

  10. nim_duilib之msgbox用法(23)

    概述 本文将介绍 msgbox 的用法 更多用法,请参考 源码 改进了原有的xml样式 一个样式 xml结构 整体垂直布局 xml源码 demo源码下的msg/msg.xml文件内容 改为如下 注意: ...