using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using System.Collections;
using System.Reflection;
using Knet.H5.Entity.Core; namespace Knet.H5.Toolkit.Data.Core
{
public class DapperDBase<T> where T : class,new()
{
public string TableName { get; set; }
public string Primarykey { get; set; }
public List<string> CoulmnsList { get; set; }
public DapperDBase()
{
var tablenameAttribute = (TableAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(TableAttribute));
Primarykey = tablenameAttribute.PrimaryKey;
TableName = tablenameAttribute.TableName;
CoulmnsList = GetEntityProperties(typeof(T));
} /// 得到web.config里配置项的数据库连接字符串。
private static readonly string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ora9)));User Id=;Password=;"; private static DbConnection _db; private static readonly object objLocker = new object(); public static DbConnection DB
{
get
{
if (_db == null)
{
lock (objLocker)
{
if (_db == null)
{
Database Db = new OracleDatabase(connectionString);
DbConnection connection = Db.CreateConnection();
return connection;
}
}
}
return _db;
}
} /// <summary>
/// 根据ID获取model
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public T GetModelById(object Id)
{
string executeSql = @" SELECT " + string.Join(",", CoulmnsList) + " FROM " + this.TableName + " WHERE ID = :ID ";
var conditon = new { ID = Id };
return DB.Query<T>(executeSql, conditon).SingleOrDefault() ?? default(T);
} /// <summary>
/// 根据ID获取model
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public T GetModelById(object Id, params string[] selectCoumlns)
{
var selectFields = string.Empty;
if (selectCoumlns.Length > )
{
selectFields = string.Join<string>(",", selectCoumlns);
}
else
{
selectFields = string.Join(",", CoulmnsList);
}
string executeSql = @" SELECT " + selectFields + " FROM " + this.TableName + " WHERE " + this.Primarykey + " = :ID ";
var conditon = new { ID = Id };
return DB.Query<T>(executeSql, conditon).SingleOrDefault() ?? default(T);
} /// <summary>
/// 根据ID获取model
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public T GetModelByWhere(object whereObj)
{
var wherePro = whereObj.GetType().GetProperties();
var whereList= new List<string>();
foreach (var item in wherePro)
{
if (item.GetValue(whereObj) == null) continue;
whereList.Add(string.Format("{0}=:{0}", item.Name));
}
string executeSql = @" SELECT " + string.Join(",", CoulmnsList) + " FROM " + this.TableName;
if (whereList.Count > )
{
executeSql += " WHERE " + string.Join(" AND ", whereList);
}
return DB.Query<T>(executeSql, whereObj).SingleOrDefault() ?? default(T);
} /// <summary>
/// 获取列表
/// </summary>
/// <param name="whereStr">只能使用且的关系,且属于该model内的字段</param>
/// <param name="order">排序字段 create_date desc</param>
/// <returns></returns>
public List<T> GetList(object whereObj = null, string order = null)
{
var whereList = new List<string>();
if (whereObj != null)
{
var wherePro = whereObj.GetType().GetProperties();
foreach (var item in wherePro)
{
if (item.GetValue(whereObj) == null) continue;
whereList.Add(string.Format("{0}=:{0}", item.Name));
}
}
string executeSql = @" SELECT " + string.Join(",", CoulmnsList) + " FROM " + this.TableName;
if (whereList.Count > )
{
executeSql += " WHERE " + string.Join(" and ", whereList);
}
if (!string.IsNullOrEmpty(order))
{
executeSql += " ORDER BY " + order;
}
return DB.Query<T>(executeSql, whereObj).ToList();
} /// <summary>
/// 获取列表
/// </summary>
/// <param name="whereStr">只能使用且的关系,且属于该model内的字段</param>
/// <param name="order">排序字段 create_date desc</param>
/// <returns></returns>
public List<T> GetList(string whereStr = null, string order = null)
{
string executeSql = @" SELECT " + string.Join(",", CoulmnsList) + " FROM " + this.TableName;
if (!string.IsNullOrEmpty(whereStr))
{
executeSql += " where " + whereStr;
}
if (!string.IsNullOrEmpty(order))
{
executeSql += "order by " + order;
}
return DB.Query<T>(executeSql, whereStr).ToList();
} /// <summary>
/// 获取全部字段
/// </summary>
/// <param name="order">排序</param>
/// <returns></returns>
public List<T> GetAllList(string order = null)
{
string executeSql = @" SELECT " + string.Join(",", CoulmnsList) + " FROM " + this.TableName;
if (!string.IsNullOrEmpty(order))
{
executeSql += " ORDER BY " + order;
}
return DB.Query<T>(executeSql).ToList();
} /// <summary>
/// 插入
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Add(T model)
{
string executeSql = @" INSERT INTO " + this.TableName + " (" + string.Join(",", CoulmnsList) + " ) VALUES (" + string.Join(",:", CoulmnsList).Insert(, ":") + ") ";
return DB.Execute(executeSql, model);
} /// <summary>
/// 更新
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public bool Update(T model)
{
var wherePro = model.GetType().GetProperties();
var whereSql = new List<string>();
foreach (var item in wherePro)
{
//if (item.GetValue(model) == null) continue;
whereSql.Add(string.Format("{0}=:{0}", item.Name));
}
string executeSql = @" UPDATE " + this.TableName + " SET " + string.Join(",", whereSql) + " WHERE " + this.Primarykey + "=:" + Primarykey;
return DB.Execute(executeSql, model) > ;
} /// <summary>
/// 根据条件更新指定的字段
/// </summary>
/// <param name="updateCoumlns"></param>
/// <param name="whereStr"></param>
/// <returns></returns>
public bool Update(object updateCoumlns, string whereStr)
{
var wherePro = updateCoumlns.GetType().GetProperties();
var whereSql = new List<string>();
foreach (var item in wherePro)
{
if (item.GetValue(updateCoumlns) == null) continue;
whereSql.Add(string.Format("{0}=:{0}", item.Name));
}
string executeSql = @" UPDATE " + this.TableName + " SET " + string.Join(",", whereSql);
if (!string.IsNullOrEmpty(whereStr))
{
executeSql += " WHERE " + whereStr;
}
return DB.Execute(executeSql, updateCoumlns) > ;
} //public bool Update(string[] fields,string value) /// <summary>
/// 获取分页数据
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="selectFields">查询的字段</param>
/// <param name="whereObj"></param>
/// <param name="order"></param>
/// <returns></returns>
public PagedList<T> GetPagerList(int pageIndex, int pageSize, string[] selectFields = null, object whereObj = null, string order = null)
{
var whereList = new List<string>();
if (whereObj != null)
{
var wherePro = whereObj.GetType().GetProperties();
foreach (var item in wherePro)
{
if (item.GetValue(whereObj) == null) continue;
whereList.Add(string.Format("{0}=:{0}", item.Name));
}
}
string orderSql = string.Empty, whereSql = string.Empty, fields = " row_.*";
if (!string.IsNullOrEmpty(order))
{
orderSql = " ORDER BY " + order;
}
if (whereList.Count > )
{
whereSql = " WHERE " + string.Join(" and ", whereList);
}
if (selectFields != null && selectFields.Length > )
{
fields = string.Join(",", selectFields);
}
string executeSql = @" SELECT COUNT(0) FROM " + this.TableName + whereSql;
int totalCount = DB.Query<int>(executeSql, whereObj).SingleOrDefault();
string pagerSql = "SELECT * FROM ( SELECT " + fields + ", rownum rownum_ from ( SELECT * FROM " + this.TableName + whereSql + orderSql + ") row_ where rownum <= " + pageIndex * pageSize + ") where rownum_ >" + (pageIndex - ) * pageSize + "";
var source = DB.Query<T>(pagerSql, whereObj).ToList();
return new PagedList<T>(source, pageIndex, pageSize, totalCount);
} /// <summary>
/// 删除数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool Delete(object id)
{
string executeSql = @" DELETE FROM " + this.TableName + " WHERE " + this.Primarykey + " = :ID";
var conditon = new { ID = id };
return DB.Execute(executeSql, conditon) > ;
} #region 直接执行sql /// <summary>
/// 执行sql语句,参数都以带入的形式
/// </summary>
/// <param name="executeSql"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Update(string executeSql, object value)
{
return DB.Execute(executeSql, value) > ;
} /// <summary>
/// 执行sql语句,参数都以带入的形式
/// </summary>
/// <param name="executeSql"></param>
/// <param name="value"></param>
/// <returns></returns>
public int Add(string executeSql, object value)
{
return DB.Execute(executeSql, value);
} /// <summary>
/// 执行SQL获取table
/// </summary>
/// <param name="executeSql"></param>
/// <returns></returns>
public DataTable GetTable(string executeSql)
{
return DB.Query<DataTable>(executeSql).SingleOrDefault();
} /// <summary>
/// 执行SQL获取LIST
/// </summary>
/// <param name="executeSql"></param>
/// <returns></returns>
public List<T> GetList(string executeSql)
{
return DB.Query<T>(executeSql).ToList();
}
#endregion /// <summary>
/// 对datatable进行分页
/// </summary>
/// <param name="dt"></param>
/// <param name="PageIndex"></param>
/// <param name="PageSize"></param>
/// <returns></returns>
public DataTable SplitDataTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == )
return dt;
DataTable newdt = dt.Clone();
//newdt.Clear();
int rowbegin = (PageIndex - ) * PageSize;
int rowend = PageIndex * PageSize; if (rowbegin >= dt.Rows.Count)
return newdt; if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - ; i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
} return newdt;
} /// <summary>
/// 获取实体所有属性名称
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private List<string> GetEntityProperties(Type type)
{
var list = new List<string>();
PropertyInfo[] properties = type.GetProperties();
foreach (var pro in properties)
{
var fieldsAttribute = new FieldsAttribute();
var attrmodel = pro.GetCustomAttributes<FieldsAttribute>(true).FirstOrDefault();
if (attrmodel != null )
{//controller上有标记
fieldsAttribute = attrmodel as FieldsAttribute;
}
if (!fieldsAttribute.IsSourceFields) continue;
// if ()
list.Add(pro.Name);
}
return list;
}
}
}

自己写的Dapper通用数据访问层的更多相关文章

  1. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  2. 【原创】打造基于Dapper的数据访问层

    [原创]打造基于Dapper的数据访问层   前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...

  3. 基于Spring4+Hibernate4的通用数据访问层+业务逻辑层(Dao层+Service层)设计与实现!

    基于泛型的依赖注入.当我们的项目中有很多的Model时,相应的Dao(DaoImpl),Service(ServiceImpl)也会增多. 而我们对这些Model的操作很多都是类似的,下面是我举出的一 ...

  4. 1.1 DAL数据访问层

    分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...

  5. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  6. 数据访问层的改进以及测试DOM的发布

    数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...

  7. 数据访问层 (DAO)

    数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...

  8. 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层

    背景 17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论.项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具:而在线业 ...

  9. 项目架构开发:数据访问层之Repository

    接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...

随机推荐

  1. Spring 初学 1

    Spring是一个轻量级的框架,他有自己的MVC框架SpringMVC,在以往的Web项目中大多采用Structs2+hibernate+Spring的框架,Structs做web层,Hibernat ...

  2. 30+最佳Ajax jQuery的自动完成插件的例子

    在这篇文章中,我们将介绍35个jQuery AJAX的自动完成提示例子. jQuery 的自动完成功能,使用户快速找到并选择一定的价值.每个人都想要快速和即时搜索输入栏位,因为这个原因,许 流行的搜索 ...

  3. Android应用程序的生命周期

    转自Android应用程序的生命周期 在对一个简单的Hello World工程进行项目结构剖析后,我们接着来学习下一个Android应用程序的生命周期是怎么样的,以便为后面的开发有个垫下良好的基石~ ...

  4. vim文本编辑器的总结

    说起文本编辑器,在下就不得不说vim这个老古董了,说老吧,但也是老当益壮,至今还是有不少拥护者.的确,vim很实用,在下就先列出vi的优点吧. 1.如果精通了vim,就可以省去鼠标了. 2.vim是跨 ...

  5. 彻底理解ThreadLocal(转)

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  6. Delphi中禁止WebBrowser右键的方法

    uses MSHtml; //在控件标签additional中找到TApplicationEvents控件,拖到窗体上.在TApplicationEvents的OnMessage事件中加入以下代码: ...

  7. 创办支持多种屏幕尺寸的Android应用

    创建支持多种屏幕尺寸的Android应用 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的 ...

  8. wcf纯代码创建控制台应用

    https://svn.apache.org/repos/asf/incubator/stonehenge/contrib/stocktrader/dotnet/ stocktrader项目的dotn ...

  9. BZOJ1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛

    1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 665  Solved: 419 ...

  10. 两次fopen不同的文件返回相同的FILE* 地址

    最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了.以下代码是对这个bug的概括: auto fp1 = ...