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. linux源码Makefile的详细分析

    目录 一.概述 1.本文的意义 2.Linux内核Makefile文件组成 二.Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1.从总目标uImage说起 2.v ...

  2. Junit 源码剖析(二)

    junit4 下的所有的testcase都是在Runner下执行的, 可以将Runner理解为junit运行的容器, 默认情况下junit会使用JUnit4ClassRunner作为所有testcas ...

  3. PyCharm使用技巧记录(一)如何查看变量

    [为了方便自己以后查阅,记录下使用PyCharm时的一些小技巧] 正在学习Python,在调试Python程序时,遇到了一个非常大的问题:如何能够方便地查看变量的取值呢? 由于使用matlab多年,深 ...

  4. spoj PARTIT

    三维DP 第K字典序从左向右找 根据dp数组的值算出每一位该打印什么 代码: #include <cstdio> #include <cstring> using namesp ...

  5. 如何用 React Native 创建一个iOS APP?

    诚然,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 Reac ...

  6. Sed&awk笔记之sed篇

    http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...

  7. Gems

    zoj2332:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2332 题意:这一道题的题意,我看了很久,也没有看明白,最终 ...

  8. Js 表单序列化

    http://www.w3cmm.com/javascript/serialize-form.html

  9. SQL SELECT基本语句结构

    (1)SELECT select_list (2) FROM table_list (3)   WHERE search_conditions     GROUP BY group_by_list   ...

  10. Spring整合CXF,发布RSETful 风格WebService

    原文地址:http://www.cnblogs.com/hoojo/archive/2012/07/23/2605219.html 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有 ...