構築するための.NET Dapperの練習シリーズ(1)---プロジェクト(Layui +アヤックス+ Dapperの+ MySQLの)

EDITORIAL

学び、この小さなORMフレームワークは一週間の時間を過ごしたDapperのを使って練習します。その理解と親しみを深めるために。だから、私は特定のインスタンスであることをAjaxインタラクションを使用して、データの前後にDapperの背景データとしてデータを操作するために使用し、その後、フォアグラウンドフレームとしてLayuiを使用し、最後のステージにしたいです。これは、開発プロセスの+の一般的な経験をするためにMySQLののLayui +アヤックス+ Dapperのインスタンスを使用します。例えば:マルチテーブルクエリは、私が何をすべきDapperのを使用していますか?どのように多くの追加と編集?MVCどのようにリターンJSON形式の日付のタイムスタンプに対処するには?どのようにシンプルな複雑なJSONオブジェクト.NET MVC受信機のフロントエンド・デリバリーの治療?などが挙げられる。これらの質問は、次の練習の開発プロセスでそれをお答えします。注意:そのプロジェクトのアイデアの実装の唯一の説明を -

まず、準備

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.プロジェクトを作成します。

  • 空のMVCプロジェクトを作成するには、Visual Studioの2013年を開きます。ソリューション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.パッケージをインストールします。

  • > 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.プラグインを追加します。

<!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; }
}

おすすめ

転載: www.cnblogs.com/ZengJiaLin/p/11338250.html