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 ...
随机推荐
- Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not work..
VC++ 6.0单步调试(F10)出现警告框: 解决方法: 右键VC++ 6.0程序图标
- Raw-OS源代码分析之idle任务
分析的内核版本号截止到2014-04-15,基于1.05正式版,blogs会及时跟进最新版本号的内核开发进度,若源代码凝视出现"???"字样.则是未深究理解部分. Raw-OS官方 ...
- mySubmit.js
function mySubmit(theForm,url,result){ function default_callback(res){ result.html(res.info); if(res ...
- JRebel插件安装配置与破解激活(多方案)详细教程
JRebel 介绍 IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费不少生命啊.目前对于idea热部署最好的解决方案就是安装JRebel插件 ...
- Python全栈day18(迭代器协议和for循环工作机制)
一,什么是迭代和递归 递归和迭代都是循环的一种. 简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保 ...
- Linux中配置主机之间的免密ssh登陆
假如 A 要登陆 B在A上操作:1.首先生成密钥对 ssh-keygen (提示时,直接回车即可) 2.再将A自己的公钥拷贝并追加到B的授权列表文件authorized_keys中 ssh-copy- ...
- js对用户信息加密传输 java后端解密
1.加密采用服务端随机生成加密因子放入session中,传入登录或注册界面(每次进入都刷新) 2.页面中引入jquery.aes.js(这个js从网上下的坑比较多,引入先后顺序不一致都会报错,所以最后 ...
- Exchange Port
Get-POPSettings-110 Get-IMAPSettings-143 Exchange Network Port References Exchange Server 2000 http: ...
- QQ空间发表日志的图片上传功能实现
w间接促使了用户注意图片的顺序,进一步优化的方向的是手指触动或鼠标点击来同时进行图片的增删和调序,避免精确的数字输入. 有效code <form action="wcon/wact&q ...
- 转:java高并发学习记录-死锁,活锁,饥饿
死锁 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 为什么会产生死锁: ① 因为系统资源不足. ② 进程运行推进的顺序不合适. ③ ...