Skip to content

zh-qi/onlyorm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 

Repository files navigation

ONLYORM

写这个的初衷主要是在腾讯课堂上听了eleven老师的orm的简单封装,为了自己学习,所以就根据eleven老师的思路手写了一个简单的ORM框架。

为什么叫OnlyORM:

因为仅仅是一个ORM,不像EF等框架那么复杂,没有数据跟踪等特性,仅仅是为了帮助访问数据库不写SQL,实现统一访问方式的框架。

实现原理:

  • 使用泛型和特性获取对应的数据库表名和字段名称
  • 使用表达式目录树解析复杂的Find,Update,Deleate
  • 使用策略模式实现表达式目录树的方法解析,增加可拓展性
  • 使用参数化防止SQL注入
  • ...

注意的点:

  • 暂时不支持连表查询 (待实现)
  • 暂时不支持非操作(待实现)
  • 暂时不支持在一个查询里出现多个同样的字段
  • 数据库链接池请在链接字符串中使用Mysql自己的连接池,代码中的链接池还未优化
  • ...

使用步骤

  1. 在配置文件中添加如下配置
"OnlyOrm":{
        "ConnectString":"server=127.0.0.1;userid=root;password=1234567;database=study;",
    	/* 数据库类型,mysql或者sqlserver,大小写不敏感,暂时只支持Mysql*/
        "SqlType":"Mysql"
    }
  1. 要调用的实体类,示例:

    • 必须继承自OnlyOrmBaseModel类,

    • TableMappingAttribute: 绑定数据库中对应的表名

    • PrppertyMappingAttribute:绑定数据库中对应的字段名

    • PrimaryKeyAttribute: 主键需要绑定该特性,true/false代表是否自增

[TableMapping("user")]
public class User : OrmBaseModel
{
    [PrimaryKey(true)]
    [PropertyMapping("Id")]
    public int Id { get; set; }

    [PropertyMapping("Name")]
    public string Name { get; set; }

    [PropertyMapping("Email")]
    public string Email { get; set; }

    [PropertyMapping("Mobile")]
    public string Mobile { get; set; }
}
  1. 调用方式:
static void Main(string[] args)
{
	{
        // 查找主键为1的用户
        var user1 = Orm.Find<SuperUser>("1");
    }
    {
        // 组合条件查询,
        // 暂时不支持联表查询
        var user = Orm.FindWhere<SuperUser>(u => (u.NickName.Contains("zhang") || 2 == u.Id));
        Console.WriteLine(user.Count);
    }
    {
         // 暂时不支持同个条件的或,比如:(2 == u.Id || u.Id == 3)
         // 如果需要该方式查询,使用InList拓展方法,如下所示:
         var ids = new List<int>()
         {
             1,2,3,4,5
         };
         var user = Orm.FindWhere<SuperUser>(u => u.Id.InList<int>(ids));
    }
    {
        // 按照表达式目录树的方式进行查询,更新,删除,
        var update = Orm.UpdateWhere<SuperUser>(u => u.NickName.ConCat("222", u.Email),
                                                u => u.Id == 1);
    }
    {
        // 插入一个User实例,如果Id是主键,会被过滤掉
        var user1 = new SuperUser
        {
            Id = 3,
            NickName = "test",
            Mobile = "456",
            Email = "344@qq.com"
        };

        Orm.Insert<SuperUser>(user1);
    }
    {
        // 更新主键是3dUser
        var user1 = new SuperUser
        {
            Id = 3,
            NickName = "test1",
            Mobile = "456",
            Email = "344@qq.com"
        };
        Orm.Update<SuperUser>(user1);
    }
    {
        // 删除主键是3的User
        // Orm.Deleate<User>("3");
    }
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages