zoukankan      html  css  js  c++  java
  • 借助表达式树感受不一样的CRUD

    借助表达式树感受不一样的CRUD

    Intro

    最近有个想法,想不写 sql 语句,做一个类似于 ORM 的东西,自己解析表达式树,生成要执行的 sql 语句,最后再执行 sql 语句,返回相应结果。

    思路解析

    常用的 sql 语句基本都有一定的模式,就是 INSERT/DELETE/Update/SELECT,我把公用的部分给抽离出来,把查询/更新/删除条件和指定字段通过表达式树来指出,解析传入的表达式树对象来获取条件以及要更新的字段。

    源码

    源码链接

    Sample

    请看使用示例

    安装 nuget 包 WihanLi.Common

    public static class RepositoryTest
        {
            public static void MainTest()
            {
                var connectionPool = new DbConnectionPool(new DbConnectionPoolPolicy(ConfigurationHelper.ConnectionString("TestDb")));
    
                var repo = new Repository<TestEntity>(() => connectionPool.Get());
                repo.Insert(new TestEntity
                {
                    Token = "1233",
                    CreatedTime = DateTime.UtcNow
                });
    
                var entity = repo.Fetch(t => t.PKID == 1);
                System.Console.WriteLine(entity.Token);
    
                repo.Update(t => t.PKID == 1, t => t.Token, 1);
    
                entity = repo.Fetch(t => t.PKID == 1);
                System.Console.WriteLine(entity.Token);
    
                repo.Delete(t => t.PKID == 1);
                entity = repo.Fetch(t => t.PKID == 1);
                System.Console.WriteLine($"delete operation {(entity == null ? "Success" : "Failed")}");
    
                repo.Execute("TRUNCATE TABLE dbo.tabTestEntity");
    
                Console.WriteLine("finished.");
            }
    
            public class DbConnectionPool : DefaultObjectPool<DbConnection>
            {
                public DbConnectionPool(IPooledObjectPolicy<DbConnection> policy) : base(policy)
                {
                }
    
                public DbConnectionPool(IPooledObjectPolicy<DbConnection> policy, int maximumRetained) : base(policy, maximumRetained)
                {
                }
            }
    
            public class DbConnectionPoolPolicy : IPooledObjectPolicy<DbConnection>
            {
                private readonly string _connString;
    
                public DbConnectionPoolPolicy(string connString)
                {
                    _connString = connString;
                }
    
                public DbConnection Create()
                {
                    return new SqlConnection(_connString);
                }
    
                public bool Return(DbConnection obj)
                {
                    return obj.ConnectionString.IsNotNullOrWhiteSpace();
                }
            }
            [Table("tabTestEntity")]
            internal class TestEntity
            {
                [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
                public int PKID { get; set; }
    
                public string Token { get; set; }
    
                public DateTime CreatedTime { get; set; }
            }
        }
    

    示例使用了 ObjectPool 实现了一个数据库连接池,Repository 实例化需要一个获取 DbConnection 对象的委托,而数据库连接就是从这数据库连接池中获取。

    不足/TODO

    • 支持指数化查询,现在是将条件直接拼接成了字符串,做了防注入处理,要改成使用参数化查询
    • 支持更多的方法解析成对应的 Sql 语句
  • 相关阅读:
    Reflector7.5.2.1(最新免费破解版)
    linux shell中变量的特殊处理
    linux中什么是shell?
    关于sql server中主键的一点研究
    根据数据库连接,登录操作系统的一个方法
    无图片取得圆角效果
    结对编程作业(java实现)
    第三章、android入门
    第七章:android应用
    javascript编辑excel并下载
  • 原文地址:https://www.cnblogs.com/weihanli/p/10229610.html
Copyright © 2011-2022 走看看