跟初学者学习IbatisNet第四篇
这一章我们主要介绍一下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
跟初学者学习IbatisNet第四篇的更多相关文章
- 跟初学者学习IbatisNet第三篇
这一章我们主要介绍一下IbatisNet里面的动态sql语句的运用,比如有时候我们想进行模糊查询,参数是动态加入的.或者要实现top n ,order by ,分页等功能的时候,我们就不得不用动态拼接 ...
- 跟初学者学习IbatisNet第二篇
在上一篇里面我们知道了什么是IbatisNet,并且知道了如何用IbatisNet进行简单的增删改查的操作,在这一篇文章里面我们主要介绍一下IbatisNet操作存储过程. 我们一般把存储过程分为两种 ...
- RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- Egret入门学习日记 --- 第四篇
第四篇(学习篇) 好了,今天继续把昨天的问题解决了. 今天见鬼了. 现在界面又出来了.唯一我动过的地方,应该就是这里: 是的,我点了一下刷新.之后,不管我怎么创建新的EXML文件,放在src目录,还是 ...
- 跟初学者学习IbatisNet第一篇
写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正…………………… 第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的Demo,在后 ...
- R学习笔记 第四篇:函数,分支和循环
变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
- 我们一起学习WCF 第四篇单通讯和双向通讯
前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用 ...
- python学习【第四篇】python函数 (一)
一.函数的介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以 ...
- Python学习【第四篇】用户输入及判断
用户输入: 例1.写一个用户输入密码的小程序,流程如下: 1.用户输入自己的用户名 2.打印"Hello+用户名" #!/usr/bin/env python #name = ra ...
随机推荐
- 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)
在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...
- iOS常用第三方库 -转
转自 http://www.cnblogs.com/jukaiit/p/4956419.html 1.AFNetworking 轻量级的通讯类库,使用非常简单. 下载地址:https://github ...
- props.children 和容器类组件
有一类组件,充当了容器的作用,它定义了一种外层结构形式,然后你可以往里面塞任意的内容.这种结构在实际当中非常常见,例如这种带卡片组件: 组件本身是一个不带任何内容的方形的容器,我可以在用这个组件的时候 ...
- P1984 [SDOI2008]烧水问题
题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...
- AJPFX关于一维数组的声明与初始化
一维数组:可以理解为一列多行.类型相同的数据,其中每个数据被称为数组元素:一维数组的声明方式: type varName[]; 或 type[] varName;(推荐) ...
- H+后台主题UI框架---整理(二)
本篇文章是针对H+后台主题UI框架的整理的第二部分.主要只有一个point.如下: 其代码如下: <div class="ibox float-e-margins"> ...
- xutils3批量上传文件
前几天开发安卓要用到文件批量上传,就是上传图片,视频,文件之类的用到Xutil3框架,用 RequestParams params = new RequestParams(url); params.a ...
- 【HEVC简介】Inter Prediction Tools
参考文献:见<High Efficiency Video Coding (HEVC)>Inter-Picture Prediction in HEVC章节 <HEVC标准介绍.HEV ...
- H3C S5024P交换机 H3C AR28-31路由器命令
H3C S5024P交换机 H3C AR28-31路由器命令 交换机命令 各个视图的切换: 注意命令要在相应的视图下执行 在用户视图下键入quit命令可以断开与交换机的连接.在其它视图中键入quit命 ...
- SQLite - SELECT查询
SQLite - SELECT查询 SQLite SELECT语句用于获取数据从一个SQLite数据库表返回数据结果表的形式.也称为result-sets这些结果表. 语法 SQLite SELECT ...