zoukankan      html  css  js  c++  java
  • .net Dapper 实践系列(1) ---项目搭建(layui+mvc5+Dapper+MySQL)

    前言


    学习并实践使用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,
    )
    -----------------------------------------
    

    创建项目

    • 打开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>
    

    安装程序包

    • 打开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

    添加插件

    • 在项目中添加一个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。这个小东西在小项目里面体现的不是很明显,但是在大型的项目中可以减少资源的请求。

    添加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 + "  
     SQL参数: " + JsonConvert.SerializeObject(param) + " 
    ";
                    // 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) + "
    "); // 可以记录操作
                    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 + "  
     SQL参数: " + JsonConvert.SerializeObject(param) + " 
    ";
                    ////  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) + "
    ");// 可以记录操作
                    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 + "  
     SQL命令类型: " + command.CommandType + " 
    ";
                    //  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) + "
    ");// 可以记录操作
                    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 + "  
     SQL参数: " + JsonConvert.SerializeObject(tran.Item2) + " 
    ");
                                // 根据业务添加纪录日志 LogHelper.InfoLog("SQL语句:" + tran.Item1 + "  
     SQL参数: " + JsonConvert.SerializeObject(tran.Item2) + " 
    ");
                                //执行事务
                                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) + "
    ");
                            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
        }
    }
    

    添加实体类

    /// <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; }
    }
    
  • 相关阅读:
    Android listview 的应用
    Android 创建自定义布局
    Android Dialog
    android ProgressBar
    Lilac Pwn stack4-stack_pivoting Writeup
    CTFHUB Pwn ret2shellcode Writeup
    Lilac Pwn stack3-rop Writeup
    函数调用过程与栈帧结构
    线性回归及Python实现
    Google Kick Start Round A 2020
  • 原文地址:https://www.cnblogs.com/ZengJiaLin/p/11338250.html
Copyright © 2011-2022 走看看