我的基于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系统 ...
随机推荐
- Java开发实践 集合框架 全面分析
http://www.open-open.com/lib/view/open1474167415464.html
- 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化
<?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...
- web api9
- java创建文件和目录
java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报 分类: JAVA基础(10) 版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...
- Xcode 8 支持 iOS 7 真机解决过程记录
领导要求不放弃iOS 7 用户,所以我们Xcode 8 上面支持ios 7 必须要解决! 解决方法(过程): 1.应用程序--Xcode(原来的Xcode 7)-- 显示包内容--Contents-- ...
- php内部函数
strpos函数 /** haystack:被比较字串首地址(指向被比较字符串) needle:源字串首地址(指向源字符串) needle_len:源字符串长度 end:指向最后一个字符地址的下一个内 ...
- 关于ie版本判断
//see: http://tanalin.com/en/articles/ie-version-js/ var browser = function(){ var isIE=!!window.Act ...
- GNU Radio Radar Toolbox
GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...
- 我的vimrc
set nocompatible set langmenu=en_USlet $LANG= 'en_US' source $VIMRUNTIME/vimrc_example.vim source $V ...
- UI第十八节——UITableView
在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,基本大部分应用都有UITableView.当然它的广泛使用自然离不开它强大的功能,今天就针对U ...