我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)
一、数据库访问 概述
1. 数据库使用mysql,orm采用dapper框架。dapper框架应用简单,只是需要自己手写sql语句,但是对于像我这样写了多年sql语句的人来说,这应该不算问题,个人还是比较喜欢这种手写sql语句的框架。
Dapper 虽然已经非常简单,但是为了调用时方便还是进行了一下封装 ,这样在写DAL 层方法时,就不用每次都try catch了。
2.先放代码:
调用方法示例:
#region role 增删改查
/// <summary>
/// 增加一条
/// </summary>
public static void AddRole(Role role, IDbTransaction tran = null)
{
string sql = @"insert into role(Id,Name,Note)
values(@Id,@Name,@Note)";
role.EnsureIdNotNull();
DB.DBHelper.Execute(sql, role, tran);
} /// <summary>
/// 更新
/// </summary>
public static void UpdateRole(Role role, IDbTransaction tran = null)
{
string sql = @"update role set Name=@Name,Note=@Note where Id=@Id";
DB.DBHelper.Execute(sql, role, tran);
} /// <summary>
/// 删除 一条记录
/// </summary>
public static void DeleteRole(string Id, IDbTransaction tran = null)
{
string sql = "select count(1) from userrole where RoleId= @Id";
var c = DB.DBHelper.ExecuteScalar<int>(sql, new { Id = @Id });
if (c > )
{
throw new OperateException("该角色已经有用户在使用,不能删除");
} List<string> sqllist = new List<string>();
sqllist.Add("delete from role where Id=@Id");
sqllist.Add("delete from rolemenu where RoleId=@Id"); //同步删除为角色分配的权限
DB.DBHelper.Execute(sqllist, new { Id = Id }, tran);
} /// <summary>
/// 列表查询
/// </summary>
/// <param name="pl"></param>
/// <returns></returns>
public static ResultSet<Role> GetRoleList(ParamList pl)
{
string sql = @"select Id,Name,Note from role where 1=1";
pl.orderby = "Name";
//添加各种查询条件
if (pl.isnotnull("keywords"))
{
sql += " and instr(concat(Name,Note),@keywords)>0";
}
return DB.DBHelper.GetResultSet<Role>(sql, pl.orderby, pl);
}
#endregion
DBHelper 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using Dapper;
using CommonModel; namespace DBTools
{
/// <summary>
/// 执行sql ,抛出异常
/// </summary>
public class DBHelper
{
#region 连接信息
public virtual string ConnectionString
{
get;
set;
}
public virtual DataBaseType DBType
{
get;
set;
}
#endregion #region 获取DBAdapter
public DBAdapter GetDBAdapter()
{
return DBTools.DBFactory.GetAdapter(DBType, ConnectionString);
} #endregion #region 查询
public List<dynamic> Query(string sql, object query = null, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
var m = conn.Query(sql, query).ToList();
return m;
}
catch (Exception ex) { throw ex; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
} public List<T> Query<T>(string sql, object query = null, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
var m = conn.Query<T>(sql, query).ToList<T>();
return m;
}
catch (Exception ex) { throw ex; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
} public T ExecuteScalar<T>(string sql, object query = null, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
var m = conn.ExecuteScalar<T>(sql, query, tran);
return m;
}
catch (Exception ex) { throw ex; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
} #endregion #region Result /// <summary>
/// 返回一个ResultSet 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="pl"></param>
/// <param name="tran"></param>
/// <returns></returns>
public ResultSet<T> GetResultSet<T>(string sql, string OrderBy, ParamList pl, IDbTransaction tran = null)
{
DBAdapter adapter = GetDBAdapter(); try
{
var conn = adapter.OpenDatabase();
if (pl.ispage)
{
string pagesql = adapter.GetPageSql(sql, OrderBy);
string countsql = adapter.GetCountSql(sql); var m = conn.Query<T>(pagesql, pl.GetParameters(), tran).ToList<T>();
var c = conn.ExecuteScalar<int>(countsql, pl.GetParameters(), tran);
return new ResultSet<T>() { Value = m, Total = c };
}
else
{
var m = conn.Query<T>(sql + " order by " + OrderBy, pl.GetParameters(), tran).ToList<T>();
return new ResultSet<T>() { Value = m, Total = m.Count };
}
}
catch
{
throw;
}
finally
{
adapter.CloseDatabase();
}
} /// <summary>
/// 返回一个ResultSet 查询
/// </summary>
/// <param name="sql"></param>
/// <param name="OrderBy"></param>
/// <param name="pl"></param>
/// <param name="tran"></param>
/// <returns></returns>
public ResultSet GetResultSet(string sql, string OrderBy, ParamList pl, IDbTransaction tran = null)
{
DBAdapter adapter = GetDBAdapter(); try
{
var conn = adapter.OpenDatabase();
if (pl.ispage)
{
string pagesql = adapter.GetPageSql(sql, OrderBy);
string countsql = adapter.GetCountSql(sql); var m = conn.Query(pagesql, pl.GetParameters(), tran);
var c = conn.ExecuteScalar<int>(countsql, pl.GetParameters(), tran);
return ResultSet.GetResultSet(m, c);
}
else
{
var m = conn.Query(sql + " order by " + OrderBy, pl.GetParameters(), tran);
return ResultSet.GetResultSet(m);
}
}
catch
{
throw;
}
finally
{
adapter.CloseDatabase();
}
}
#endregion #region 执行sql
/// <summary>
/// 执行sql,返回受影响记录数
/// </summary>
/// <param name="sql"></param>
/// <param name="model"></param>
/// <param name="tran"></param>
public int Execute(string sql, object model = null, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
return conn.Execute(sql, model, tran); }
catch (Exception ex) { throw ex; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
}
/// <summary>
/// 执行sql,返回受影响条记录数
/// </summary>
/// <param name="sql"></param>
/// <param name="pl"></param>
/// <param name="tran"></param>
/// <returns></returns>
public int Execute(string sql, ParamList pl, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
return conn.Execute(sql, pl.GetParameters(), tran); }
catch { throw; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
} /// <summary>
/// 同一个sql语句,批量操作多个对象
/// </summary>
/// <param name="sql"></param>
/// <param name="models"></param>
/// <param name="tran"></param>
public int Execute(string sql, IEnumerable<object> models, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
}
var conn = tran != null ? tran.Connection : adapter.OpenDatabase();
return conn.Execute(sql, models, tran);
}
catch (Exception ex) { throw ex; }
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
}
} /// <summary>
/// 使用事务批量执行多个语句
/// </summary>
/// <param name="sqllist"></param>
/// <param name="pl"></param>
/// <returns></returns>
public void Execute(List<string> sqllist, object model = null, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
tran = adapter.BeginTransaction();
}
var conn = tran.Connection; foreach (var sql in sqllist)
{
conn.Execute(sql, model, tran);
}
if (adapter != null)
{
adapter.Commit();
}
}
catch
{
if (adapter != null)
{
adapter.Rollback();
}
throw;
}
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
} }
/// <summary>
/// 使用事务批量执行sql语句
/// </summary>
/// <param name="sqllist"></param>
/// <param name="pl"></param>
/// <param name="tran"></param>
public void Execute(List<string> sqllist, ParamList pl, IDbTransaction tran = null)
{
DBAdapter adapter = null; ; try
{
if (tran == null)
{
adapter = GetDBAdapter();
tran = adapter.BeginTransaction();
}
var conn = tran.Connection; foreach (var sql in sqllist)
{
conn.Execute(sql, pl.GetParameters(), tran);
}
if (adapter != null)
{
adapter.Commit();
}
}
catch
{
if (adapter != null)
{
adapter.Rollback();
}
throw;
}
finally
{
if (adapter != null)
{
adapter.CloseDatabase();
}
} }
#endregion }
}
3.说明:
Dapper 相关目录结构如下:

a.分成两个项目是为了避免数据库访问DBTools 被每层引用。除DAL层外,各层可以只引用CommonModel 就可以了.
b.使用DBAdapter 和DBFactory 对相关操作进行了封装,用于支持多数据库,目前我已经实现了MySqlDBAdapter,其他的数据库可以自行实现。
c. 使用时可以使用一个新的DB 类 对DBHelper 进行封装,达到方便调用,及同一个项目中使用多个数据库的目的,如在DAL 层中定义一个DB 类,类中包含一个静态DBHelper 对象,这样就可以向文中开始的那样调用DBHelper 了。
如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration; namespace MVC.DAL
{
public class DB
{
private static DBTools.DBHelper _instance;
private static object lockhelper = new object();
public static DBTools.DBHelper DBHelper
{
get
{
if (_instance == null)
{
lock (lockhelper)
{
if (_instance == null)
{
_instance = new DBTools.DBHelper();
_instance.DBType = DBTools.DataBaseType.MySql;
_instance.ConnectionString = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString;
}
}
}
return _instance;
}
}
}
}
我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)的更多相关文章
- 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(0)
前些日子工作不太忙,自己开发了一个web框架用于以后快速开发,现在分享出来. 系统没有使用各种复杂的东西,也没有太多的层次,有兴趣的可以研究一下.
- 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用
大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码
在Web开发的时候,我们很多时候,需要引用很多CSS文件.JS文件,随着使用更多的插件或者独立样式文件,可能我们的Web界面代码会越来越臃肿,看起来也很累赘,在MVC里面提供了一个Bundle的对象, ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客里面介绍Web开发框架的文章比较少,其实以前在单位工作,80%的时间是做Web开发的,很早就形成 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(5)--框架总体界面介绍
在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
http://www.cnblogs.com/wuhuacong/p/3344096.html 在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息
在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...
- 基于MVC4+EasyUI的Web开发框架经验总结
http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图 标,从而是Web系统 ...
随机推荐
- JavaScript中的私有属性
一.使用构造函数获得私有属性: function Gadget(){ var name = 'iPod'; this.getName = function(){ return name; }; }; ...
- php实现文件上传与下载(中)
出现不想让用户看见的信息,可以使用错误抑制符号@:当然能echo的东西都是可以赋值给一个变量的: 定义用户上传文件类型,将其放在数组变量allowExt中,用if(!in_array(第一个参数为获取 ...
- HTML5 Drop API
转自:http://www.cnblogs.com/fsjohnhuang/p/3961066.html 一.前言 在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5 ...
- Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005 拒绝访问。
这几天在写一个导出word的功能,使用 Microsoft.Vbe.Interop.dll和Office.dll 在本地都可以正常运行,但是上传到服务器后就报错,如下图: 对于此问题,也在网上查了一些 ...
- 10Spring高级----青软S2SH(笔记)
- Standard C 语言标准函数库介绍
全面巩固所知所学,往精通方向迈进! Standard C 语言标准函数库速查 (Cheat Sheet) from:http://ganquan.info/standard-c/function/ C ...
- [Machine Learning] logistic函数和softmax函数
简单总结一下机器学习最常见的两个函数,一个是logistic函数,另一个是softmax函数,若有不足之处,希望大家可以帮忙指正.本文首先分别介绍logistic函数和softmax函数的定义和应用, ...
- 查找Linux中内存和CPU使用率最高的进程
下面的命令会查看到按照RAM和CPU降序方式的前最高几名进程的列表: [root@iZ25pvjcsyhZ ~]# ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem ...
- SPOJ FTOUR2 - Free tour II
Description 有些黑点,问你选择不超过 \(k\) 个黑点的路径,路径权值最大是多少. Sol 点分治. 这是qzc的论文题,不过我感觉他的翻译好强啊...我还是选择了自己去看题目... 点 ...
- WPF 中的image控件的Source如何赋值
Image image=new Image();image.Source = new BitmapImage(new Uri(@"daw\adw.jpg",UriKind.Rela ...