這一章咱們主要介紹一下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的緩存機制。但願你們共同思考,共同窗習 進步