基本思想,将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. “几何画板+MathType”双11组合特价,优惠多多

    工欲善其事,必先利其器!几何画板和MathType作为数学老师必备工具,在数学教学中起着非常重要的作用.为回馈老师们做出的伟大贡献,在双11狂欢节期间,MathType和几何画板迎来史上第一次组合特惠 ...

  2. hdu 4708(暴力+找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 思路:由于N不大,并且我们可以发现通过旋转得到的4个对角线的点的位置关系,以及所要旋转的最小步数 ...

  3. Codeforces Round #311 (Div. 2) A,B,C,D,E

    A. Ilya and Diplomas 思路:水题了, 随随便便枚举一下,分情况讨论一下就OK了. code: #include <stdio.h> #include <stdli ...

  4. Woody的Python学习笔记3

    Python运算符 Python逻辑运算符 and布尔与-假设x为false.x and y返回false,否则它返回y的计算值. or 布尔或-假设x是true,它返回true.否则它返回y的计算值 ...

  5. ASp.Net控件的生命周期

    服务端事件 页面生命周期 描述 Init Initialization 初始化控件树 LoadViewState Unpack ViewState 从ViewState里提取出状态信息 LoadCon ...

  6. myForm.js

    根据控件名,重现一些特殊的表单项,生成html var can_submit = true; function myForm($form_id, $id_value, province, city, ...

  7. Linux命令之乐--time

    time用于统计命令执行花费的总时间 例一: [root@Director usr]# time ls bin etc games include java lib lib64 libexec loc ...

  8. HDU 5306 Gorgeous Sequence[线段树区间最值操作]

    Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  9. iOS 界面翻转切换动画

    [UIView  beginAnimations:nil context:NULL]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [ ...

  10. HDU5667—Sequence(对数转化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题目意思:f1=1,i=1 f2=2 ,i=2 fi=a^b*f[i-1]^c*f[i-2] i ...