Zoey.Dapper--Dapper扩展之把SQL语句放到文件中
介绍
不知道大家在用Dapper
的时候SQL语句是写到哪的,目前看网上的例子都是写到类里面的.
此项目的目的是把SQL语句放到文件(xml)中
目前只是初步版本,只是说明了意图,后面会持续完善和优化
功能说明
- SQL 语句单独存放在文件(xml)中
- 支持配置多文件夹(暂不支持指定具体文件)
- 实时监听文件变化
- 支持多数据库(Dapper 本身就支持多数据,为什么这里说支持多数据呢?后面会讲到)
- 支持读写分离(功能虽然有,但配置看起来不爽,后续应该会优化. 负载平衡算法还未实现)
一起看看如何使用
首先我们需要一个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-query
和sql-command
节点来判断的 name
属性目前是所有文件都不能重复
在
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")
}
};
});
说明:
- 大家也看到了,此处的配置很是繁琐,上面我也说了,这里应该要优化(但不紧急)
用的时候有两种方式.
当我们没调用
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
信息,没什么特别的.下面我们看第二种:
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语句放到文件中的更多相关文章
- sql语句把字段中的某个字符去掉
sql语句把字段中的某个字符去掉 )),'http://demo.m-school.net','') 例如: )),'http://192.168.2.180','') )),'http://zpzx ...
- SQL语句 在一个表中插入新字段
SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter ...
- MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存
二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...
- MyBatis学习(二)、SQL语句映射文件(1)resultMap
二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...
- 二、SQL语句映射文件(1)resultMap
//备注:该博客引自:http://limingnihao.iteye.com/blog/106076 SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对 ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
- SQL语句获取数据库中的表主键,自增列,所有列
SQL语句获取数据库中的表主键,自增列,所有列 获取表主键 1:SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_U ...
- 一条SQL语句在MySQL中如何执行的
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...
随机推荐
- SQL SERVER存储过程的几种示例
1.常用系统存储过程及使用语法:exec sp_databases; --查看数据库exec sp_tables; --查看表exec sp_columns student;--查看列exec sp_ ...
- Azure VM Disk的设计与部署
Azure的VM的设计中,Disk相关的设计是非常重要的一个内容,本文将介绍Azure上的VM的Disk相关的一些最佳实践和一些小的技巧. 一.Azure VM中Disk的存储账户设计 1. Stor ...
- @property_@synthesize 配套使用
@property 类默认实现变量的get set方法 @synthesize 是指定那个变量的 get和set方法 eg: .h文件中定义 类Student中含有两个 int age,和int _a ...
- ThreadPoolExecutor的corePoolSize和maximumPoolSize
按照JDK文档的描述, 如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程 如果池中的线程数>corePoolSize and <max ...
- Ubuntu登录异常: 输入正确的密码, 但是却无法进入系统, 总是返回到登录界面, 但是用ctrl+alt+F1-F文字界面登录都可以进入。
今天打开电脑的时候, 在输入密码之后, 未进入ubuntu的桌面, 而是显示了几行英文之后有返回到了登录界面.显示的英文如下: could not write bytes: Broken pipe ...
- java 多线程系列基础篇(八)之join()、start()、run()方法
1. join()介绍 join() 定义在Thread.java中.join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行.这句话可能有点晦涩,我们还是通过例子去理解: // 主线程 ...
- java 截取替换掉括号 包括括号中的内容
public static void main(String[] args) { String company = "华厦世纪(厦门)地产"; // System.out.prin ...
- Cookies和Session的定义与区别
Cookies和Session二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网 ...
- c++对象模型探索(一)
粗略阅读了<深度探索c++对象模型>一书后,对c++对象底层的内存布局有了一些了解,但同时,也产生了一些疑惑: 1.将子类指针用dynamic_cast转成父类指针之后,其虚表指针会相应变 ...
- MyBatis总结一:快速入门
简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...