SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
基本思想,将MsSqlDbUtility和MySqlDbUtility设计成单例模式,通过App.config或Web.config进行默认的数据库设置,然后通过DbUtilityFactory获取DbUtility。
1.接口:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq.Expressions;
using RA.DataAccess.MsSqlDbUtility; namespace RA.DataAccess
{
public interface IDbUtility
{
/// <summary>
/// 获取Sql描述对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
SqlSession<T> GetSqlExpression<T>() where T : class;
/// <summary>
/// 获取多条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="exp"></param>
/// <returns></returns>
List<T> GetList<T>(SqlSession<T> exp) where T : class;
/// <summary>
/// 获取多条数据,并填入DTO中
/// </summary>
/// <typeparam name="Target"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="exp"></param>
/// <returns></returns>
List<Target> GetList<Target, T>(SqlSession<T> exp) where T : class where Target : class;
/// <summary>
/// 分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="By">OrderBy表达式</param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
List<T> Paged<T>(Expression<Func<T, object>> By, int pageIndex, int pageSize = ) where T : class;
/// <summary>
/// 获取单条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func">linq表达式,代表条件</param>
/// <returns></returns>
T GetSingle<T>(Expression<Func<T, bool>> func) where T : class;
/// <summary>
/// 删除一条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func">linq表达式,代表条件</param>
/// <returns></returns>
int Delete<T>(Expression<Func<T, bool>> func) where T : class;
/// <summary>
/// 添加一条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
int Add<T>(T obj) where T : class;
/// <summary>
/// 直接执行Sql
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
int RunSingleSql<T>(string sql) where T : class;
/// <summary>
/// 通过Sql获取DataTable,业务层不使用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
DataTable GetDataBySql<T>(string sql) where T : class;
/// <summary>
/// 更新一条数据
/// </summary>
/// <typeparam name="T">数据表实体</typeparam>
/// <param name="obj">实体对象</param>
/// <param name="func">linq表达式,代表条件</param>
/// <returns></returns>
int Update<T>(T obj, Expression<Func<T, bool>> func) where T : class;
/// <summary>
/// 添加多条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objs">实体对象列表</param>
/// <returns></returns>
int AddList<T>(List<T> objs) where T : class;
/// <summary>
/// 计数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func">linq表达式,代表条件</param>
/// <returns></returns>
int Count<T>(Expression<Func<T, bool>> func = null) where T : class;
/// <summary>
/// 获取一个字段数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="field">linq表达式,代表字段</param>
/// <param name="func">linq表达式,代表条件</param>
/// <returns></returns>
Target Scala<T, Target>(Expression<Func<T, Target>> field, Expression<Func<T, bool>> func);
}
}
2.工厂类:
using System;
using System.Configuration; namespace RA.DataAccess
{
public class DbUtilityFactory
{
public static IDbUtility GetDbUtility()
{
var getDbType = ConfigurationManager.AppSettings["DbType"];
if (getDbType == "MySql")
{
return MySqlDbUtility.DbUtility.GetInstance();
}
else if (getDbType == "MsSql")
{
return MsSqlDbUtility.DbUtility.GetInstance();
}
else
{
throw new NotSupportedException("不支持的数据库");
}
}
} }
SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择的更多相关文章
- SqlHelper简单实现(通过Expression和反射)1.引言
之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...
- PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]
PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession
此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select ...
- SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类
这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. ...
- SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类
MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...
- SqlHelper简单实现(通过Expression和反射)10.使用方式
以下是整个SqlHelper的Demo: public Result<List<ArticleDTO>> GetIndexArticleList(int count, int ...
随机推荐
- An Edge-Guided Image Interpolation Algorithm via Directional Filtering and Data Fusion【翻译】
基于定向滤波和数据融合的边缘引导图像插值算法 http://ieeexplore.ieee.org/document/1658087/ 摘要: 保留边缘结构对于从低分辨率对应物重建高分辨率图像的图像插 ...
- hdu 3760(2次bfs求最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...
- C语言二维数组
上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本节只介绍二维数 ...
- Android测试:从零开始3—— Instrumented单元测试1
Instrumented单元测试是指运行在物理机器或者模拟机上的测试,这样可以使用Android framework 的API和supporting API.这会在你需要使用设备信息,如app的Con ...
- excel提取汉字拼音首字母
本文转载:http://jingyan.baidu.com/article/63acb44adca44461fcc17e85.html 利用Excel表格中的宏,轻松提取首字母 方法/步骤 1.启动E ...
- 01.ZooKeeper安装和介绍
1.ZooKeeper安装和启动 1.下载解压ZooKeeper ZooKeeper官方地址:http://zookeeper.apache.org/ 下载当前稳定版本:zookeeper-3.4.6 ...
- c#修改cpu主频
并不是真正能修改硬件,只是一个数据,能骗过部分程序检测,如英雄联盟必须达到3.0的主频才能使用录像功能,通过修改可以达到要求. 下面是代码: public enum RegValueKind { // ...
- 【c++】生成浮点随机数
c++11:std::uniform_real_distribution<>直接求(尖括号不填默认生成double) 随机10个在1-2之间的浮点数 #include <random ...
- matrix---简单dp,边界边界-_-
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5569 简单dp,恶心的边界处理,无语: if((i+j)%2==1) dp[i][j]=a[i-1][ ...
- 前端构建工具gulpjs的使用介绍及技巧(一)
原文链接:http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非 ...