一、数据库访问 概述

  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)的更多相关文章

  1. 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(0)

    前些日子工作不太忙,自己开发了一个web框架用于以后快速开发,现在分享出来. 系统没有使用各种复杂的东西,也没有太多的层次,有兴趣的可以研究一下.

  2. 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码

    在Web开发的时候,我们很多时候,需要引用很多CSS文件.JS文件,随着使用更多的插件或者独立样式文件,可能我们的Web界面代码会越来越臃肿,看起来也很累赘,在MVC里面提供了一个Bundle的对象, ...

  4. 基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍

    最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客里面介绍Web开发框架的文章比较少,其实以前在单位工作,80%的时间是做Web开发的,很早就形成 ...

  5. 基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍

    在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...

  6. 基于MVC4+EasyUI的Web开发框架形成之旅(5)--框架总体界面介绍

    在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...

  7. (转)基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍

    http://www.cnblogs.com/wuhuacong/p/3344096.html 在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章 ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息

    在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...

  9. 基于MVC4+EasyUI的Web开发框架经验总结

    http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图 标,从而是Web系统 ...

随机推荐

  1. Java开发实践 集合框架 全面分析

    http://www.open-open.com/lib/view/open1474167415464.html

  2. 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化

    <?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...

  3. web api9

  4. java创建文件和目录

    java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报  分类: JAVA基础(10)  版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...

  5. Xcode 8 支持 iOS 7 真机解决过程记录

    领导要求不放弃iOS 7 用户,所以我们Xcode 8 上面支持ios 7 必须要解决! 解决方法(过程): 1.应用程序--Xcode(原来的Xcode 7)-- 显示包内容--Contents-- ...

  6. php内部函数

    strpos函数 /** haystack:被比较字串首地址(指向被比较字符串) needle:源字串首地址(指向源字符串) needle_len:源字符串长度 end:指向最后一个字符地址的下一个内 ...

  7. 关于ie版本判断

    //see: http://tanalin.com/en/articles/ie-version-js/ var browser = function(){ var isIE=!!window.Act ...

  8. GNU Radio Radar Toolbox

    GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...

  9. 我的vimrc

    set nocompatible set langmenu=en_USlet $LANG= 'en_US' source $VIMRUNTIME/vimrc_example.vim source $V ...

  10. UI第十八节——UITableView

    在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,基本大部分应用都有UITableView.当然它的广泛使用自然离不开它强大的功能,今天就针对U ...