• .NET6 开源之JSON 2 SQL (JORM框架)


    什么是JORM框架?

    全称 :Json  Object Relational Mapping   ,它是通过JSON 对象 去实现数据库的一个关系映射 ,我理想中完整的JORM包含功能有

    ·1、表权授权

    2、字段级别授权

    3、查询返回备注

    4、可以配置化

    5、支持丰富的SQL语法 

    6、数据验证

    7、JSON作为数据库中间语言支持多种数据库

     

    为什么要开发JORM

    我们都知道 ORM用起来非常舒服,都强类型,但是他的缺点很显

    1、对动态操作支持比较弱 , 很多功能都要自个封装,很难支持到函数级别

    2、不能支持列级别的过滤,比如A用户显示2列,B用户显示3列,像这种很难处理

    3、无法动态构造,这就导致了无法很好的用在 工作流、低代码平台或者人工智能产品中,很多都是需要自个拼SQL,查询用Datable等

     

    SqlSugar 开始支持JORM

    SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新

    为提高本公司内部产品的开发效率,准备打造一款低代码平台,所以从2022年1月份已经开始设计和架构 支持JORM操作数据库

     

    创建JORM对象

    1
    2
    3
    4
    5
    6
    7
    JsonClient jsonToSqlClient = new JsonClient();
    jsonToSqlClient.Context = new SqlSugarClient(new ConnectionConfig()
               {
                   DbType = DbType.MySql,
                   IsAutoCloseConnection = true,
                   ConnectionString = "server=localhost;Database=SqlSugar4xTest;Uid=root;Pwd=haosql"
               });<br>

      

     

    1、查询功能

    1.1  带有函数的查询

    Json格式:

    1
    2
    3
    4
    {
     "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  带有条件的查询

    1
    2
    3
    4
    5
    {
      "Table":"order",
          Where:[  "name","=", "{string}:xxx"  ],
          Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate:[]},"Date"] ]
    }

    代码:

    1
    2
    3
    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"] 

    运算符号: = 、>、<、>=、<=、&&、||、(、)

    字段名:字母数字下划线 

    参数值: {int}:1 表式类型为int值为1的参数

    函数:{SqlFunc_AggregateMin:["id"]}  表式 min(id)

    2.3 分页查询

    Json格式:

    1
    2
    3
    4
    5
    {
      "Table":"order",
          PageNumber:"1",
          PageSize:"100"
    }

    代码: 

    1
    2
    3
    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联表查询

    Json格式:

    1
    2
    3
    4
    5
    {
        "Table":[ "order","o"],
        "LeftJoin01": ["orderdetail", "d", [  "d.orderid",">","o.id"  ]],
        "Select":["o.id" ,["d.itemid","newitemid"]]
    }

    代码:

    1
    2
    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授权查询  

    该功能目前还不完善,暂时不细解

    1
    2
    3
    4
    5
    6
    7
    8
    var tableNames = jsonToSqlClient.GetTableNameList(json);//通过JSON获取JSON所有表
     var configs = GetConfigByUser(tableNames);//通过表获取行列过滤备注等信息
     
             var sqlList = jsonToSqlClient
                .Queryable(json)
                .UseAuthentication(configs)//查询启用行列过滤
                .ShowDesciption()//查询返回备注
                .ToResult();

    2、插入  

    单条插入

    1
    2
    3
    4
    5
    {
        "Table":"order",
          Columns:{name:"{string}:1",price:"{decimal}:1"}
    }

    批量持入

    1
    2
    3
    4
    5
    {
        "Table":"order",
            Columns:[ {name:"{string}:2",price:"{decimal}:2"} , {name:"{string}:1",price:"{decimal}:1"}  ]
    }

    带自增列

    1
    2
    3
    4
    5
    {
      "Table":"order",
          Identity:"id",
          Columns:  {name:"{string}:2",price:"{decimal}:2"
    }

      

    3、更新  

    单个对象更新

    1
    2
    3
    4
    5
    {
        "Table":"order",
          Columns: { id:"{int}:1" ,name:"{string}:1" },
          WhereColumns:["id"]
    }

      

    多个对象更新

    1
    2
    3
    4
    5
    {
        "Table":"order",
          Columns:[ {id:2,name:"{string}:2",price:"{decimal}:2"}  , {id:1,name:"{string}:1",price:"{decimal}:1"}  ],
          WhereColumns:["id"]               
    }

      

    Sql语句方式更新

    1
    2
    3
    4
    5
    6
    {
        "Table":"order",
          Columns: {name:"{string}:2",price:"{decimal}:2"}  ,
          Where:["id","=","{int}:11"]               
    }

    4、删除 

    Where中的用法和查询一样的

    Json格式

    1
    2
    3
    4
    5
    {
        "Table":"order",
          Where:[ "id"," = ","{int}:1" ]
    }

    代码:

    1
    2
    jsonToSqlClient.Deleteable(json).ToSqlList()
    //DELETE FROM `order` WHERE `id` = @p0

      

    源码下载地址:

    SqlSugar未来将重点开发JORM  ,喜欢低代码平台或者工作流的朋友,可以关注一下, 目前还是开发阶段 ,预计在未来3个月内投入生产

     https://github.com/donet5/SqlSugar       群号:995692596

     

     

    .很多人问有了EF CORE为什么还有其它ORM ,这个问题就等于淘宝只有天猫一样,只有丰富的产品才会形成良性竞争,让用户有更多选择

      

      

  • 相关阅读:
    VR云游带你玩转智慧文旅,解决景区营销痛点
    无法通过spring initialzr建立spring工程
    轻量级神经网络算法系列文章-ShuffleNet v2
    git总结
    `Algorithm-Solution` `AcWing` 342. 道路与航线
    navicat的安装和配置教程
    [附源码]java毕业设计病历管理系统
    java毕业设计滴答拍摄影项目(附源码、数据库)
    linux C/C++ socket编程
    R语言和医学统计学(7):多元线性回归
  • 原文地址:https://www.cnblogs.com/sunkaixuan/p/16393199.html