SqlSugar入门到熟练使用 (1) : SqlSugar ORM介绍和ORM对象创建

前言

  混迹.Net圈子已经好几年了, 从最初出来使用的SqlHelper 到 微软的企业库, 再到 EF, 再到第三方ORM框架, 经历了一个不可描述的过程, SqlHelper和企业库就不多说了. EF很强大, 但是.....(此处省去一万字), 寻寻觅觅最后发现了几个国内的ORM, 都使用过, 到最后停留在了SqlSugar. SqlSugar相对其它的ORM, 虽然起步较晚一点点, 但是功能却是最强大的, 没有之一, 至少我的使用过程中, 是这样感觉的. 高性能, 强大的Lambda支持(Lambda的支持比Dos.ORM还要多, 这里没有贬低Dos.ORM的意思), 多库支持(目前支持Sql Server & Oracle

& MySql & Sqlite), 支持.Net Core等等.(目前貌似支持.Net Core的ORM屈指可数, SqlSugar就是其中一个), 其它的, 可以自己去发现咯, 一句两句说不清. 而且SqlSugar的更新和维护都是非常及时的, 详细信息点我去官网

  更多问题, 可加QQ群交流, QQ群号: 225982985

  废话不多说了, 进入正题

  大神务喷, 适合新手看看

DEMO环境介绍

  本系列博客才用的环境如下:

  IDE: VS2017

  JS环境: Vue 2.x

  数据库: SQL Server 2016

  .Net环境: .Net Core 2.0

  网站托管服务器: IIS

  操作系统: Windows 10 企业版

本系列博客不会对Core做过多的介绍, 只会一带而过, Core技术需要另寻文档和学习

我们先新建一个项目, 我已经新建好了, 大概目录结构如下图(后面的目录结构会越来越多, 代码在文章下方有提供下载, 循序渐近)

比较简单, Web和逻辑层, 数据层我已经去掉了, 我认为用了ORM数据层存在的意义不是那么必要了, 具体要不要, 你们自己选择

项目建好之后, 在SqlSugarDemo.Busines安装SqlSugar即可, 通过NuGet安装, 如图

如果你的项目是.Net的, 不是.Net Core, 安装第一个即可

1. 我们在逻辑层新建一个SugarBase类, 用来提供ORM的DB访问对象

代码如下(此处为个人封装, 技术有限, 仅供参考):

using System;
using System.Data;

namespace SqlSugarDemo.Busines.Base
{
    using SqlSugar;

    /// <summary>
    /// Sugar ORM父类, 封装一些基本的操作
    /// </summary>
    public static class SugarBase
    {
        /// <summary>
        /// 数据库链接字符串
        /// </summary>
        public static string DB_ConnectionString { get; set; }

        /// <summary>
        /// 获取ORM数据库连接对象(只操作数据库一次的使用, 否则会进行多次数据库连接和关闭)
        /// 默认超时时间为30秒
        /// 默认为SQL Server数据库
        /// 默认自动关闭数据库链接, 多次操作数据库请勿使用该属性, 可能会造成性能问题
        /// 要自定义请使用GetIntance()方法或者直接使用Exec方法, 传委托
        /// </summary>
        public static SqlSugarClient DB
        {
            get
            {
                return InitDB(30, DbType.SqlServer, true);
            }
        }

        /// <summary>
        /// 获得SqlSugarClient(使用该方法, 默认请手动释放资源, 如using(var db = SugarBase.GetIntance()){你的代码}, 如果把isAutoCloseConnection参数设置为true, 则无需手动释放, 会每次操作数据库释放一次, 可能会影响性能, 请自行判断使用)
        /// </summary>
        /// <param name="commandTimeOut">等待超时时间, 默认为30秒 (单位: 秒)</param>
        /// <param name="dbType">数据库类型, 默认为SQL Server</param>
        /// <param name="isAutoCloseConnection">是否自动关闭数据库连接, 默认不是, 如果设置为true, 则会在每次操作完数据库后, 即时关闭, 如果一个方法里面多次操作了数据库, 建议保持为false, 否则可能会引发性能问题</param>
        /// <returns></returns>
        public static SqlSugarClient GetIntance(int commandTimeOut = 30, DbType dbType = DbType.SqlServer, bool isAutoCloseConnection = false)
        {
            return SugarBase.InitDB(commandTimeOut, dbType, isAutoCloseConnection);
        }

        /// <summary>
        /// 初始化ORM连接对象
        /// </summary>
        /// <param name="commandTimeOut">等待超时时间, 默认为30秒 (单位: 秒)</param>
        /// <param name="dbType">数据库类型, 默认为SQL Server</param>
        /// <param name="isAutoCloseConnection">是否自动关闭数据库连接, 默认不是, 如果设置为true, 则会在每次操作完数据库后, 即时关闭, 如果一个方法里面多次操作了数据库, 建议保持为false, 否则可能会引发性能问题</param>
        private static SqlSugarClient InitDB(int commandTimeOut = 30, DbType dbType = DbType.SqlServer, bool isAutoCloseConnection = false)
        {
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = SugarBase.DB_ConnectionString,
                DbType = dbType,
                InitKeyType = InitKeyType.Attribute,
                IsAutoCloseConnection = isAutoCloseConnection
            });
            db.Ado.CommandTimeOut = commandTimeOut;
            return db;
        }

        /// <summary>
        /// 执行数据库操作
        /// </summary>
        /// <typeparam name="Result">返回值类型 泛型</typeparam>
        /// <param name="func">方法委托</param>
        /// <param name="commandTimeOut">超时时间, 单位为秒, 默认为30秒</param>
        /// <param name="dbType">数据库类型, 默认为SQL Server</param>
        /// <returns>泛型返回值</returns>
        public static Result Exec<Result>(Func<SqlSugarClient, Result> func, int commandTimeOut = 30, DbType dbType = DbType.SqlServer)
        {
            if (func == null) throw new Exception("委托为null, 事务处理无意义");
            using (var db = InitDB(commandTimeOut, dbType))
            {
                try
                {
                    return func(db);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    db.Dispose();
                }
            }
        }

        /// <summary>
        /// 带事务处理的执行数据库操作
        /// </summary>
        /// <typeparam name="Result">返回值类型 泛型</typeparam>
        /// <param name="func">方法委托</param>
        /// <param name="commandTimeOut">超时时间, 单位为秒, 默认为30秒</param>
        /// <param name="dbType">数据库类型, 默认为SQL Server</param>
        /// <returns>泛型返回值</returns>
        public static Result ExecTran<Result>(Func<SqlSugarClient, Result> func, int commandTimeOut = 30, DbType dbType = DbType.SqlServer)
        {
            if (func == null) throw new Exception("委托为null, 事务处理无意义");
            using (var db = InitDB(commandTimeOut, dbType))
            {
                try
                {
                    db.Ado.BeginTran(IsolationLevel.Unspecified);
                    var result = func(db);
                    db.Ado.CommitTran();
                    return result;
                }
                catch (Exception ex)
                {
                    db.Ado.RollbackTran();
                    throw ex;
                }
                finally
                {
                    db.Dispose();
                }
            }
        }
    }
}

SugarBase

DB_ConnectionString数据库连接字符串, 需要在MVC初始化的时候进行赋值, 也有别的方式,我偷懒了, 直接在MVC的Startup类赋值了,Startup代码如下

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using SqlSugarDemo.Busines.Base;

namespace SqlSugarDemo.Web
{
    public class Startup
    {
        readonly private IConfiguration _Configuration;
        public Startup(IConfiguration configuration)
        {
            this._Configuration = configuration;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            SugarBase.DB_ConnectionString = this._Configuration.GetConnectionString("Sugar");   //为数据库连接字符串赋值
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "default1",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

Startup

数据库配置信息写在web的appsettings.json文件下面, MVC会默认加载该json配置到内存中, 该JSON文件结构如下

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "Sugar": "server=127.0.0.1;database=SqlSugarDemo;uid=sa;pwd=123456;"
  }
}

到了这一步ORM的DB对象提供基本上已经完成. 大家已经看到了, 我的DB提供对象有N个方法, 下面依依通过代码进行演示使用方法

2. 直接使用DB属性操作数据库 (此文章不会使用Lambda语法, 全部使用SQL进行DB对象使用说明, 下一篇详细说增加的时候, 会使用实体层, 使用Lambda语法)

  在逻辑层添加一个HomeManager类, 导入命名空间, 由于我使用的是VS2017, 所以可以直接导入静态类

  using static SqlSugarDemo.Busines.Base.SugarBase;

  这样就可以直接使用DB了, 而不用SugarBase.DB

添加方法, 使用DB属性进行查询, 数据库结构下面的代码里面可以下载

编写 DBTest方法, 测试DB属性

public bool DBTest()
        {
            return DB.Ado.ExecuteCommand("insert into TB_User values(@Name,@Gender,@Phone,@CreateDate)", new List<SugarParameter>
            {
                new SugarParameter("@Name", "Dos.Orm"),
                new SugarParameter("@Gender", false),
                new SugarParameter("@Phone", "18888888888"),
                new SugarParameter("@CreateDate", DateTime.Now)
            }) > 0;
        }

DBTest

在控制里面调用, 我使用了Lazy类, 调用代码如下

        /// <summary>
        /// 主页
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Index()
        {
            var result = this._HomeManager.Value.DBTest();
            ViewBag.Result = result;
            return View();
        }

Index

我们运行程序, 界面显示True, 执行成功, 数据库成功多了一条数据

上面的例子简单介绍了使用 DB属性操作数据库的方法, 使用还是很简单的, 而且不必考虑是否需要释放, 因为SqlSugar会自动处理, 如果你不想在使用完之后, 立即释放, 我们的SugarBase有提供方法, 下面介绍不自动释放的方法使用

继续在逻辑层编写NotAutoDisposeTest方法, 代码如下

        /// <summary>
        /// 不自动释放
        /// </summary>
        /// <returns></returns>
        public bool NotAutoDisposeTest()
        {
            using(var db = GetIntance())
            {
                var id = db.Ado.GetInt("Select ID from TB_User where Name = @Name", new SugarParameter("@Name", "SqlSugar"));
                var result = db.Ado.ExecuteCommand("update TB_User set Name = @Name where ID = @ID", new SugarParameter("@Name", "SqlSugar_SqlSugar"), new SugarParameter("@ID", id));
                return result > 0;
            }
        }

NotAutoDisposeTest

我们运行程序, 一样得到True, 执行成功

该方法中, 我们使用SugarBase类里面的GetIntance方法提供数据库访问对象, GetIntance方法有三个参数, 可以设置超时时间, 数据库类型, 是否自动释放, 都有默认值, 我所以没有写

使用GetIntance方法必须用using, 否则不会在使用完之后进行数据库链接释放

GetIntance方法使用场景, 在一个方法中, 要多次操作数据库的时候使用, 而不是使用DB属性, DB属性会在每次操作完数据库后进行释放, 会造成一定的性能影响, 具体影响多少, 没测试

GetIntance方法有个确定, 就是每次使用必须写using, 对此做出了优化, SugarBase里面提供了Exec<T>方法, 省去每次写using的烦恼

我们在逻辑层编写ExecTest方法, 代码如下

        /// <summary>
        /// Exec方法
        /// </summary>
        /// <returns></returns>
        public bool ExecTest()
        {
            return Exec(db =>
            {
                var id = db.Ado.GetInt("Select ID from TB_User where Name = @Name", new SugarParameter("@Name", "SqlSugar_SqlSugar"));
                var result = db.Ado.ExecuteCommand("update TB_User set Name = @Name where ID = @ID", new SugarParameter("@Name", "SqlSugar_Sugar"), new SugarParameter("@ID", id));
                return result > 0;
            });
        }

ExecTest

可以看出, Exec方法需要传入一个委托, 委托提供了SqlSugarClient参数, 用来操作数据库, 运行程序, 返回true, 成功执行.

在多次操作数据库的时候, 省去了写using的麻烦, 偷懒试用, 本质和GetIntance没有太大的区别

SugarBase还对事务操作提供了简单封装, 使用方法和Exec一样, 里面会自动处理事务, 这里就不做DEMO编写了.

事务处理方法为ExecTran, 发生异常会自动回滚事务, 成功会自动提交失误

需要注意的是, 想手动回滚事务, 需自己编写回滚代码

如进行修改, 返回值受影响行数为0, 表示执行失败了, 这时候我们要回滚事务, 不继续执行, 则需要这么编写

                if (result<=0)
                {
                    db.Ado.RollbackTran();
                    return false;
                }

ExecTran方法使用和Exec一样, 再次说明

到这里, SqlSugar的入门就基本上介绍完毕, SugarBase类为博主自己简单封装, 适合大多数场景使用, 可以使用我提供的SugarBase类型进行数据库操作对象获取, 可以快速上手

基本上到这里, 对ORM对象的创建已经都了解了, 下一篇编写使用SqlSugar进行数据库添加

项目文件下载

提取密码: 3mk7

时间: 2024-11-09 18:16:06

SqlSugar入门到熟练使用 (1) : SqlSugar ORM介绍和ORM对象创建的相关文章

(译文)A/B测试从入门到熟练指南

(译文)A/B测试从入门到熟练指南 原文地址: http://www.smashingmagazine.com/2014/07/11/roadmap-to-becoming-an-a-b-testing-expert/ A/B测试,也叫做分离测试(也有叫做对比测试的),这是一种针对观察页面布局相似的两个不同版本着陆页的转化率, 来进行对比的点蚀测试方法(抽样测试法). A/B测试是通过观察和测试用户使用过程,找到最快捷引导用户到目标页面的着陆页版本.比如注册或者订阅网站信息的引导页面. 测试的内

SQL,从入门到熟练

本文是<如何七周成为数据分析师>的第十篇教程,如果想要了解写作初衷,可以先行阅读七周指南.温馨提示:如果您已经熟悉数据库,大可不必再看这篇文章,或只挑选部分. 在<写给新人的数据库指南>,我们已经成功的安装数据库,并且导入数据,今天进入SQL实战练习.SQL是数据库的查询语言,语法结构简单,相信本文会让你从入门到熟练. 掌握SQL后,不论你是产品经理.运营人员或者数据分析师,都会让你分析的能力边界无限拓展.别犹豫了,赶快上车吧! 以下的语句都在SequelPro的Query页面运行

vue需要知道哪些才能算作入门以及熟练

前两天接到一个面试官问我vue什么程度才算作可以用于开发,以前从没遇到过类似问题.只能大致说了一些,事后觉得也应该总结一下,前端vue这么火热那究竟什么才算做入门什么才算做熟练,只是我个人观点,不代表所有人,每个人理解可能有所不同,本次不说精通级,在我看来除了那些参与框架开发维护以及那些能对vue提出有价值意义的人之外都不能说自己精通,当然如果能自己手写一套和vue差不多甚至更胜vue的那不算精通vue了,那算精通js的大神.本次博文仅对职场中入门与熟练 入门级需要掌握 1.生命周期 befor

Django中ORM介绍

目录 一 ORM介绍 1.1 ORM 概念 1.2 ORM的由来 1.3 ORM的优势 1.4 ORM的劣势 1.5 ORM总结 二 Django中的ORM 2.1 Django使用MySQL数据库 2.2 Model 2.3 快速入门 一 ORM介绍 1.1 ORM 概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动

Django中ORM介绍和字段及字段参数

https://www.cnblogs.com/liwenzhou/p/8688919.html Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库

ORM的概念, ORM到底是什么

一.ORM简介         对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中.那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法.         这种方案存在以下不足:         1.持久化层缺乏弹性.一旦出现业务需求的变更,就必须修改持久化

ORM介绍

一:ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言. 二:orm的优点: 隐藏了数据访问细节,"封闭"的通用数据库交互,ORM的核心.他

Hadoop入门进阶步步高(二)-目录介绍

二.Hadoop目录结构 这里重点介绍几个目录bin.conf及lib目录. 1.$HADOOP_HOME/bin目录 文件名称 说明 hadoop 用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心 hadoop-config.sh Hadoop的配置文件 hadoop-daemon.sh 通过执行hadoop命令来启动/停止一个守护进程(daemon). 该命令会被bin目录下面所有以"start"或"stop&quo

01—EF开山篇,ORM介绍

我是2014年接触的EF,用了一年多,感觉非常的方便,现在的公司没有使用,最近有朋友接了两个项目找我帮忙,都想使用EF,自己也有断时间没有使用,借着这个机会复习下.Entity Framework,简称EF,是微软推出的基于Ado.Net的数据库访问技术,是一套ORM框架,那我们就从ORM开始吧. 一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据