跟初學者學習IbatisNet第四篇

     這一章咱們主要介紹一下IbatisNet裏面的其它用法主要有如下幾點:sql

     1,如何獲得運行時ibatis.net動態生成的SQL語句?緩存

     2,如何獲取DbCommand?session

     3,如何返回DataTable,DataSet?app

     4,批量數據的插入……ide

首先看一下獲取的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對象google

sqlMap.LocalSession 獲取ISqlMapSessionspa

RequestScope表明一個請求範圍內全部的處理數據,例如mapped statement,要執行的IDbCommand,當前的ResultMap和ParameterMap等.net

看一下獲取DbCommand的方法:3d

 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

相關文章
相關標籤/搜索