1. 程式人生 > 其它 >hisql 新功能 支援一套sql在不同資料庫執行

hisql 新功能 支援一套sql在不同資料庫執行

目前流行的ORM框架如果需要動態的拼接查詢語句,只能用原生的sql進行拼接,無法跨不同資料庫執行。hisql推出新的語法一套語句可以在不同的資料庫執行

傳統ORM框架最大的弊端就是完全要依賴於實體用lambda表示式寫查詢語句,但最大的問題就是如果業務場景需要動態拼接條件時只能又切換到原生資料庫的sql語句進行完成,如果自行拼接開發人員還要解決防注入的問題,hisql 剛才完美的解決這些問題,Hisql底層已經對sql注入進行了處理,開發人員只要關注於業務開發

hisql github原始碼下載

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

HiSql不僅僅是一個ORM框架而且是一個HiSql

SQL語句 如下所示

    string sql = sqlClient.HiSql($"select * from Hi_FieldModel  where (tabname = 'h_test') and  FieldType in (11,21,31) and tabname in (select tabname from Hi_TabModel)").ToSql();

以上語法是不是與sqlserver 和sql語句有點類似?是的 但他可不是原生的sql,現在統一命名為hisql ,這個語法可以在hisql 支援的任意庫中執行

hisql 支援 常規sql基本join操作
inner join

join
left inner joinleft join
outer join
也支援 子查詢 in (select ....)

hisql inner join 示例

    string sql = sqlClient.HiSql($"select b.tabname, a.fieldname,a.IsPrimary from  Hi_FieldModel as a  inner join   Hi_TabModel as  b on a.tabname = b.tabname" ).ToSql();

以上示例的hisql程式碼編譯後成的sqlserver的原生sql如下

select [b].[tabname],[a].[fieldname],[a].[IsPrimary] from [Hi_FieldModel] as [a]
 inner join [Hi_TabModel] as [b] on [a].[tabname]=[a].[tabname]

在生成的mysql 原生sql如下

select `b`.`tabname`,`a`.`fieldname`,`a`.`IsPrimary` from `Hi_FieldModel` as `a`
 inner join `Hi_TabModel` as `b` on `a`.`tabname`=`a`.`tabname`

也可以多表Join

string sql = sqlClient.HiSql($"select b.tabname, a.fieldname,a.IsPrimary from  Hi_FieldModel as a  inner join   Hi_TabModel as  b on a.tabname = b.tabname" +
                $" inner join Hi_TabModel as c on a.tabname = c.tabname ").ToSql();

注意如果出現語法錯誤將會丟擲異常並提示HiSql語法檢測錯誤:xxxxx 根據這個錯誤提示可自行定位問題

hisql 語句實現分頁

示例程式碼如下

int total = 0;
    var table = sqlClient.HiSql($"select fieldlen,isprimary from  Hi_FieldModel     order by fieldlen ")
        .Take(3).Skip(2)
        .ToTable(ref total);

注意:分頁查詢時一定有一個order by 語句,並可以返回當前條件的資料總記錄數total

hisql 語句實現 in查詢 及select in 查詢

    string sql = sqlClient.HiSql($"select * from Hi_FieldModel  where (tabname = 'Hi_FieldModel') and  FieldType in (11,21,31) and tabname in (select tabname from Hi_TabModel) order by tabname asc")
        .Take(2).Skip(2)
        .ToSql();

hisql 語句實現 group by 查詢

string sql = sqlClient.HiSql($"select FieldName,FieldType from Hi_FieldModel  group by FieldName,FieldType ")
             .Take(2).Skip(2)
             .ToSql();