• sqlsugar


    下载地址:https://github.com/sunkaixuan/SqlSugar

    SqlSugar是.NET版本,SqlSugarCore是.NET CORE版本,根据你的项目选择你的引用dll

    优点:

      很多人都会问您这款ORM有哪些特点,有什么竞争力,我归纳出以上几点供你参考

    • 高性能 ,不夸张的说,去掉Sql在数据库执行的时间,SqlSugar是EF数倍性能,另外在批量操作和一对多查询上也有不错的SQL优化
    • 高扩展性 ,支持自定义拉姆达函数解析、扩展数据类型、支持自定义实体特性,外部缓存等
    • 稳定性和技术支持,  虽然不是官方ORM, 但在稳定性上也是有着数年用户积累,如果遇到问题可以在GITHUB提出来,会根据紧急度定期解决
    • 功能全面,虽然SqlSugar小巧可功能并不逊色于EF框架
    • 创新、持续更新 ,向下兼容
    SqlSugarClient db = new SqlSugarClient(
        new ConnectionConfig()
        {
            ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
            DbType = DbType.SqlServer,//设置数据库类型
            IsAutoCloseConnection = true,//自动释放数据务,如果存在事务,在事务结束后释放
            InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息
        });
    
    //用来打印Sql方便你调式    
    db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql + "
    " + 
                    db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                    Console.WriteLine();
                };  
    
    /*查询*/
    
    var list = db.Queryable<StudentModel>().ToList();//查询所有
    
    var getById = db.Queryable<StudentModel>().InSingle(1);//根据主键查询
    
    var getByWhere = db.Queryable<StudentModel>().Where(it=>it.Id==1).ToList();//根据条件查询
    
    var total = 0;
    
    var getPage = db.Queryable<StudentModel>().Where(it => it.Id == 1).ToPageList(1,2,ref total);//根据分页查询
    
    /*插入*/
    var data = new Student() { Name = "jack" };
    db.Insertable(data).ExecuteCommand();
     
    /*更新*/
    var data2 = new Student() { Id =1, Name = "jack" };
    db.Updateable(data2).ExecuteCommand();
     
    /*删除*/
    db.Deleteable<StudentModel>(1).ExecuteCommand();

     实体类

    //如果实体类名称和表名不一致可以加上SugarTable特性指定表名
    [SugarTable("Student")]
    public class StudentModel
    {
        //指定主键和自增列,当然数据库中也要设置主键和自增列才会有效
        [SugarColumn(IsPrimaryKey=true,IsIdentity =true)]
        public int Id { get; set; }
        public string Name { get; set; }
    }
    //当然也支持自定义特性, 这里就不细讲了

    根据实体创建表

    db.CodeFirst.SetStringDefaultLength(200/*设置varchar默认长度为200*/).InitTables(typeof(StudentModel));//执行完数据库就有这个表了

    使用SimpleClient优化你的代码

    我们之前学会了用 SqlSugarClient对象来操作数据库了,但是对于一些喜欢泛型的人来说,还不够精简,我们就来学习一下SimpleClient

    使用DbContext完成增删查改,注意使用 DemoMangar需要new出来使用,保证他的上级或者上上级不能单例或者静态

    public class DbContext
    {
        public DbContext()
        {
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
                DbType = DbType.SqlServer,
                InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
     
            });
            //调式代码 用来打印SQL 
            Db.Aop.OnLogExecuting = (sql, pars) =>
            {
                Console.WriteLine(sql + "
    " +
                    Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                Console.WriteLine();
            };
     
        }
        //注意:不能写成静态的,不能写成静态的
        public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
        public SimpleClient<Student> StudentDb { get { return new SimpleClient<Student>(Db); } }//用来处理Student表的常用操作
        public SimpleClient<School> SchoolDb { get { return new SimpleClient<School>(Db); } }//用来处理School表的常用操作
    }
    public class DemoManager : DbContext//继承DbContext
    {
     
     
        //SimpleClient实现查询例子
        public void SearchDemo()
        {
     
            var data1 = StudentDb.GetById(1);//根据ID查询
            var data2 = StudentDb.GetList();//查询所有
            var data3 = StudentDb.GetList(it => it.Id == 1);  //根据条件查询  
            var data4 = StudentDb.GetSingle(it => it.Id == 1);//根据条件查询一条
     
            var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分页查询
            var data5 = StudentDb.GetPageList(it => it.Name == "xx", p);
            Console.Write(p.PageCount);//返回总数
     
     
            // 分页查询加排序
            var data6 = StudentDb.GetPageList(it => it.Name == "xx", p, it => it.Name, OrderByType.Asc);
            Console.Write(p.PageCount);//返回总数
     
     
            //组装条件查询作为条件实现 分页查询加排序
            List<IConditionalModel> conModels = new List<IConditionalModel>();
            conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" });//id=1
            var data7 = StudentDb.GetPageList(conModels, p, it => it.Name, OrderByType.Asc);
             
            //4.9.7.5支持了转换成queryable,我们可以用queryable实现复杂功能
             StudentDb.AsQueryable().Where(x => x.Id == 1).ToList();
        }
     
     
        //插入例子
        public void InsertDemo()
        {
     
            var student = new Student() { Name = "jack" };
            var studentArray = new Student[] { student };
     
            StudentDb.Insert(student);//插入
     
            StudentDb.InsertRange(studentArray);//批量插入
     
            var id = StudentDb.InsertReturnIdentity(student);//插入返回自增列
             
            //4.9.7.5我们可以转成 Insertable实现复杂插入
            StudentDb.AsInsertable(insertObj).ExecuteCommand();
        }
     
     
        //更新例子
        public void UpdateDemo()
        {
            var student = new Student() { Id = 1, Name = "jack" };
            var studentArray = new Student[] { student };
     
            StudentDb.Update(student);//根据实体更新
     
            StudentDb.UpdateRange(studentArray);//批量更新
     
            StudentDb.Update(it => new Student() { Name = "a", CreateTime = DateTime.Now }, it => it.Id == 1);// 只更新Name列和CreateTime列,其它列不更新,条件id=1
         
            //支持StudentDb.AsUpdateable(student)
        }
     
        //删除例子
        public void DeleteDemo()
        {
            var student = new Student() { Id = 1, Name = "jack" };
     
            StudentDb.Delete(student);//根据实体删除
            StudentDb.DeleteById(1);//根据主键删除
            StudentDb.DeleteById(new int[] { 1,2});//根据主键数组删除
            StudentDb.Delete(it=>it.Id==1);//根据条件删除
             
            //支持StudentDb.AsDeleteable()
        }
     
        //使用事务的例子
        public void TranDemo()
        {
     
            var result = Db.Ado.UseTran(() =>
            {
                //这里写你的逻辑
            });
            if (result.IsSuccess)
            {
                //成功
            }
            else
            {
                Console.WriteLine(result.ErrorMessage);
            }
        }
     
    }
    //多表查询
    public void JoinDemo() {
     
            var list= Db.Queryable<Student, School>((st, sc) => new object[] {
                JoinType.Left,
                st.SchoolId==sc.Id
            }).Select<ViewModelStudent>().ToList();
    }

     让我们不用每次写增删改查

    public class DbContext<T> where T: class,new()
    {
        public DbContext()
        {
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
                DbType = DbType.SqlServer,
                InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
     
            });
            //调式代码 用来打印SQL 
            Db.Aop.OnLogExecuting = (sql, pars) =>
            {
                Console.WriteLine(sql + "
    " +
                    Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                Console.WriteLine();
            };
     
        }
        //注意:不能写成静态的
        public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
    
        public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来处理T表的常用操作
     
        /// <summary>
        /// 获取所有
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetList()
        {
            return CurrentDb.GetList();
        }
     
        /// <summary>
        /// 根据主键删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Delete(dynamic id)
        {
            return CurrentDb.Delete(id);
        }
    
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Update(T obj)
        {
            return CurrentDb.Update(obj);
        }
    }
    人生,总是有一些空城旧事,年华未央;总是有些季节,一季花凉,满地忧伤。许多事,看开了,便会峰回路转;许多梦,看淡了,便会云开日出。学会思索,学会珍藏,微笑领悟,默默坚强。
  • 相关阅读:
    开发一个App的成本是多少?
    自定义Drawable
    数据库服务软件类型和配置redis
    分库分表
    创建视图
    部署MYSQL高可用集群
    读写分离《二》
    读写分离和多实例
    部署mysql主从同步
    备份和恢复
  • 原文地址:https://www.cnblogs.com/yuzhou133/p/12185577.html
Copyright © 2020-2023  润新知