ORM之二:核心接口与扩展操作
一、数据库提供者接口
/// <summary>
/// 数据库提供者
/// </summary>
public interface IDbProvider : IDisposable
{
/// <summary>
/// 初始化数据库连接信息
/// </summary>
/// <param name="dbConnInfo"></param>
/// <returns></returns>
IDbProvider Init(DbConnInfo dbConnInfo); /// <summary>
/// 获取Lambda语法的数据操作对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
IReqository<T> GetReqository<T>() where T : class, new(); ///<summary>
/// 获取Linq语法的数据查询对象
///</summary>
///<typeparam name="T"></typeparam>
///<returns></returns>
IQuery<T> GetQuery<T>() where T : class, new(); ///<summary>
/// 扩展操作
///</summary>
///<returns></returns>
IDbExtension GetDbExtension(); /// <summary>
/// 事务开启
/// </summary>
void Begin(); /// <summary>
/// 事务提交
/// </summary>
void Commit(); /// <summary>
/// 事务回滚
/// </summary>
void Rollback(); } ///<summary>
/// 扩展数据库提供者
///</summary>
internal interface IDbProviderExtend : IDbProvider
{
IDbExecutor DbExecutor { get; }
}
二、单表操作
/// <summary>
/// 标准的数据层接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IReqository<T> where T : class
{
/// <summary>
/// 新增实体对象
/// </summary>
/// <param name="entity">实体对象</param>
void Insert(T entity); /// <summary>
/// 批量新增实体对象
/// </summary>
/// <param name="entitys"></param>
void Insert(IList<T> entitys); /// <summary>
/// 根据条件表达式自动删除对应数据
/// </summary>
/// <param name="where"></param>
/// <returns></returns>
int Delete(Expression<Func<T, bool>> where); /// <summary>
/// 根据条件表达式将映射对象的数据进行局部更新
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="update"></param>
/// <param name="where"></param>
/// <returns></returns>
int Update<TResult>(Expression<Func<T, TResult>> update, Expression<Func<T, bool>> where) where TResult : class; /// <summary>
/// 根据条件表达式获得[Top 1]实体对象
/// </summary>
/// <param name="where"></param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
T Single(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获得实体对象列表
/// </summary>
/// <param name="where">条件表达式</param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
IList<T> Select(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获得指定记录的条数
/// </summary>
/// <param name="where"></param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
int Count(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获取某列的和
/// </summary>
/// <param name="select"></param>
/// <param name="where"></param>
/// <param name="noLock"></param>
/// <returns></returns>
object Sum<TResult>(Expression<Func<T, TResult>> select, Expression<Func<T, bool>> where, bool noLock = false); }
三、多表操作
///<summary>
/// 多表查询对象接口
///</summary>
///<typeparam name="T">数据实体</typeparam>
public interface IQuery<out T> : IOrderedQueryable<T>
{
} ///<summary>
/// IQuery的扩展方法
///</summary>
public static class Query
{
///<summary>
/// 分页功能
///</summary>
///<param name="source"></param>
///<param name="rowCount">每页的行数</param>
///<param name="pageNumber">第几页</param>
///<typeparam name="TSource"></typeparam>
///<returns></returns>
public static IQueryable<TSource> Page<TSource>(this IQueryable<TSource> source, int rowCount, int pageNumber)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return source.Provider.CreateQuery<TSource>(Expression.Call(null,
((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[]
{
typeof (TSource)
}),
new Expression[]
{
source.Expression,
Expression.Constant(rowCount),
Expression.Constant(pageNumber)
}));
} ///<summary>
/// 扩展join功能
///</summary>
///<param name="source"></param>
///<param name="joins"></param>
///<typeparam name="TSource"></typeparam>
///<returns></returns>
public static IQueryable<TSource> SetJoinMode<TSource>(this IQueryable<TSource> source, params JoinMode[] joins)
{
if (source == null)
{
throw new ArgumentNullException("source");
} return source.Provider.CreateQuery<TSource>(Expression.Call(null,
((MethodInfo) MethodBase.GetCurrentMethod()).
MakeGenericMethod(new Type[] {typeof (TSource)}),
new Expression[]
{
source.Expression,
Expression.Constant(joins)
}));
}
} ///<summary>
///</summary>
public enum JoinMode
{
///<summary>
/// 内连接
///</summary>
Inner, ///<summary>
/// 左连接
///</summary>
Left, ///<summary>
/// 右连接
///</summary>
Right, ///<summary>
/// 全连接
///</summary>
Full
}
四、扩展操作
/// <summary>
/// 扩展操作
/// </summary>
public interface IDbExtension
{
/// <summary>
/// 执行存储过程返回影响行数
/// </summary>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
int ExcuteProcNonQuery(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行存储过程返回DataSet
/// </summary>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
DataSet ExcuteProcQuery(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行存储过程返回泛型集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
IList<TResult> ExcuteProcReader<TResult>(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回影响行数
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
int ExcuteNonQuery(string sql, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回DataSet
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
DataSet ExcuteQuery(string sql, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回泛型集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
IList<TResult> ExcuteQuery<TResult>(string sql, DbParameterCollection parameters = null);
}
ORM之二:核心接口与扩展操作的更多相关文章
- Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的 ...
- Hibernate(三)__核心接口和类
该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...
- Hibernate详解(5)——Hibernate核心接口和工作原理
Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...
- Spring Boot REST(一)核心接口
Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...
- Hibernate 之核心接口
1.持久化和ORM 持久化是指把数据(内存中的对象)保存到可持久保存的存储设备中(如硬盘),主要应用于将内存中的数据存储到关系型数据库中,在三层结构中,持久层专注于实现系统的逻辑层面,将数据使用者与数 ...
- 深入解析Hibernate核心接口
Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...
- Hibernate核心接口和工作原理
Hibernate核心接口和工作原理 Hibernate有五大核心接口,分别是:Session .Transaction .Query .SessionFactory .Configuration . ...
- spring源码系列(二):IOC接口设计分析
这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录: 参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spri ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
随机推荐
- sublime打开文件时自动生成并打开.dump文件
GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,subli ...
- Switch基本知识
关于java中switch使用的一些说明 switch(表达式){case 常量表达式1:语句1;....case 常量表达式2:语句2;default:语句;}default就是如果没有符合的cas ...
- poj2182
首先容易知道,最后一个数是最容易确定的,于是从后往前确定 对于位置j,它的数就是1~n中剩余数的第a[j]+1小的数 这当然可以用平衡数做,复杂度为O(nlogn) 有没有更简洁得算法?树状数组+二分 ...
- ZBreak
https://github.com/atskyline/ZBreak 最近用电脑用的多,总觉得有必要2个小时休息一会.就花了一点点时间写了这个小东西如果连续使用电脑超过2个小时会弹出一个窗口提示. ...
- 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...
- Apache2.2+Tomcat7.0整合配置详解
一.简单介绍 Apache.Tomcat Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,可以在 Windows.Unix.Lin ...
- 学习Erlang--1、入门
1.正式起航 从前,一名程序员偶然读到了一本古怪的语言图书,相等其实不是相等,变量其实是不能改变的,语法是那么陌生,它甚至不是面向对象,这些程序实在是太过另类…… 另类的不仅仅是程序,编程的教学步骤也 ...
- 【管理工具】Kerberos简单应用
Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者”系统设计上采用客户端/服务器结构与DES加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证.可以用于防止窃听 ...
- 关于photoshop钢笔工具中各点对应到“贝塞尔曲线”中的含义(cocos2d-x与iOS)
1.程序中贝塞尔曲线的简单介绍,只介绍曲线部分.程序中的贝塞尔曲线需要四个点:起始点(startPoint) ,控制点1(controlPoint1),控制点2(controlPoint2),结束点( ...
- [GRYZ2015]足球联赛
问题描述 巴蜀中学新一季的足球联赛开幕了.足球联赛有n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3 分,输一场不得分,平局两只队伍各得一分.英勇无畏的小鸿是机房的主力前锋 ...