zoukankan      html  css  js  c++  java
  • 一个轻量级的基于 .NET Core 的 ORM 框架 HSQL

    HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架

    HSQL 是一种可以使用非常简单高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事。目前支持的数据库有 MySql、SQLServer。 

    安装方法

    Install-Package HSQL-standard

    使用方法

    性能

    无索引、单机、单表、表数据为十万行

    创建映射模型
    [Table("t_student")]
    public class Student
    {
        [Column("id")]
        public string Id { get; set; }
    
        [Column("name")]
        public string Name { get; set; }
    
        [Column("age")]
        public int Age { get; set; }
    
        [Column("school_id")]
        public string SchoolId { get; set; }
    
        [Column("birthday")]
        public long Birthday { get; set; }
    }

    Table 标记一个表对象。如:[Table("t_student")] 代表 Student 类将映射为数据库表 t_student
    Column 标记一个列对象。如:[Column("id")] 代表 Id 属性将映射为数据库列 id

    创建数据库操作实例
    var connectionString = $"Server=127.0.0.1;Database=test;Uid=root;Pwd=123456;";
    var database = new Database(Dialect.MySQL, connectionString);

    connectionString 为数据库连接字符串。
    Dialect.MySQL 表示访问数据库的类型为 MYSQL

    新增
    var result = database.Insert<Student>(new Student()
    {
        Name = "zhangsan",
        Age = 18,
        SchoolId = "123"
    });

    Insert 方法可插入一个对象,表示对 t_student 表插入一条数据。
    最后被解释为 SQL 语句 ->
    INSERT INTO t_student(id,name,age,school_id,birthday) VALUES(@id,@name,@age,@school_id,@birthday);

    批量新增
    var list = new List<Student>();
    for (var i = 0; i < 1000; i++)
    {
        list.Add(new Student()
        {
            Id = $"{i}",
            Name = "zhangsan",
            Age = 18,
            SchoolId = "123"
        });
    }
    var result = database.Insert<Student>(list);

    Insert 方法可插入一个集合对象,表示对 t_student 表进行批量插入。
    最后被解释为事务性批量插入的 SQL 语句,如
    INSERT INTO t_student(id,name,age,school_id,birthday) VALUES(@id,@name,@age,@school_id,@birthday);
    会进行多条语句事务操作。

    修改
    var result = database.Update<Student>(x => x.Id.Contains("test_update_list"), new Student() { Age = 19 });

    Update 方法表示更新操作。如:
    参数1:x => x.Id.Contains("test_update_list") 被解释为 WHERE id LIKE '%test_update_list%'
    参数2:new Student() { Age = 19 } 被解释为 SET age = @age
    最终SQL语句为:
    UPDATE t_student SET age = @age WHERE id LIKE '%test_update_list%';

    删除
    var result = database.Delete<Student>(x => x.Age > 0);

    Delete 方法表示删除操作。最终被解释为 SQL 语句:
    DELETE FROM t_student WHERE age > 0;

    查询
    var list = database.Query<Student>(x => x.Age == 19 && x.Id.Contains("test_query_list")).ToList();

    Query => ToList 方法表示查询操作。最终被解释为 SQL 语句:
    SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id LIKE '%test_query_list%';

    单实例查询
    var student = database.Query<Student>(x => x.Age == 19 && x.Id.Equals("test_query_single")).FirstOrDefault();

    Query => ToList 方法表示查询操作:
    当 Dialect 为 MySQL 时 最终被解释为 SQL 语句:
    SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id = 'test_query_single' LIMIT 0,1;
    当 Dialect 为 SQLServer 时 最终被解释为 SQL 语句:
    SELECT TOP 1 id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id = 'test_query_single';

    分页查询
    var list = database.Query<Student>(x => x.Age == 19 && x.Id.Contains("test_query_page_list")).ToList(2, 10);

    Query => ToList(2,10) 方法表示分页查询操作,pageIndex 为第几页,pageSize 为每页记录条数。
    最终被解释为 SQL 语句:
    SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id LIKE '%test_query_page_list%' LIMIT 10,10;

    灵活条件查询
    var list = database.Query<Student>(x => x.Age == 19 && x.Id.Contains("test_query_page_list")).AddCondition(x => x.Name == "zhangsan").ToList(2, 10);

    AddCondition 方法可以对查询进行动态增加条件。
    最终解释的 SQL 的 WHERE 部分会包含 AND name = 'zhangsan'

    单实例插入十万次
    var database = new Database(Dialect.MySQL, connnectionString);
    database.Delete<Student>(x => x.Age >= 0);
    var list = new List<Student>();
    for (var i = 0; i < 100000; i++)
    {
        list.Add(new Student()
        {
            Id = $"{i}",
            Name = "zhangsan",
            Age = 18,
            SchoolId = "123"
        });
    }
    
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    list.ForEach(x =>
    {
        var result = database.Insert<Student>(x);
    });
    stopwatch.Stop();
    var elapsedMilliseconds = $"插入十万条次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";

    第一次测试 -> 插入十万条次共耗时: 111038 毫秒,平均单次插入耗时: 1.11038 毫秒
    第二次测试 -> 插入十万条次共耗时: 109037 毫秒,平均单次插入耗时: 1.09037 毫秒

    批量插入十万次
    var database = new Database(Dialect.MySQL, connnectionString);
    database.Delete<Student>(x => x.Age >= 0);
    var list = new List<Student>();
    for (var i = 0; i < 100000; i++)
    {
        list.Add(new Student()
        {
            Id = $"{i}",
            Name = "zhangsan",
            Age = 18,
            SchoolId = "123"
        });
    }
    
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    var result = database.Insert<Student>(list);
    stopwatch.Stop();
    var elapsedMilliseconds = $"插入十万次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";

    第一次测试 -> 插入十万次共耗时: 11177 毫秒,平均单次查询耗时: 0.11177 毫秒
    第二次测试 -> 插入十万条次共耗时: 10776 毫秒,平均单次查询耗时: 0.10776 毫秒

    查询单实例十万次
    var database = new Database(Dialect.MySQL, connnectionString);
    database.Delete<Student>(x => x.Age >= 0);
    var list = new List<Student>();
    for (var i = 0; i < 100000; i++)
    {
        list.Add(new Student()
        {
            Id = $"{i}",
            Name = "zhangsan",
            Age = 18,
            SchoolId = "123"
        });
    }
    
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    for (var i = 0; i < 100000; i++)
    {
        var student = database.Query<Student>(x => x.Age == 18 && x.Id.Equals($"{i}") && x.SchoolId.Equals("123")).FirstOrDefault();
    }
    stopwatch.Stop();
    var elapsedMilliseconds = $"查询十万次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";

    十万条数据时:
    第一次测试 -> 查询十万条次共耗时: 877936‬ 毫秒,平均单次查询耗时: 8.77936 毫秒
    第二次测试 -> 查询十万条次共耗时: 874122‬ 毫秒,平均单次查询耗时: 8.74122 毫秒

     项目地址:https://github.com/hexu6788

    如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

    如果你对 .NET 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

    本文地址:http://www.cnblogs.com/hexu6788/p/12435814.html

    作者博客:何旭

    欢迎转载,请在明显位置给出出处及链接

  • 相关阅读:
    window.open()参数列表
    感受教育,焦点访谈
    《迷墙》
    锻炼身体
    Great Fire Wall
    今天
    查询重复记录的SQL语句
    Oracle,SQL Server,Access万能数据库通用类!
    经典SQL语句大全
    C#编码规范
  • 原文地址:https://www.cnblogs.com/hexu6788/p/12435814.html
Copyright © 2011-2022 走看看