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

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

2,如何获取DbCommand?

3,如何返回DataTable,DataSet?

4,批量数据的插入……

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

  public virtual string GetSql(ISqlMapper sqlMap, string stateMentName, object paramObject)
{
string resultsql = string.Empty;
try
{
IMappedStatement statement = sqlMap.GetMappedStatement(stateMentName);
if (!sqlMap.IsSessionStarted)
{
sqlMap.OpenConnection();
}
RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMap.LocalSession);
resultsql = scope.PreparedStatement.PreparedSql;
}
catch (Exception ex)
{
resultsql = "获取SQL语句出现异常:" + ex.Message;
}
return resultsql;
}

代码

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

sqlMap.LocalSession 获取ISqlMapSession

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

看一下获取DbCommand的方法:

 /// <summary>
/// 获取DbCommand
/// </summary>
/// <param name="sqlMapper">ISqlMapper</param>
/// <param name="statementName">statement的id</param>
/// <param name="paramObject">sql语句的参数</param>
/// <returns>DbCommand</returns>
protected virtual IDbCommand GetDbCommand(ISqlMapper sqlMapper, string statementName, object paramObject)
{
IStatement statement = sqlMapper.GetMappedStatement(statementName).Statement;
IMappedStatement mapStatement = sqlMapper.GetMappedStatement(statementName);
ISqlMapSession session = new SqlMapSession(sqlMapper); if (sqlMapper.LocalSession != null)
{
session = sqlMapper.LocalSession;
}
else
{
session = sqlMapper.OpenConnection();
} RequestScope request = statement.Sql.GetRequestScope(mapStatement, paramObject, session);
mapStatement.PreparedCommand.Create(request, session as ISqlMapSession, statement, paramObject);
IDbCommand cmd = session.CreateCommand(CommandType.Text);
cmd.CommandText = request.IDbCommand.CommandText;
return cmd;
}

代码

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

   /// <summary>
/// 获取全部信息以DataTable的形式返回
/// </summary>
/// <returns>DataTable</returns>
public DataTable GetDatatTable()
{
DataSet ds = new DataSet();
string sql = GetSql(SqlMap, "SelectAllClasses", null);
IDbCommand cmd = GetDbCommand(SqlMap, "SelectAllClasses", null);
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
IDbDataAdapter adapter = SqlMap.LocalSession.CreateDataAdapter(cmd);
adapter.Fill(ds);
return ds.Tables[];
}

代码

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

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

      /// <summary>
/// 返回DataTable
/// </summary>
/// <param name="sqlMapper">ISqlMapper</param>
/// <param name="statementName">statement的id</param>
/// <param name="paramObject">sql语句的参数</param>
/// <returns>DataTable</returns>
protected virtual DataSet QueryForDataSet(ISqlMapper sqlMapper, string statementName, object paramObject)
{
DataSet ds = new DataSet();
IMappedStatement statement = sqlMapper.GetMappedStatement(statementName);
if (!sqlMapper.IsSessionStarted)
{
sqlMapper.OpenConnection();
}
RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMapper.LocalSession); statement.PreparedCommand.Create(scope, sqlMapper.LocalSession, statement.Statement, paramObject); IDbCommand cmd = GetDbCommand(sqlMapper, statementName, paramObject);//SQL text command
sqlMapper.LocalSession.CreateDataAdapter(cmd).Fill(ds);
return ds;
}

代码

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

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

 namespace Model
{
[Serializable]
public class Calsses : Entity
{
private int calsses_id;
/// <summary>
/// 班级编号
/// </summary>
[TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
public int Calsses_id
{
get { return calsses_id; }
set { calsses_id = value; }
}
private string classes_name;
/// <summary>
/// 班级名称
/// </summary>
[TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
public string Classes_name
{
get { return classes_name; }
set { classes_name = value; }
}
private string classes_description;
/// <summary>
/// 班级描述
/// </summary>
[TableColumnAttribute(Description = "该属性是真实表所对应的列名")]
public string Classes_description
{
get { return classes_description; }
set { classes_description = value; }
}
}
}

代码

2, 将泛型集合变成DataTable

  /// <summary>
/// 将泛型变成DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listModels">实体集合</param>
/// <returns>转换后的DataTable</returns>
public DataTable CreateTable<T>(IList<T> listModels) where T : class
{
T model = default(T);
IList<string> listProperties = CreateModelProperty<T>(model);
DataTable dataTable = CreateTable(listProperties);
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
Type objType = typeof(T);
PropertyInfo[] propInfoArr = objType.GetProperties(bf);
foreach (T itemModel in listModels)
{
DataRow dataRow = dataTable.NewRow();
foreach (PropertyInfo item in propInfoArr)
{
string propName = item.Name;
if (listProperties.Contains(propName))
{
object value = item.GetValue(itemModel, null);
dataRow[propName] = value;
}
}
dataTable.Rows.Add(dataRow);
}
return dataTable;
}

代码

3,执行插入命令

  /// <summary>
/// 执行插入命令
/// </summary>
/// <param name="connStr">sql连接字符串</param>
/// <param name="tableName">表名称</param>
/// <param name="dt">组装好的要批量导入的datatable</param>
/// <returns></returns>
protected virtual bool ExecuteInsertCommand(string connStr, string tableName, DataTable dt)
{
bool flag = false;
try
{
using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlBulkCopy sbc = new SqlBulkCopy(conn))
{
sbc.DestinationTableName = tableName;
sbc.BatchSize = ;
sbc.BulkCopyTimeout = ;
for (int i = ; i < dt.Columns.Count; i++)
{
sbc.ColumnMappings.Add(dt.Columns[i].ColumnName,i);
}
sbc.WriteToServer(dt);
flag = true;
scope.Complete();
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return flag;
}

代码

4,外部调用代码

  /// <summary>
/// 外部调用的批量插入的代码
/// </summary>
/// <typeparam name="M"></typeparam>
/// <param name="listModels">泛型集合</param>
/// <returns>是否插入成功</returns>
public bool BatchInsert<M>(IList<M> listModels) where M : class
{
bool flag = false;
try
{
string connStr = SqlMap.DataSource.ConnectionString;
string tbName = typeof(M).Name;
DataTable dt = CreateTable<M>(listModels);
flag = ExecuteInsertCommand(connStr, tbName, dt);
}
catch
{
flag = false;
}
return flag;
}

代码

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

下面是我前台调用的代码

  public void BindDataTable()
{
// gdv_list.DataSource = service.GetDatatTable();
//gdv_list.DataBind();
gdv_list.DataSource = service.GetDataTableOther();
gdv_list.DataBind();
IList<Calsses> list = new List<Calsses>();
for (int i = ; i < ; i++)
{
Calsses cal = new Calsses();
cal.Classes_name = "吴庭智初学者课堂" + i.ToString();
cal.Classes_description = "吴庭智初学者课堂 InatisNet第" + i.ToString() + "章";
list.Add(cal);
}
bool flag = service.InsertAll(list);
}

代码

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

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

最新文章

  1. 项目总结---- imageLoder 的2个Bug解决方法、1.9.4如何选择性删除disk缓存和其它一些错误。
  2. Runtime实战之定制TabBarItem大小
  3. python基础:算法是什么
  4. IOS UITableView移除底部空白行
  5. 封装、调用ajax
  6. 【有人@我】Android中高亮变色显示文本中的关键字
  7. input 获取当前id,name
  8. iis 应用程序池看不到 .net framework 4.0
  9. 【HDU 2222】Keywords Search AC自动机模板题
  10. Swift学习笔记十一
  11. 187. Repeated DNA Sequences
  12. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】
  13. java+eclipse+tomcat+mysql+jdbc——完美配置攻略
  14. 10.25 noip模拟试题
  15. ios 键盘弹起
  16. emacs快捷键学习(一)--Linux最强大的编辑器
  17. 蓝桥杯-马虎的算式-java
  18. 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
  19. 1.使用脚本控制模型的移动 --《Unity 3D 游戏开发》笔记
  20. CentOS 安装、配置supervisord

热门文章

  1. Jmeter之聚合报告
  2. C. Jon Snow and his Favourite Number DP + 注意数值大小
  3. poj3204Ikki&#39;s Story I - Road Reconstruction(最大流求割边)
  4. maven编译报错 -source 1.5 中不支持 lambda(或diamond) 表达式,编码 UTF-8 的不可映射字符
  5. Spring-bean(二)
  6. java8的lambda表达式,将List&lt;DTO&gt; 转为 List&lt;DO&gt;
  7. Kali部署openvas初探与实践
  8. 在Oracle用SQL处理以 System.currentTimeMillis
  9. TebsorFlow低阶API(五)—— 保存和恢复
  10. // mounted: {}, 原来是 空方法 导致了 vue 的警告 !| [Vue warn]: Error in mounted hook: &quot;TypeError: handlers[i].call is not a function&quot;