基本思想,将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模式(工厂+策略)可配置数据库选择的更多相关文章

  1. SqlHelper简单实现(通过Expression和反射)1.引言

    之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...

  2. PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...

  3. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  4. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  5. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  6. SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession

    此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select ...

  7. SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类

    这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. ...

  8. SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类

    MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...

  9. SqlHelper简单实现(通过Expression和反射)10.使用方式

    以下是整个SqlHelper的Demo: public Result<List<ArticleDTO>> GetIndexArticleList(int count, int ...

随机推荐

  1. 电脑端与iPad 端如何共享ChemDraw结构

    在日常生活中,我们使用的电脑会有好几种系统,很多的软件不能做好各个系统的兼容.但是ChemDraw软件很好的解决了这个问题,可以应用于Mac.Windows两个电脑客户端以及Chem3D for iP ...

  2. Oracle索引相关

    oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引. 创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; ...

  3. 获取jqGrid中选择的行的数据以及 jqGrid获得所有行数据的方法

    获取jqGrid中选择的行的数据: 获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id:   1 var id=$('#gridTable').jqGrid('getGridPara ...

  4. 动态规划——最长公共子序列&&最长公共子串

      最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...

  5. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  6. 【BZOJ4636】蒟蒻的数列 STL

    [BZOJ4636]蒟蒻的数列 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个 ...

  7. IOS 十位数0补齐

    NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSYearCalendarUnit | NSMon ...

  8. ajax请求步骤

    ajax步骤:第一步:创建xmlhttprequest对象,var xmlhttp = new XMLHttpRequest(); XMLHttpRequest对象和服务器交换数据.第二步:使用xml ...

  9. Python--paramiko库:连接远程服务器操作文件

    import paramikofrom loggingutils.mylogger import logger as log class SSHConnection(object): def __in ...

  10. Struts2---输入验证

    1. Struts2 的验证 1). 验证分为两种: > 声明式验证* 需要解决的问题如下: >> 确定对哪个 Action 或 Model 的那个字段进行验证 >> 使 ...