.NET 6 開源之JSON 2 SQL (JORM框架)
什么是JORM框架?
全稱 :Json Object Relational Mapping ,它是通過JSON 對象 去實現(xiàn)數(shù)據(jù)庫的一個關系映射 ,我理想中完整的JORM包含功能有
1、表權授權
2、字段級別授權
3、查詢返回備注
4、可以配置化
5、支持豐富的SQL語法
6、數(shù)據(jù)驗證
7、JSON作為數(shù)據(jù)庫中間語言支持多種數(shù)據(jù)庫
為什么要開發(fā)JORM
我們都知道 ORM用起來非常舒服,都強類型,但是他的缺點很顯
1、對動態(tài)操作支持比較弱 , 很多功能都要自個封裝,很難支持到函數(shù)級別
2、不能支持列級別的過濾,比如A用戶顯示2列,B用戶顯示3列,像這種很難處理
3、無法動態(tài)構造,這就導致了無法很好的用在 工作流、低代碼平臺或者人工智能產(chǎn)品中,很多都是需要自個拼SQL,查詢用Datable等
SqlSugar 開始支持JORM
SqlSugar是一款 老牌 .NET 開源ORM框架,由果糖大數(shù)據(jù)科技團隊維護和更新
為提高本公司內部產(chǎn)品的開發(fā)效率,準備打造一款低代碼平臺,所以從2022年1月份已經(jīng)開始設計和架構 支持JORM操作數(shù)據(jù)庫
創(chuàng)建JORM對象
JsonClient jsonToSqlClient = new JsonClient();
jsonToSqlClient.Context = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.MySql,
IsAutoCloseConnection = true,
ConnectionString = "server=localhost;Database=SqlSugar4xTest;Uid=root;Pwd=haosql"
});
一、查詢功能
1.1、帶有函數(shù)的查詢
Json格式
{
"Table":"order",
Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate:[]},"Date"] ]
}
代碼
jsonToSqlClient.Queryable(json).ToSql()
//Sql
//SELECT MIN(`id`) AS `id` , NOW() AS `Date` FROM `Order`
2.2、帶有條件的查詢
{
"Table":"order",
Where:[ "name","=", "{string}:xxx" ],
Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate:[]},"Date"] ]
}
代碼
jsonToSqlClient.Queryable(json).ToSql()
//Sql
//SELECT MIN(`id`) AS `id` , NOW() AS `Date` FROM `Order` WHERE `name` = @p0
條件查詢有2種語法
語法1:可以完美支持 SqlSugar表格查詢語法
Where: [{ ""FieldName"":""id"",""ConditionalType"":""0"",""FieldValue"":""1""}]
語法2:逗號拼接方式
Where:["name","=","{string}:a" , "&&" , "id" ,">", "{int}:1"]
運算符號: = 、>、<、>=、<=、&&、||、(、)
字段名:字母數(shù)字下劃線
參數(shù)值: {int}:1 表式類型為int值為1的參數(shù)
函數(shù):{SqlFunc_AggregateMin:["id"]} 表式 min(id)
2.3、分頁查詢
Json格式
{
"Table":"order",
PageNumber:"1",
PageSize:"100"
}
代碼
var sqls=jsonToSqlClient.Queryable(json).ToSqlList()
//SELECT COUNT(1) FROM `Order`
//SELECT * FROM `Order` LIMIT 0,100
2.4、分組查詢
Json格式
{
"Table": "order" ,
GroupBy:["name"],
Having: [{SqlFunc_AggregateAvg:["id"]},">","{int}:1" ],
Select:[ [{SqlFunc_AggregateAvg:["id"]},"id"],"name" ]
}
代碼
var sql= jsonToSqlClient.Queryable(json).ToSql()
//SELECT AVG(`id`) AS `id` , `name` AS `name` FROM `Order` GROUP BY `name` HAVING AVG(`id`) > @p0
2.5、聯(lián)表查詢
Json格式
{
"Table":[ "order","o"],
"LeftJoin01": ["orderdetail", "d", [ "d.orderid",">","o.id" ]],
"Select":["o.id" ,["d.itemid","newitemid"]]
}
代碼
var sql= jsonToSqlClient.Queryable(json).ToSql();
//SELECT `o`.`id` AS `o_id` , `d`.`itemid` AS `newitemid` FROM `Order` o Inner JOIN `orderdetail` d ON `d`.`orderid` > `o`.`id`
2.6、授權查詢
該功能目前還不完善,暫時不細解
var tableNames = jsonToSqlClient.GetTableNameList(json);//通過JSON獲取JSON所有表
var configs = GetConfigByUser(tableNames);//通過表獲取行列過濾備注等信息
var sqlList = jsonToSqlClient
.Queryable(json)
.UseAuthentication(configs)//查詢啟用行列過濾
.ShowDesciption()//查詢返回備注
.ToResult();
二、插入
單條插入
{
"Table":"order",
Columns:{name:"{string}:1",price:"{decimal}:1"}
}
批量持入
{
"Table":"order",
Columns:[ {name:"{string}:2",price:"{decimal}:2"} , {name:"{string}:1",price:"{decimal}:1"} ]
}
帶自增列
{
"Table":"order",
Identity:"id",
Columns: {name:"{string}:2",price:"{decimal}:2"}
}
三、更新
單個對象更新
{
"Table":"order",
Columns: { id:"{int}:1" ,name:"{string}:1" },
WhereColumns:["id"]
}
多個對象更新
{
"Table":"order",
Columns:[ {id:2,name:"{string}:2",price:"{decimal}:2"} , {id:1,name:"{string}:1",price:"{decimal}:1"} ],
WhereColumns:["id"]
}
Sql語句方式更新
{
"Table":"order",
Columns: {name:"{string}:2",price:"{decimal}:2"} ,
Where:["id","=","{int}:11"]
}
四、刪除
Where中的用法和查詢一樣的
Json格式
{
"Table":"order",
Where:[ "id"," = ","{int}:1" ]
}
代碼
jsonToSqlClient.Deleteable(json).ToSqlList()
//DELETE FROM `order` WHERE `id` = @p0
五、源碼下載
SqlSugar未來將重點開發(fā)JORM ,喜歡低代碼平臺或者工作流的朋友,可以關注一下, 目前還是開發(fā)階段 ,預計在未來3個月內投入生產(chǎn)
https://github.com/donet5/SqlSugar

很多人問有了EF Core為什么還有其它ORM ,這個問題就等于淘寶只有天貓一樣,只有豐富的產(chǎn)品才會形成良性競爭,讓用戶有更多選擇。
轉自:果糖大數(shù)據(jù)科技
鏈接:cnblogs.com/sunkaixuan/p/16393199.html
