介绍

不知道大家在用Dapper的时候SQL语句是写到哪的,目前看网上的例子都是写到类里面的.

此项目的目的是把SQL语句放到文件(xml)中

目前只是初步版本,只是说明了意图,后面会持续完善和优化

GitHub 地址

功能说明

  • SQL 语句单独存放在文件(xml)中
  • 支持配置多文件夹(暂不支持指定具体文件)
  • 实时监听文件变化
  • 支持多数据库(Dapper 本身就支持多数据,为什么这里说支持多数据呢?后面会讲到)
  • 支持读写分离(功能虽然有,但配置看起来不爽,后续应该会优化. 负载平衡算法还未实现)

一起看看如何使用

  1. 首先我们需要一个xml文件,如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <sql xmlns="http://schema.zoey.com/sql" domain="Default">
    <sql-query name="Student.GetStudentByID">
    <text>
    <![CDATA[
    SELECT * FROM Student WHERE ID = @ID
    ]]>
    </text>
    </sql-query> <sql-command name="Student.UpdateStudentByID">
    <text>
    <![CDATA[
    UPDATE Student SET Age = @Age,Name = @Name WHERE ID = @ID
    ]]>
    </text>
    </sql-command>
    </sql>

    这里我们看下面几点:

    • sql节点上的domain属性.这里是指定数据库的连接字符串,后面会详细说明
    • 读写分离就是sql-querysql-command节点来判断的
    • name属性目前是所有文件都不能重复
  2. Startup中的ConfigureServices添加如下代码:

    //SQL文件的读取和监视依赖 IFileProvider
    var physicalProvider = _env.ContentRootFileProvider;
    services.AddSingleton<IFileProvider>(physicalProvider); services.AddZoeyDapperCore(options =>
    {
    //SQL文件夹的路径 支持多个文件夹
    options.Path = new List<string>() { "/Config" };
    //监控文件的后缀(默认未 *.*)
    options.WatchFileFilter = "*.xml";
    //该属性暂时没用
    options.StartProxy = false;
    })
    //添加MSSQLserver
    //这里说明一下 该方法是非必要的,下面会说
    .AddMSSQLserver(option =>
    {
    //添加数据库连接字符串
    //这里为什么没用配置文件读取,考虑到可能用到(Secret Manager)
    //后面可以提供直接从配置文件中读取
    option.DatabaseElements = new List<DatabaseElement>()
    {
    //参数1:唯一名称
    //参数2:连接字符串
    new DatabaseElement("TESTDB","Data Source=.;Initial Catalog=Test;Integrated Security=True")
    };
    //此处就是上面提到的 domain 节点
    //每个domain对象有个唯一名称(xml文件domain的节点)
    //每个domain对象都有 Master(主库) 和 Slave(从库) 的名称(上面配置信息的名称)
    option.DomainElements = new List<DomainElement>()
    {
    new DomainElement()
    {
    //xml文件domain节点的名称
    Name = "Default",
    //主库和从库的名称(上面配置信息的名称)
    //主库和从库可配多个(负载均衡算法暂没实现)
    MasterSlaves = new MasterSlaves("TESTDB","TESTDB")
    }
    };
    });

    说明:

    • 大家也看到了,此处的配置很是繁琐,上面我也说了,这里应该要优化(但不紧急)
  3. 用的时候有两种方式.

    1. 当我们没调用AddMSSQLserver时,在Controller中:

          public class HomeController : Controller
      {
      //注入ISqlContext
      private readonly ISqlContext _sqlContext;
      public HomeController(ISqlContext sqlContext)
      {
      this._sqlContext = sqlContext;
      } public IActionResult Index()
      {
      List<Student> student;
      //获取 Student.GetStudentByID SQL信息
      var sql = _sqlContext.GetSqlElement("Student.GetStudentByID");
      using (var db = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
      {
      student = db.Query<Student>(sql.CommandText, new
      {
      ID = 1
      });
      }
      return View(student);
      } public IActionResult About()
      {
      //获取 Student.GetStudentByID SQL信息
      var sql = _sqlContext.GetSqlElement("Student.UpdateStudentByID");
      using (var db = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
      {
      db.Execute(sql.CommandText, new
      {
      Age = new Random().Next(100),
      Name = "Hello Zoey!",
      ID = 1
      });
      }
      return View();
      }
      }

      说明:此种方法只是单纯的获取SQL信息,没什么特别的.

    2. 下面我们看第二种:

          public class HomeController : Controller
      {
      //注入 ISqlCommand
      private readonly ISqlCommand _sqlCommand;
      public HomeController(ISqlCommand sqlCommand)
      {
      _sqlCommand = sqlCommand;
      } public IActionResult Index()
      {
      //此处直接执行 Query 方法
      var student = _sqlCommand.GetSqlElement("Student.GetStudentByID").Query<Student>(new
      {
      ID = 1
      }); return View(student);
      }
      }

      说明:

      • 用此种方法必须在 Startup中调用AddMSSQLserver方法
      • 实现了读写分离,当然 如果主库和从库连接字符串一样就效果了
      • 这就是为什么说支持多数据库的原因了

结尾

该项目还是开始阶段,只是个雏形,包括文件的命名都可能是不规范的.希望大家多给意见和建议.

Zoey.Dapper--Dapper扩展之把SQL语句放到文件中的更多相关文章

  1. sql语句把字段中的某个字符去掉

    sql语句把字段中的某个字符去掉 )),'http://demo.m-school.net','') 例如: )),'http://192.168.2.180','') )),'http://zpzx ...

  2. SQL语句 在一个表中插入新字段

    SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter ...

  3. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  4. MyBatis学习(二)、SQL语句映射文件(1)resultMap

    二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...

  5. 二、SQL语句映射文件(1)resultMap

    //备注:该博客引自:http://limingnihao.iteye.com/blog/106076 SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对 ...

  6. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  7. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  8. SQL语句获取数据库中的表主键,自增列,所有列

    SQL语句获取数据库中的表主键,自增列,所有列   获取表主键 1:SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_U ...

  9. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

随机推荐

  1. mysql之 Innobackupex全备恢复(原理、演示)

    一.  Innobackupex恢复原理    After creating a backup, the data is not ready to be restored. There might b ...

  2. loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

    题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...

  3. bzoj 3328 PYXFIB —— 单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...

  4. 关于web.xml不同版本之间的区别

    一.Servlet 2.3 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  5. Spring学习十 rest

    1:  Web  service:  是一个大的概念范畴,它表现了一种设计思想 SOAP 是 Web service 的一个重要组成部份. SOAP 是一种协议而非详细产品.SOAP 是通过 XML ...

  6. BIOS简单设置 解析“集成显卡”内存占用问题

    很多使用集成显卡的用户会发现,在系统信息窗口中,内存容量和实际不一样.比如系统内存显示4GB,可用3.48G之类.这不可用的一部分内存到哪去了? 其实减少的这部分内存是被集成显卡占用当做显存使用了.而 ...

  7. 50 states of America

    美国州名 州名英文  州名音标 简写 首府 首府 阿拉巴马州 Alabama   [ˌæləˈbæmə] AL 蒙哥马利 Montgomery[mənt'gʌməri] 阿拉斯加州 Alaska  [ ...

  8. 2016.9.9《Oracle查询优化改写技巧与案例》电子工业出版社一书中的技巧

    1.coalesce (c1,c2,c3,c4,...) 类似于nvl但可以从多个表达式中返回第一个不是null的值 2.要在where条件中引用列的别名,可以再嵌套一层查询 select * fro ...

  9. node与vue结合的前后端分离跨域问题

    第一点:node作为服务端提供数据接口,vue使用axios访问接口, 安装axios npm install axios --save 安装完成后在main.js中增加一下配置: import ax ...

  10. SpringMVC工作原理图解

    SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...