iBatis.net入门指南
情景一 基本标签(insert,update ,select)及属性(parameterClass,resultClass) - 5 -
情景二 子标签(<sql /><include />)及转义处理 - 7 -
情景三 高阶标签(<dynamic />)及属性(resultMap) - 8 -
情景四 储存过程标<procedure/>及属性parameterMap - 10 -


参与人员:
|
作者 |
联系方式 |
|
毛凌志 |
|
发布记录
|
版本 |
日期 |
作者 |
说明 |
|
0.0 |
2009-08-21 |
毛凌志 |
初稿 |
什么是iBatis.net ?
以SQL Mapping为核心,提供基于ado.net之上的一层简单抽象,将数据库中数据映射到领域模型的持久层框架

iBatis.net的原理
新人指路
- 新建工程,添加2个引用文件

- 添加并修改配置3个配置文件

- 根据数据库的表结构及业务设计领域模型(可以手动,或利用codesmith等生成器半自动完成
- 由模板或手动生成SQL Mapping文件(e.g.Account.xml),并根据业务需求撰写sql语句
更详细的使用过程,可参见视频。
iBatis.net的优缺点
|
优点 |
缺点 |
|
|
SQL Mapping金典案例
情景一 基本标签(insert,update ,select)及属性(parameterClass,resultClass)
在iBatis.net原理一节示例了使用ibatis.net进行insert和select操作,下面展示介绍如何具体的进行SqlMapping。
在SqlMapping的配置文件本例中为Account.xml文件中,添加如下的标签段

并将此Account.xml文件的路径加入到sqlmap.config中

在iBatis.net中提供了五种常用的标签如下表示
表1 基本SQL Mapping标签
|
标签 |
说明 |
|
<insert></insert> |
删除sql语句 |
|
<update></update> |
更新sql语句 |
|
<select></select> |
选取sql语句 |
|
<delete></delete> |
删除sql语句 |
|
<procedure></procedure> |
调用储存过程 |
在这些容器标签中有一些常用的属性如下所示
表2 基本SQL Mapping标签属性
|
属性 |
说明 |
|
Id |
用于唯一标识一条sql语句 |
|
resultClass |
用于将sql语句返回的字段和resultClass提定的类进行隐式的自动映射 |
|
parameterClass |
用于指定输入参数的类型,如果输入参数有多个应使用Hashtable或是类进行包装 |
下面是关于这两条SQL语句的调用方法和测试

情景二 子标签(<sql /><include />)及转义处理
在一些复杂的情景中,为了简化SQL的编写工作,ibatis.net提供了一些标签用于简化SQL的编写操作。可以将可复用的sql语句写在<sql></sql>标签中,然后中<select/><insert/><update/><delete/>等标签中使用<include refid="xxx" />进行引用,其中refid属性指向<sql/>子标签的标识id。
如下例中所示

在此例中,我们还使用了了<![CDATA[]]>,主要是在sql语句中有些特殊的字符如<>等,在xml中不能直接使用,因为我们将包含特殊字符的 SQL语句放入XML的CDATA块中
在此例中,通过Hashtable传入了两个参数,下面介绍了程序中是如何调用上面这段代码的

情景三 高阶标签(<dynamic />)及属性(resultMap)
当在进行一些组合查询等需要灵活组装sql的情景时,需要用到dynamic标签。如下所示。

这段代码可以大至翻译为如下的伪代码
Account acc=new Account();
acc.Item="买菜";
if(acc.Item!=null)
sql+="where item like '%"+acc.Item+"%'";
If(acc.Money!=null)
sql+="or Money like '%20%';
this.Response.Write(sql)
表3 <dynamic>元素
|
名称 |
描述 |
|
isEqual |
如果参数相等于值则查询条件有效 |
|
isNotEqual |
如果参数不等于值则查询条件有效 |
|
isGreaterThan |
如果参数大于值则查询条件有效 |
|
isGreaterEqual |
如果参数大于等于值则查询条件有效 |
|
isLessEqual |
如果参数小于值则查询条件有效 |
|
isPropertyAvaiable |
如果参数可用则查询条件有效 |
|
isNotPropertyAvaiable |
如果参数不可用则查询条件有效 |
|
isNull |
如果参数为Null则查询条件有效 |
|
isNotNull |
如果参数不为Null则查询条件有效 |
|
isEmpty |
如果参数为空则查询条件有效 |
|
isNotEmpty |
如果参数不为空则查询条件有效。参数的数据类型为Collection、string时参数不为 NULLo"" |
|
isParameterPresent |
如果参数类为Null则查询条件有效 |
|
isNotParameterPresent |
如果参数类不为Null则查询条件有效 |
在上面的属性中使用了resultMap属性,原先使用resultClass是自动隐式的将sql语句映射出的字段。而resultMap属性用于将select输出的语句进行显示的映射, 如下所示

将sql语句取出数据的字段名名称和领域模型进行一个显示的映射。
情景四 储存过程标<procedure/>及属性parameterMap
在SQL Mapping中专门为储存过程提供了标签,如下所示:

其调用方法是在容器标签中撰写储存过程的名称,此写法适合SQL Server,针对其它数据库的方法参见储存过程调用方法。
注意到在这里我们使用了一个新的属性parameterMap,它的作用是对输入的参数进行显示的映射,之前在情景一中介绍过parameterClass,它和parameterMap类似均是用来对传入sql的参数时行映射,不同的是对parameterClass是隐式映射的,而parameterMap是显示的映射。
注意到,有一个direction属性默认为储存过程的in,可以特别指定用于其它的方式如out或inout等。

在这里我们也使用了resultMap属性,该属性已在情景三中进行了介绍,读者忘了可以再温习一下

关于储存过程的具体的调用方法参见如下的示例,该储存过程的作用是对Accounts表进行分页返回指定页面的记录数和总的记录数。


ISqlMapper接口
当我们执行SQL语句取出需要的数据库,也做了SQL Mapping的映射,最终我们的目的是希望将取出的数据以我们需要的形式(或者说是数据结构)呈现给我们。那么ISqlMapper接口就是来实现这一操作的,如下图所示。

|
方法 |
说明 |
|
QueryForObject<T>(string,object) |
Overloaded. Executes a Sql SELECT statement that returns a single object of the type of the resultObject parameter. |
|
QueryForList<T>(string,object) |
Overloaded. Executes a Sql SELECT statement that returns data to populate a number of result objects. The parameter object is generally used to supply the input data for the WHERE clause parameter(s) of the SELECT statement. |
|
QueryForDictionary<K,V>(string,object,string,string) |
Overloaded. Executes the SQL and retuns all rows selected in a map that is keyed on the property named in the keyProperty parameter. The value at each key will be the value of the property specified in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. |
|
Insert(string,object) |
Executes a Sql INSERT statement. Insert is a bit different from other update methods, as it provides facilities for returning the primary key of the newly inserted row (rather than the effected rows). This functionality is of course optional. The parameter object is generally used to supply the input data for the INSERT values. |
|
Update(string,object) |
Executes a Sql UPDATE statement. Update can also be used for any other update statement type, such as inserts and deletes. Update returns the number of rows effected. The parameter object is generally used to supply the input data for the UPDATE values as well as the WHERE clause parameter(s). |
|
Delete(string,object) |
Executes a Sql DELETE statement. Delete returns the number of rows effected. |
深度私塾
向sql语句中传入多个参数
参见情景二
自动生成键selectkey
在数据库插入一条数据的时候,经常是需要返回插入这条数据的主键。但是数据库供应商之间生成主键的方式都不一样。
有些是预先生成(pre-generate)主键的,如Oracle和PostgreSQL;有些是事后生成(post-generate)主键的,如MySQL和SQL Server。但是不管是哪种方式,我们都可以用iBATIS的节点来获取语句所产生的主键。
Oracle
<insert id="insertProduct-ORACLE" parameterClass="product">
<selectKey resultClass="int" type="pre" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
insert>
SqlServer
<insert id="insertProduct-MS-SQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select @@IDENTITY as value
</selectKey>
</insert>
MySQL
<insert id="insertProduct-MYSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select LAST_INSERT_ID() as value
</selectKey>
</insert>
SQLite
<insert id="Create" parameterClass="Subject">
INSERT INTO SUBJECT
(SubjectName,QuestionCount,IsNowPaper)
VALUES(#SubjectName#,#QuestionCount#,#IsNowPaper#)
<selectKey resultClass="int" type="post" property="SubjectId">
SELECT seq
FROM sqlite_sequence
WHERE (name = 'SUBJECT')
</selectKey>
</insert>
储存过程调用方法
SqlServer
<parameterMap id="pm_ErickPagination" class="System.Collections.Hashtable">
<parameter property="PageSize"/>
<parameter property="CurrentPage"/>
<parameter property="TotalCount" column="TotalCount" direction="Output" />
</parameterMap>
<procedure id="sp_ErickPagination"
parameterMap="pm_ErickPagination"
resultMap="FindAllResult">
ErickPagination
</procedure>
Oracle
<parameterMap id="userParam" class="user">
<parameter property="username"/>
<parameter property="email"/>
</parameterMap>
<procedure id="sendEmail" parameterMap="userParam">
{call sendMail(?,?)}
</procedure>
iBatis.net入门指南的更多相关文章
- Web API 入门指南 - 闲话安全
Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...
- Vue.js 入门指南之“前传”(含sublime text 3 配置)
题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴 ...
- yii2实战教程之新手入门指南-简单博客管理系统
作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...
- 【翻译】Fluent NHibernate介绍和入门指南
英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...
- ASP.NET MVC 5 入门指南汇总
经过前一段时间的翻译和编辑,我们陆续发出12篇ASP.NET MVC 5的入门文章.其中大部分翻译自ASP.NET MVC 5 官方教程,由于本系列文章言简意赅,篇幅适中,从一个web网站示例开始讲解 ...
- 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍
我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...
- 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据
我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...
- 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化
在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...
随机推荐
- android 进程间通信---bind的前世
在分析bind机制之前,我发现已经有一篇文章讲解的非常清晰,并且提出了很多问题. 地址:http://my.oschina.net/keeponmoving/blog/64218 一.Linux系统进 ...
- Windows下HG服务器的搭建
1.环境和所需工具安装 1. 安装python-2.7.9.exe 2. 安装mercurial-3.2.3.win32-py2.7.exe 3. 安装mercurial-3.2.3-x86.msi ...
- Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)
这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...
- Sublime Text3 C++及Java开发环境配置
一.C++开发环境配置 1. 下载MingW 2. 环境变量配置,系统属性->高级设置->环境变量,如果Mingw装在c盘更目录,其它自己思考 (1)PATH 变量值中加入 C:\Min ...
- ASP.NET调用Web Service
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
- 面向对象and类
类和对象: 1.什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例). 2.什么叫对象:睁开眼,你看到的一切的事物都是一个个的对 ...
- D_S 线性结构
线性结构的定义:若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继. 线性结构的特点: 只有一个首结点和尾结点 除首尾结点外,其他结点只有一个直 ...
- Hadoop Shell命令字典(可收藏)
可以带着下面问题来阅读: 1.chmod与chown的区别是什麽?2.cat将路径指定文件的内容输出到哪里?3.cp能否是不同之间复制?4.hdfs如何查看文件大小?5.hdfs如何合并文件?6.如何 ...
- 【温故而知新-Javascript】使用事件
1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...
- 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain
循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,fr ...