.net Dapper 实践系列(1) ---项目搭建(Layui+Ajax+Dapper+MySQL)

mac2022-06-30  74

目录

写在前面一、前期准备 1.在MySQL创建数据库2.创建项目3.安装程序包4.添加插件5.添加DbOption文件夹6.添加实体类

写在前面


学习并实践使用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; } }

转载于:https://www.cnblogs.com/ZengJiaLin/p/11338250.html

相关资源:.net core dapper CRUD例子(前段用bootstrap ajax).zip
最新回复(0)