• 手把手撸套框架-SqlSugar搭建与避坑


    目录

    一,基础搭建

    SqlSugar,实在是太简单了,基本看一眼官网就会了。

    官网:http://www.codeisbug.com/Doc/8 

    那我为什么还要专门来写篇博客呢? 主要是完整照着官网来,坑定掉坑里。我想把我遇到的几个问题记录一下,顺便普及一下Sqlguar。

    首先来说一下,安装

    官网基本说的很明白,SqlSugar 分为 .net framework 版本.net core版本,这个做项目的实话 别选错了。

    这里我强烈建议,没有转.net Core的 新项目尽快 转.net core 。两个性能不在一个量级,另外就算你今天不转,再过几个月照样要转。

    .net  Core 5.0 号称 “大一统”, 转core 早晚的事, 不如尽早接触,积累经验。

    通过nuget 添加程序集之后,直接配置一个 连接字符串就可以用了,非常简单:

    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);//根据分页查询
    
    //多表查询用法 http://www.codeisbug.com/Doc/8/1124
    
     
    
    /*插入*/
    
    var data = new Student() { Name = "jack" };
    
    db.Insertable(data).ExecuteCommand();
    
    //更多插入用法 http://www.codeisbug.com/Doc/8/1130
    
     
    
    /*更新*/
    
    var data2 = new Student() { Id =1, Name = "jack" };
    
    db.Updateable(data2).ExecuteCommand();
    
    //更多更新用法 http://www.codeisbug.com/Doc/8/1129
    
     
    
    /*删除*/
    
    db.Deleteable<StudentModel>(1).ExecuteCommand();

    以上代码都是从官网复制过来的,实际使用可以参考,里面的“三分钟高手”里面的写法:

    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<Student> StudentDb { get { return new SimpleClient<Student>(Db); } }//用来处理Student表的常用操作
    
        public SimpleClient<School> SchoolDb { get { return new SimpleClient<School>(Db); } }//用来处理School表的常用操作
    
        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);
    
        }
    
     
    
    }

     然后 去继承这个基类就行了,给泛型一个映射实体:

    目录结构:

    至此,基本的搭建就结束了,但是看到这里,坑也就来了。

    二,SqlSugar  避坑

    (1)我遇到的第一个坑就是只看了官网的说明,没有变通。官网上,不是这样写的吗?

    我以为,每个Da对象(数据表操作类) 都要在 DbContxt 中配置一下,搞的我新建一个Da文件 就要去配置一下,实在是麻烦,后来查文档知道了,

    SqlSugar 提供了一个  :

    1,SimpleClient    简易版的操作类,

    2,SqlSugarClient  完全版操作类

    我也不知道这样理解对不对, 总之 是没必要,每次添加一个Da 都去 配置一下。

     public class DbContext<T> where T : class, new()
        {
    
    
            //注意:不能写成静态的
            public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
            public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来操作当前表的数据
    
    
            public DbContext()
            {
    
    
                Db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = AppConfig.DB,
                    DbType = DbType.Oracle,
                    InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                    IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
    
                });
                //调式代码 用来打印SQL 
                Db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    Console.WriteLine();
                    Console.WriteLine(sql);
                    Console.WriteLine();
                    Console.WriteLine(Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                    Console.WriteLine();
                };
                
    
            }
         
    
        
        }

    所以,我改造了一下,就变得非常简洁了,连下面的封装都不要了,另外,下面的封装我在实际使用中,Update方法 修改实体的时候,有报错,我也没找到原因。

    这样简洁,看上去舒服多了。

    (2)我遇到的第二个坑就是,代码生成器。SqlSugar 只是一个ORM框架,他是不管代码生成器这一块的,包括Da(数据表操作类) 、Model (实体类)

     这里好在,有社区有些好心人事,给开发了代码生成器。当然也可以使用 一些三方的代码生成器,反正能生成实体就行。

    这里我就用了官网里面的 这个生成器,简直无力吐槽:

    就这个,具体怎么说呢? 反正很垃圾。。。。。

    这个还可以,但是我在官网没有找到链接,应该是作者没有上传官网,我是后来在 Sqlsugar 的交流群中,找到的。 这个还不错,不过也有一个大坑。 对Oracle 不友好。

    用过Oralce 的知道,Oracle 数据库字段 是全大写的,所以坑就是,我用代码生成器,生成出来的model 全是大写:

    不过,如果是Code-First 自然是不会有这个问题,只是我个人还是不怎么习惯 Code-first 这种开发方式。  全大写当然不影响使用,

    或者 不要用官网提供的 代码生成器 就行了。可是我就 迷迷糊糊的 用了两个星期,在全大写 的Model里面遨游。 后来实在忍受不了,

    下狠心自己写一个代码生成器。

    不说多好用,反正自己写的东西,贵在一个灵活,能改。代码我也是尽可能的简单。这才缓解了我的抑郁。。。

    暂时就说到这里,下一篇,讲 代码生成器 ,没有链接 点   目录 跳转吧!

  • 相关阅读:
    MapReduce Design Patterns(2. 最大值、最小值、总数、个数、均值)(二)
    MapReduce Design Patterns(2. 最大值、最小值、总数、个数、均值)(二)
    MapReduce Design Patterns(chapter 1)(一)简介
    MapReduce Design Patterns(chapter 1)(一)简介
    Hadoop中两表JOIN的处理方法
    MapReduce数据处理两表join连接 (Ruduce端连接)
    笔记:Java 性能优化权威指南 第4章 JVM性能监控
    笔记:Java 性能优化权威指南 第3章 JVM概览
    笔记:Java 性能优化权威指南 第2章 操作系统性能监控
    启用 jstatd 供远程VisualVM 连接
  • 原文地址:https://www.cnblogs.com/demon28/p/13331394.html
Copyright © 2020-2023  润新知