写在前面


学习并实践使用Dapper 这个小型的ORM框架已经有一个星期的时间了。为了能加深对它的理解和熟悉。所以,想使用以Dapper 作为 操作数据后台数据,然后使用Layui 作为前台框架,最后使用Ajax进行前后台数据的交互做个具体的实例。也就是说会使用Layui+Ajax+Dapper+MySQL 做一个在开发过程中普遍会遇到的实例。比如:多表查询使用Dapper 应该如何处理?一对多如何添加与编辑?Mvc返回Json格式日期如何处理时间戳?.net MVC接收前端传递的复杂json对象的如何简单处理方法?这些等等的问题,都会在接下来的实践开发过程中一 一解答。注意:其项目只阐述实现的思路~

一、前期准备


1.在MySQL创建数据库

  • 在MySQL数据库创建用户表、图书类型表以及图书借阅表。
-----------------------------------------
--用户表
create table sys_Borrow_User
(
user_id varchar(36) primary key not null,
u_id varchar(50) null,
u_password varchar(50) null,
gender varchar(2) null,
user_name varchar(255) null,
creation_time datetime null,
status varchar(2)
)
--图书类型表
-----------------------------------------
create table sys_Book_Type
(
book_Type_id varchar(36) primary key not null,
book_Type_Name varchar(50) null,
book_Type_Des varchar(255) null,
create_Time datetime null
)
-----------------------------------------
--图书借阅表
create table sys_Borrow_Book(
book_Id varchar(36) primary key not null,
book_Num varchar(50) null,
book_Name varchar(50) null,
book_Desc varchar(255) null,
borow_Time datetime null,
user_Id varchar(36) null,
book_Type_id varchar(36) null,
)
-----------------------------------------

2.创建项目

  • 打开Visual Studio 2013创建一个空的mvc项目。解决方案为myDappers。
  • 打开Web.config,编辑连接字符串,在标记中添加去除BrowserLink的标记。
<!--去除BrowserLink-->
<add key="vs:EnableBrowserLink" value="false" />
  • 在标记下添加标记,连接字符串。
<connectionStrings>
<!--mysql 连接字符串-->
<add name="mq" connectionString="Data Source=连接地址;User ID=用户名;Password=密码;DataBase=数据库;Charset=utf8;Allow User Variables=True;" />
</connectionStrings>

3.安装程序包

  • 打开Vs 选择工具-->NuGet包管理器-->程序包管理器控制台

因为使用的是MySQL数据库,所以我们必须下载MySQL.Data的DLL。

  • 安装 MySql.Data,命令如下:

    Install-Package MySql.Data -Version 6.9.12

  • 安装 Newtonsoftt.json,命令如下:

    PM> Install-Package Newtonsoft.Json

  • 安装 dapper,命令如下:

    PM> Install-Package Dapper -Version 1.50.2

4.添加插件

  • 在项目中添加一个lib文件夹用来存放系统用到的插件。

    把下载好的Jquery(插件)、Layui(前端框架)Layui官网下载地址、Layer(弹出层)Layer官网下载地址添加到lib文件夹中。

  • 在Views视图文件夹中添加share文件夹,用于添加模块页,引用插件。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
<link href="~/lib/layui/css/layui.css" rel="stylesheet" />
<link href="~/lib/layer/theme/default/layer.css" rel="stylesheet" />
<script src="~/lib/jquery/jquery-1.12.4.min.js"></script>
<script src="~/lib/layer/layer.js"></script>
<script src="~/lib/layui/layui.js"></script>
<style>
.layout {
margin: 20px;
padding-left: 15px;
padding-right: 15px;
margin-bottom: 70px;
border: 1px solid #ddd;
border-radius: 10px;
}
</style>
</head>
<body>
<div>
@RenderBody()
</div>
</body>
</html>

注意如此做的主要原因:

在模板页中添加Jquery、Layer、Layui的引用。这样做的好处是,界面加载的时候就不需要每一个界面加载都要请求一次Jquery、Layer和Layui。这个小东西在小项目里面体现的不是很明显,但是在大型的项目中可以减少资源的请求。

5.添加DbOption文件夹

  • 在项目中添加DbOption文件夹,存放简单封装的Dapper。
  • 创建ConnectionFactory类。
///引用Dapper
using Dapper;
///Sqlserver
using System.Data;
using System.Data.SqlClient;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Configuration; /// <summary>
/// 连接字符串
/// </summary>
private static readonly string connstr = ConfigurationManager.ConnectionStrings["mq"].ToString();
#region mysql 数据库连接
/// <summary>
/// mysql 数据库连接
/// </summary>
/// <returns></returns>
public static IDbConnection MysqlConn()
{
string mysqlconnstring = connstr;
var mysqlconn = new MySqlConnection(mysqlconnstring);
if (mysqlconn.State == ConnectionState.Closed) { mysqlconn.Open(); }
return mysqlconn;
}
#endregion #region sqlserver 数据库连接
/// <summary>
/// sqlserver 数据库连接
/// </summary>
/// <returns></returns>
public static IDbConnection SqlServerConn()
{
string sqlserverconnstring = connstr;
var sqlconn = new SqlConnection(sqlserverconnstring);
if (sqlconn.State == ConnectionState.Closed) { sqlconn.Open(); }
return sqlconn;
}
#endregion
  • 创建DapperDBContext 类。
//必须引用
using System.Data;
using System.Diagnostics;
using Newtonsoft.Json;
using Dapper;
using System.Text; namespace myDappers.DbOption
{
public static class DapperDBContext
{
#region 1.执行操作
/// <summary>
/// 1.执行操作
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <param name="commandType"></param>
/// <param name="databaseOption"></param>
/// <returns></returns>
public static int Execute(string sql, object param = null,
IDbTransaction transaction = null, int? commandTimeout = null,
CommandType? commandType = null, int databaseOption = 1)
{
using (var conn = ConnectionFactory.MysqlConn())
{
var info = "SQL语句:" + sql + " \n SQL参数: " + JsonConvert.SerializeObject(param) + " \n";
// LogHelper.ErrorLog(info); // 可以记录操作
var sw = new Stopwatch();
sw.Start();
var result = conn.Execute(sql, param, transaction, commandTimeout, commandType);
sw.Stop();
//LogHelper.ErrorLog(info + "耗时:" + sw.ElapsedMilliseconds + (sw.ElapsedMilliseconds > 1000 ? "#####" : string.Empty) + "\n"); // 可以记录操作
return result;
}
}
#endregion #region 2.返回集合查询
/// <summary>
/// 2.返回集合查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <param name="commandType"></param>
/// <returns></returns>
public static IEnumerable<T> Query<T>(string sql, object param = null,
IDbTransaction transaction = null, int? commandTimeout = null,
CommandType? commandType = null)
{
using (var conn = ConnectionFactory.MysqlConn())
{
var info = "SQL语句:" + sql + " \n SQL参数: " + JsonConvert.SerializeObject(param) + " \n";
//// LogHelper.Info(info);// 可以记录操作
var sw = new Stopwatch();
sw.Start();
var restult = conn.Query<T>(sql, param, transaction);
sw.Stop();
//// LogHelper.Info(info + "耗时:" + sw.ElapsedMilliseconds + (sw.ElapsedMilliseconds > 1000 ? "#####" : string.Empty) + "\n");// 可以记录操作
return restult;
}
}
#endregion #region 3.批量操作
/// <summary>
/// 3.批量操作
/// </summary>
/// <param name="command"></param>
/// <param name="databaseOption"></param>
/// <returns></returns>
public static int Execute(CommandDefinition command, int databaseOption = 1)
{
using (var conn = ConnectionFactory.MysqlConn())
{
var info = " SQL语句:" + command.CommandText + " \n SQL命令类型: " + command.CommandType + " \n";
// LogHelper.Info(info);// 可以记录操作
var sw = new Stopwatch();
sw.Start();
var restult = conn.Execute(command);
sw.Stop();
// LogHelper.Info(info + "耗时:" + sw.ElapsedMilliseconds + (sw.ElapsedMilliseconds > 1000 ? "#####" : string.Empty) + "\n");// 可以记录操作
return restult;
}
}
#endregion #region 4.多表操作--事务
/// <summary>
/// 4.多表操作--事务
/// </summary>
/// <param name="trans"></param>
/// <param name="databaseOption"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
public static Tuple<bool, string> ExecuteTransaction(List<Tuple<string, object>> trans,
int databaseOption = 1, int? commandTimeout = null)
{
if (!trans.Any()) return new Tuple<bool, string>(false, "执行事务的sql语句不能为空");
using (var conn = ConnectionFactory.MysqlConn())
{
//开始事务
using (var transaction = conn.BeginTransaction())
{
try
{
var sb = new StringBuilder("执行事务");
foreach (var tran in trans)
{
sb.Append("SQL语句:" + tran.Item1 + " \n SQL参数: " + JsonConvert.SerializeObject(tran.Item2) + " \n");
// 根据业务添加纪录日志 LogHelper.InfoLog("SQL语句:" + tran.Item1 + " \n SQL参数: " + JsonConvert.SerializeObject(tran.Item2) + " \n");
//执行事务
conn.Execute(tran.Item1, tran.Item2, transaction, commandTimeout);
}
var sw = new Stopwatch();
sw.Start();
//提交事务
transaction.Commit();
sw.Stop();
// 根据业务添加纪录日志 LogHelper.InfoLog(sb.ToString() + "耗时:" + sw.ElapsedMilliseconds + (sw.ElapsedMilliseconds > 1000 ?
// "#####" : string.Empty) + "\n");
return new Tuple<bool, string>(true, string.Empty);
}
catch (Exception ex)
{
//todo:!!!transaction rollback can not work.
//LogHelper.ErrorLog(ex);
//回滚事务
transaction.Rollback();
conn.Close();
conn.Dispose();
return new Tuple<bool, string>(false, ex.ToString());
}
finally
{
conn.Close();
conn.Dispose();
}
}
}
}
#endregion #region 5.执行一个返回多个结果集的命令,并依次访问每个结果集
public static Dapper.SqlMapper.GridReader QueryMultiple(string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
int databaseOption = 1)
{
var conn = ConnectionFactory.MysqlConn();
var sw = new Stopwatch();
sw.Start();
try
{
// 因为using 的作用域之后,连接自动关闭,
//这里需要说明的是,在数据读取完毕之后,不再需要SqlDataReader时,必须将其进行手动关闭
var restult = conn.QueryMultiple(sql, param, transaction, commandTimeout, commandType);
sw.Stop();
return restult;
}
catch (Exception ex)
{
//LogHelper.ErrorLog(ex.ToString());
throw new Exception(ex.ToString());
}
}
#endregion
}
}

6.添加实体类

/// <summary>
/// 图书类型表
/// </summary>
public class sys_Book_Type
{
[Description("书籍的主键")]
public string book_Type_id { get; set; }
[Description("书籍的类型名称")]
public string book_Type_Name { get; set; }
[Description("书籍类型的描述")]
public string book_Type_Des { get; set; }
[Description("书籍类型的创建时间")]
public DateTime create_Time { get; set; }
public List<sys_Borrow_Book> books { get; set; }
}
/// <summary>
/// 图书借阅表
/// </summary>
public class sys_Borrow_Book
{
[Description("借书表主键")]
public string book_Id { get; set; }
[Description("借书编号")]
public string book_Num { get; set; }
[Description("借书名称")]
public string book_Name { get; set; }
[Description("借书描述")]
public string book_Desc { get; set; }
[Description("借书时间")]
public DateTime borow_Time { get; set; }
[Description("书籍类型主键")]
public string book_Type_id { get; set; }
[Description("借书人")]
public string user_Id { get; set; }
[Description("用户表")]
public sys_Borrow_User borrow_users { get; set; }
[Description("图书类型")]
public sys_Book_Type borrow_types { get; set; }
}
/// <summary>
/// 用户表
/// </summary>
public class sys_Borrow_User
{
[Description("用户主键")]
public string user_id { get; set; }
[Description("登录名称")]
public string u_id { get; set; }
[Description("登录密码")]
public string u_password { get; set; }
[Description("性别")]
public string gender { get; set; }
[Description("姓名")]
public string user_name { get; set; }
[Description("创建时间")]
public DateTime creation_time { get; set; }
[Description("状态")]
public string status { get; set; }
}

.net Dapper 实践系列(1) ---项目搭建(Layui+Ajax+Dapper+MySQL)的更多相关文章

  1. .net Dapper 实践系列(6) ---事务删除(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 实现步骤 写在最后 写在前面 上一小节,总结了事务多表更新的两种方法.一个是只更新原来的数据,一个是先删除原来的数据再往里面添加新的数据.而这一小节,说的是事务的多表删除. 实现步骤 ...

  2. .net Dapper 实践系列(2) ---事务添加(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 问题描述 解决方法 具体实现 写在前面 前面我们已经搭建好了项目,这一小节我们使用Dapper 中的事务实现一对多的添加操作. 问题描述 在做添加的时候很头疼需要从页面传递一组数据到后 ...

  3. .net Dapper 实践系列(4) ---数据查询(Layui+Ajax+Dapper+MySQL)

    写在前面 上一小节,总结了数据显示时,会出现的日期问题.以及如何处理格式化日期.这个小节,主要总结的是使用Dapper 中的QueryMultiple方法依次显示查询多表的数据. 实践步骤 1.在Bo ...

  4. .net Dapper 实践系列(5) ---事务编辑(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 实践步骤 写在前面 上一小节,我们总结了根据Id查询多表数据,最后返回Json对象给前台的例子.接下来,在这一小节我们要实现多表编辑的操作. 实践步骤 因为上一小节以及创建了Edit视 ...

  5. Vue.js系列之项目搭建

    项目搭建具体步骤如下: 1.安装node (中)https://nodejs.org/zh-cn/ (英)https://nodejs.org/en/ 2.安装cnpm镜像 (node自带安装了npm ...

  6. Vue.js系列之项目搭建(1)

    项目搭建具体步骤如下: 1.安装node 到官网下载安装,我这里是win7系统. (中)https://nodejs.org/zh-cn/ (英)https://nodejs.org/en/ 2.安装 ...

  7. .net Dapper 实践系列(3) ---数据显示(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 产生问题 解决方案 写在前面 上一小节,我们使用Dapper 里事务实现了一对多关系的添加.这一小节,主要记录如何使用Dapper 实现多表的查询显示. 产生问题 在mvc控制器中查询 ...

  8. Entityframework Code First 系列之项目搭建

    Entityframework(以下简称EF)是微软推出的一个ORM(Object Relational Mapping)框架. 优缺点 优点: 易上手,语法简单,查询容易 更新快,不断补足 缺点: ...

  9. Vue.js系列之项目搭建(vue2.0 + vue-cli + webpack )

    1.安装node node.js环境(npm包管理器) cnpm npm的淘宝镜像 从node.js官网下载并安装node,安装过程很简单,一路“下一步”就可以了(傻瓜式安装).安装完成之后,打开命令 ...

随机推荐

  1. 日常开发中的shell小技巧

    工具推荐 命令行中很方便的代码统计工具---cloc 强大的分屏工具---tmux 最舒服的markdown书写工具---typora markdown图床推荐--七牛云 模拟生成熵(避免暴力手搓键盘 ...

  2. SpringBoot(十四):SpringCloud初步认识

    SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为开发人员提供了一些工具来快速构建分布式系统中的一些常见模式(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线.一 ...

  3. 搭建基于 Anaconda 管理的多用户 JupyterHub 平台

    搭建基于 Anaconda 管理的多用户 JupyterHub 平台 情况:计算工作站放在实验室,多个同学需要接入使用,且需要各自独立的环境,并使用 Jupyter notebook 平台以方便协作. ...

  4. Debian 9安装java与设置环境变量

    安装默认JRE / JDK 先更新软件包索引: apt update 检查是否已安装Java: java -version 如果当前未安装Java,您将看到以下输出: Output-bash: jav ...

  5. dmesg 命令的使用范例

    dmesg 命令的使用范例 ‘dmesg’命令设备故障的诊断是非常重要的.在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息.‘dmesg’命令在多数 ...

  6. SQL 对比,移动累计

    数据对比 两种常用模型 1.对比下一行,判断增长.减少.维持现状 -- 建表 drop table sales create table sales( num int, soc int ); inse ...

  7. MyBatis的CRUD

    MyBatis的增删改查,特点是只要定义接口,不用实现方法,sql语句在xml中配置,非常方便 文件结构 接口UserDao import com.jinke.domain.QueryVo; impo ...

  8. 将pip源设置国内源

    windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip (4)在pip文件夹里面新建一个文件叫做 pip.ini , ...

  9. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器启用https服务申请免费证书

    背景分析 目前想在 web 上使用 HTTPS 的话, 你需要获得一个证书文件, 该证书由一个受浏览器信任的公司所签署. 一旦你获得了它, 你就在你的 web 服务器上指定其所在的位置, 以及与你关联 ...

  10. JAVA中用StopWatch计算代码耗时的方法

    StopWatch翻译过来的意思就是秒表,其作用也就像我们平时使用的秒一样.spring中就有提供这个工具类(org.springframework.util.StopWatch). 日常开发中,经常 ...