iBatis.Net(4):DataMapper API
2011-11-24 21:20
435 查看
在iBatis.Net中,可以通过SqlMapper实例访问DataMapperAPI,其实以前写的都是一些iBatis.Net的概念和一些配置的问题,从这一篇开始,才是真正的精髓,也是我们使用iBatis.NET真正开始完整我们对数据库的任务的开始,这一篇我主要写一些DataMapperAPI,的定义、作用、使用方式,很遗憾,这一篇应该还是不会出现任何实例,因为还没有数据实体类和映射文档,这将会在下一篇写到
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
从方法名就可以看的出来他们要执行的操作,如果您没有使用过iBatis,肯定会疑惑为什么没有一个叫做Select的方法,的确,再我第一次接触他的时候,也这么想,不过如果您能完整的看完这一篇的话,就回觉得这个疑惑其实有点蠢啦,呵呵,谁没有蠢过呢
参数statementName:在映射文件中定义的节点id属性值(下篇详细写到)
参数parameterObject:输入参数,通常是一个实体类
返回值:在Delete和Update方法中,方法返回受影响的行数,如果在映射文件节点Insert中加入了selectKey,就可以产生主键并返回它
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
注意啦,Select来啦,这些方法的实质就是Select,如果我们查询的结果是一行数据,并且在映射文件中定义了与查询结果对应的实体类,那么执行此方法返回的就是一个这个实体类的对象,在实际引用中经常会用到组合的查询操作,那么就可以在程序运行中管理返回对象的类型,我们可以把对象作为第三个参数传递到方法中
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
QueryForObject方法是用来返回一行数据,那么这里的QueryForList就是返回多行结果啦,他返回的是一个实现了IList结构的列表对象,当然也可以是泛型类型的,这样就会省点装箱拆箱的过程啦,参数skipResults,表示从结果行掉过skipResults行后返回,maxResults表示返回的行数(当然,如果结果中根本没超过maxResults行,那么这个参数就失效啦)
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
如果您理解了QueryForList,就不难理解QueryForDictionary,他返回一个实现了IDictionary接口的字典类型,他的key值是由keyProperty指定的,如果我们不需要结果集中存放的是整个对象,而是某一列值,还可以使用valueProperty指定一个值来确定返回结果中的列值
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
可以使用一个Open和一个Close定界一个Connection,或者使用一个using语句块,在这个语句块执行完毕后就会自动调用一个CloseConnection方法
Transaction
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
对数据库的操作,当然少不了对事务的支持啦,当然iBatis.Net也提供给了我们很好的对事务的支持,当然,我们还是可以使用TransactionScope的方式使用事务,这些方法的使用,我觉得就没必要解释了吧,开始,执行,若不成功、抛出异常,则回滚事务,然后进行相应的操作,这就看你要怎么设计啦
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
Insert/Delete/Update
publicobjectInsert(stringstatementName,objectparameterObject);
publicintDelete(stringstatementName,objectparameterObject);
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
publicintUpdate(stringstatementName,objectparameterObject);
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
从方法名就可以看的出来他们要执行的操作,如果您没有使用过iBatis,肯定会疑惑为什么没有一个叫做Select的方法,的确,再我第一次接触他的时候,也这么想,不过如果您能完整的看完这一篇的话,就回觉得这个疑惑其实有点蠢啦,呵呵,谁没有蠢过呢
参数statementName:在映射文件中定义的节点id属性值(下篇详细写到)
参数parameterObject:输入参数,通常是一个实体类
返回值:在Delete和Update方法中,方法返回受影响的行数,如果在映射文件节点Insert中加入了selectKey,就可以产生主键并返回它
QueryForObject
publicobjectQueryForObject(stringstatementName,objectparameterObject);
publicTQueryForObject<T>(stringstatementName,objectparameterObject);
publicTQueryForObject<T>(stringstatementName,objectparameterObject,TinstanceObject);
publicobjectQueryForObject(stringstatementName,objectparameterObject,objectresultObject)
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
注意啦,Select来啦,这些方法的实质就是Select,如果我们查询的结果是一行数据,并且在映射文件中定义了与查询结果对应的实体类,那么执行此方法返回的就是一个这个实体类的对象,在实际引用中经常会用到组合的查询操作,那么就可以在程序运行中管理返回对象的类型,我们可以把对象作为第三个参数传递到方法中
QueryForList
publicIList<T>QueryForList<T>(stringstatementName,objectparameterObject);
publicIListQueryForList(stringstatementName,objectparameterObject);
publicvoidQueryForList<T>(stringstatementName,objectparameterObject,IList<T>resultObject);
publicvoidQueryForList(stringstatementName,objectparameterObject,IListresultObject);
publicIList<T>QueryForList<T>(stringstatementName,objectparameterObject,intskipResults,intmaxResults);
publicIListQueryForList(stringstatementName,objectparameterObject,intskipResults,intmaxResults);
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
QueryForObject方法是用来返回一行数据,那么这里的QueryForList就是返回多行结果啦,他返回的是一个实现了IList结构的列表对象,当然也可以是泛型类型的,这样就会省点装箱拆箱的过程啦,参数skipResults,表示从结果行掉过skipResults行后返回,maxResults表示返回的行数(当然,如果结果中根本没超过maxResults行,那么这个参数就失效啦)
QueryWithRowDelegate
publicIList<T>QueryWithRowDelegate<T>(stringstatementName,objectparameterObject,RowDelegate<T>rowDelegate);
publicIListQueryWithRowDelegate(stringstatementName,objectparameterObject,RowDelegaterowDelegate);
如果我们在我们返回结果集的时候,需要对结果集中的对象进行一些处理,比如类型转换,或者需要过滤到我们定义的某种规则的行,我们就可以使用这个方法,向方法中传递一个RowDelegate委托方法来处理这些事情
QueryForDictionary/QueryForMap
publicIDictionary<K,V>QueryForDictionary<K,V>(stringstatementName,objectparameterObject,stringkeyProperty);
publicIDictionaryQueryForDictionary(stringstatementName,objectparameterObject,stringkeyProperty);
publicIDictionary<K,V>QueryForDictionary<K,V>(stringstatementName,objectparameterObject,stringkeyProperty,stringvalueProperty);
publicIDictionaryQueryForDictionary(stringstatementName,objectparameterObject,stringkeyProperty,stringvalueProperty);
publicIDictionary<K,V>QueryForDictionary<K,V>(stringstatementName,objectparameterObject,stringkeyProperty,stringvalueProperty,DictionaryRowDelegate<K,V>rowDelegate);
publicIDictionaryQueryForMap(stringstatementName,objectparameterObject,stringkeyProperty);
publicIDictionaryQueryForMap(stringstatementName,objectparameterObject,stringkeyProperty,stringvalueProperty);
publicIDictionaryQueryForMapWithRowDelegate(stringstatementName,objectparameterObject,stringkeyProperty,stringvalueProperty,DictionaryRowDelegaterowDelegate);
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
如果您理解了QueryForList,就不难理解QueryForDictionary,他返回一个实现了IDictionary接口的字典类型,他的key值是由keyProperty指定的,如果我们不需要结果集中存放的是整个对象,而是某一列值,还可以使用valueProperty指定一个值来确定返回结果中的列值
Session
在iBatis.Net中,一个会话就是一个Connection和一个Transaction容器,使用一个using语句块打开一个Connectionusing(IDalSessionmySession=sqlMap.OpenConnection())
{
//dosomething
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
Connection
publicISqlMapSessionOpenConnection();
publicISqlMapSessionOpenConnection(stringconnectionString);
publicvoidCloseConnection();
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
可以使用一个Open和一个Close定界一个Connection,或者使用一个using语句块,在这个语句块执行完毕后就会自动调用一个CloseConnection方法
Transaction
publicISqlMapSessionBeginTransaction();
publicISqlMapSessionBeginTransaction(boolopenConnection);
publicISqlMapSessionBeginTransaction(IsolationLevelisolationLevel);
publicISqlMapSessionBeginTransaction(stringconnectionString);
publicISqlMapSessionBeginTransaction(boolopenNewConnection,IsolationLevelisolationLevel);
publicISqlMapSessionBeginTransaction(stringconnectionString,IsolationLevelisolationLevel);
publicISqlMapSessionBeginTransaction(stringconnectionString,boolopenNewConnection,IsolationLevelisolationLevel);
publicvoidCommitTransaction();
publicvoidCommitTransaction(boolcloseConnection);
publicvoidRollBackTransaction();
publicvoidRollBackTransaction(boolcloseConnection);
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
对数据库的操作,当然少不了对事务的支持啦,当然iBatis.Net也提供给了我们很好的对事务的支持,当然,我们还是可以使用TransactionScope的方式使用事务,这些方法的使用,我觉得就没必要解释了吧,开始,执行,若不成功、抛出异常,则回滚事务,然后进行相应的操作,这就看你要怎么设计啦
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- iBatis.Net(4):DataMapper API
- IBatis.Net DataMapper 1.6.1 and DataAccess 1.9.1发布了
- IBatis.Net DataMapper 1.6.2源码解读
- IBatis.Net DataMapper1.6.0 笔记(1)--QuickStart
- iBATIS.NET DataMapper V1.3 Beta and DataAccess V1.7 Beta发布了
- iBATIS.NET DataMapper V1.3 Beta and DataAccess V1.7 Beta发布了
- iBATIS.NET DataMapper V1.3 Beta and DataAccess V1.7 Beta发布了
- iBATIS.NET DataMapper 1.060 and DataAccess 1.9.0 Released[Beta]
- IBatis.Net DataMapper 1.6.1 and DataAccess 1.9.1发布了
- IBatis.Net DataMapper 1.6.1 and DataAccess 1.9.1发布了
- “IBatisNet.DataMapper.Exceptions.DataMapperException”类型的异常在 IBatisNet.DataMapper.dll 中发生,但未在用户代码中进行处
- iBATIS.NET DataMapper 1.0.0 发布了
- IBatis.Net DataMapper 1.6.1 and DataAccess 1.9.1发布了
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件
- iBatis.Net系列(六)-DataMap.xml
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件
- iBatis.Net系列(四) iBatisNet API基础
- iBatis.Net(5):Data Map(了解)
- Manual JSON serialization from DataReader in ASP.NET Web API
- Ibaitsnet源码解读(4)--DataMapper的Cache