zoukankan      html  css  js  c++  java
  • 跟初学者学习IbatisNet第四篇

         这一章我们主要介绍一下IbatisNet里面的其它用法主要有以下几点:

         1,如何得到运行时ibatis.net动态生成的SQL语句?

         2,如何获取DbCommand?

         3,如何返回DataTable,DataSet?

         4,批量数据的插入……

    首先看一下获取的sql语句的方法:

     1  public virtual string GetSql(ISqlMapper sqlMap, string stateMentName, object paramObject)
     2         {
     3             string resultsql = string.Empty;
     4             try
     5             {
     6                 IMappedStatement statement = sqlMap.GetMappedStatement(stateMentName);
     7                 if (!sqlMap.IsSessionStarted)
     8                 {
     9                     sqlMap.OpenConnection();
    10                 }
    11                 RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMap.LocalSession);
    12                 resultsql = scope.PreparedStatement.PreparedSql;
    13             }
    14             catch (Exception ex)
    15             {
    16                 resultsql = "获取SQL语句出现异常:" + ex.Message;
    17             }
    18             return resultsql;
    19         }
    代码

     IMappedStatement statement = sqlMapper.GetMappedStatement(statementName); 获取MappedStatement对象

    sqlMap.LocalSession 获取ISqlMapSession

    RequestScope代表一个请求范围内所有的处理数据,例如mapped statement,要执行的IDbCommand,当前的ResultMap和ParameterMap等

    看一下获取DbCommand的方法:

     1 /// <summary>
     2         /// 获取DbCommand
     3         /// </summary>
     4         /// <param name="sqlMapper">ISqlMapper</param>
     5         /// <param name="statementName">statement的id</param>
     6         /// <param name="paramObject">sql语句的参数</param>
     7         /// <returns>DbCommand</returns>
     8         protected virtual IDbCommand GetDbCommand(ISqlMapper sqlMapper, string statementName, object paramObject)
     9         {
    10             IStatement statement = sqlMapper.GetMappedStatement(statementName).Statement;
    11             IMappedStatement mapStatement = sqlMapper.GetMappedStatement(statementName);
    12             ISqlMapSession session = new SqlMapSession(sqlMapper);
    13 
    14             if (sqlMapper.LocalSession != null)
    15             {
    16                 session = sqlMapper.LocalSession;
    17             }
    18             else
    19             {
    20                 session = sqlMapper.OpenConnection();
    21             }
    22 
    23             RequestScope request = statement.Sql.GetRequestScope(mapStatement, paramObject, session);
    24             mapStatement.PreparedCommand.Create(request, session as ISqlMapSession, statement, paramObject);
    25             IDbCommand cmd = session.CreateCommand(CommandType.Text);
    26             cmd.CommandText = request.IDbCommand.CommandText;
    27             return cmd;
    28         }
    代码

    下面我们来看一下如何返回DataTable,DataSet?

     1   /// <summary>
     2         /// 获取全部信息以DataTable的形式返回
     3         /// </summary>
     4         /// <returns>DataTable</returns>
     5         public DataTable GetDatatTable()
     6         {
     7             DataSet ds = new DataSet();
     8             string sql = GetSql(SqlMap, "SelectAllClasses", null);
     9             IDbCommand cmd = GetDbCommand(SqlMap, "SelectAllClasses", null);
    10             cmd.CommandType = CommandType.Text;
    11             cmd.CommandText = sql;
    12             IDbDataAdapter adapter = SqlMap.LocalSession.CreateDataAdapter(cmd);
    13             adapter.Fill(ds);
    14             return ds.Tables[0];
    15         }
    代码

    这个方法大家很熟悉吧,跟ado.net差不多吧。这就是把IDbCommand,sql语句提取出来单独执行一下(自我感觉有点啰嗦);

    下面是另外一种返回DataTable的方法:

     1      /// <summary>
     2         /// 返回DataTable
     3         /// </summary>
     4         /// <param name="sqlMapper">ISqlMapper</param>
     5         /// <param name="statementName">statement的id</param>
     6         /// <param name="paramObject">sql语句的参数</param>
     7         /// <returns>DataTable</returns>
     8         protected virtual DataSet QueryForDataSet(ISqlMapper sqlMapper, string statementName, object paramObject)
     9         {
    10             DataSet ds = new DataSet();
    11             IMappedStatement statement = sqlMapper.GetMappedStatement(statementName);
    12             if (!sqlMapper.IsSessionStarted)
    13             {
    14                 sqlMapper.OpenConnection();
    15             }
    16             RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMapper.LocalSession);
    17 
    18             statement.PreparedCommand.Create(scope, sqlMapper.LocalSession, statement.Statement, paramObject);
    19 
    20             IDbCommand cmd = GetDbCommand(sqlMapper, statementName, paramObject);//SQL text command
    21             sqlMapper.LocalSession.CreateDataAdapter(cmd).Fill(ds);
    22             return ds;
    23         }
    代码

     好了  下面我们来看一下批量插入数据:

    1,首先我们要给实体做好描述

     1 namespace Model
     2 {
     3     [Serializable]
     4     public class Calsses : Entity
     5     {
     6         private int calsses_id;
     7         /// <summary>
     8         /// 班级编号
     9         /// </summary>
    10         [TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
    11         public int Calsses_id
    12         {
    13             get { return calsses_id; }
    14             set { calsses_id = value; }
    15         }
    16         private string classes_name;
    17         /// <summary>
    18         /// 班级名称
    19         /// </summary>
    20         [TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
    21         public string Classes_name
    22         {
    23             get { return classes_name; }
    24             set { classes_name = value; }
    25         }
    26         private string classes_description;
    27         /// <summary>
    28         /// 班级描述
    29         /// </summary>
    30         [TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
    31         public string Classes_description 
    32         {
    33             get { return classes_description; }
    34             set { classes_description = value; }
    35         }
    36     }
    37 }
    代码

    2, 将泛型集合变成DataTable

     1  /// <summary>
     2         /// 将泛型变成DataTable
     3         /// </summary>
     4         /// <typeparam name="T"></typeparam>
     5         /// <param name="listModels">实体集合</param>
     6         /// <returns>转换后的DataTable</returns>
     7         public  DataTable CreateTable<T>(IList<T> listModels) where T : class
     8         {
     9             T model = default(T);
    10             IList<string> listProperties = CreateModelProperty<T>(model);
    11             DataTable dataTable = CreateTable(listProperties);
    12             BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
    13             Type objType = typeof(T);
    14             PropertyInfo[] propInfoArr = objType.GetProperties(bf);
    15             foreach (T itemModel in listModels)
    16             {
    17                 DataRow dataRow = dataTable.NewRow();
    18                 foreach (PropertyInfo item in propInfoArr)
    19                 {
    20                     string propName = item.Name;
    21                     if (listProperties.Contains(propName))
    22                     {
    23                         object value = item.GetValue(itemModel, null);
    24                         dataRow[propName] = value;
    25                     }
    26                 }
    27                 dataTable.Rows.Add(dataRow);
    28             }
    29             return dataTable;
    30         }
    代码

    3,执行插入命令

     1  /// <summary>
     2         /// 执行插入命令
     3         /// </summary>
     4         /// <param name="connStr">sql连接字符串</param>
     5         /// <param name="tableName">表名称</param>
     6         /// <param name="dt">组装好的要批量导入的datatable</param>
     7         /// <returns></returns>
     8         protected virtual bool ExecuteInsertCommand(string connStr, string tableName, DataTable dt)
     9         {
    10             bool flag = false;
    11             try
    12             {
    13                 using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
    14                 {
    15                     using (SqlConnection conn = new SqlConnection(connStr))
    16                     {
    17                         conn.Open();
    18                         using (SqlBulkCopy sbc = new SqlBulkCopy(conn))
    19                         {
    20                             sbc.DestinationTableName = tableName;
    21                             sbc.BatchSize = 50000;
    22                             sbc.BulkCopyTimeout = 180;
    23                             for (int i = 0; i < dt.Columns.Count; i++)
    24                             {
    25                                 sbc.ColumnMappings.Add(dt.Columns[i].ColumnName,i);
    26                             }
    27                             sbc.WriteToServer(dt);
    28                             flag = true;
    29                             scope.Complete();
    30                         }
    31                     }
    32                 }
    33             }
    34             catch (Exception ex)
    35             {
    36                 throw ex;
    37             }
    38             return flag;
    39         }
    代码

    4,外部调用代码

     1  /// <summary>
     2         /// 外部调用的批量插入的代码
     3         /// </summary>
     4         /// <typeparam name="M"></typeparam>
     5         /// <param name="listModels">泛型集合</param>
     6         /// <returns>是否插入成功</returns>
     7         public bool BatchInsert<M>(IList<M> listModels) where M : class
     8         {
     9             bool flag = false;
    10             try
    11             {
    12                 string connStr = SqlMap.DataSource.ConnectionString;
    13                 string tbName = typeof(M).Name;
    14                 DataTable dt = CreateTable<M>(listModels);
    15                 flag = ExecuteInsertCommand(connStr, tbName, dt);
    16             }
    17             catch
    18             {
    19                 flag = false;
    20             }
    21             return flag;
    22         }
    代码

    上面的代码就不一一介绍了,有什么不懂的,可以google,也可以问我。

    下面是我前台调用的代码

     1  public void BindDataTable()
     2         {
     3             // gdv_list.DataSource = service.GetDatatTable();
     4             //gdv_list.DataBind();
     5             gdv_list.DataSource = service.GetDataTableOther();
     6             gdv_list.DataBind();
     7             IList<Calsses> list = new List<Calsses>();
     8             for (int i = 0; i < 5; i++)
     9             {
    10                 Calsses cal = new Calsses();
    11                 cal.Classes_name = "吴庭智初学者课堂" + i.ToString();
    12                 cal.Classes_description = "吴庭智初学者课堂 InatisNet第" + i.ToString() + "";
    13                 list.Add(cal);
    14             }
    15             bool flag = service.InsertAll(list);
    16         }
    代码

    好了,今天就说到这儿吧,下一章主要说一下IbatisNet的缓存机制。希望大家共同思考,共同学习 进步

    源码下载:http://download.csdn.net/detail/woaixiaozhi/5854593

  • 相关阅读:
    用JavaDoc生成项目文档
    thymeleaf参考手册
    转的一个Java基本功
    杂记
    修改Esxi克隆的CentOS的IP地址
    CentOS搭建socket5代理服务器
    CentOS上搭建Nginx + Mono 运行 asp.net
    启动PPT的时候一直配置vs2013的问题解决
    swift 元组
    swift 集合类型(二)
  • 原文地址:https://www.cnblogs.com/woaixiaozhi/p/3229121.html
Copyright © 2011-2022 走看看