相对Hibernate等ORM实现而言,ibatis的映射配置更为简洁直接,以下是一个典型的配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<!-- 模块配置 -->
<typeAlias alias="user" type="com.itmyhome.User" /> <cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel> <!-- Statement配置 -->
<select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache">
<![CDATA[
select * from user where id = #id#
]]>
</select> <insert id="insertUser" parameterClass="user">
insert into user values(#id#,#name#,#age#)
</insert> <update id="updateUser" parameterClass="user">
update user set name = #name# where id = #id#
</update> </sqlMap>

能够看到,映射文件主要分为两个部分:模块配置和Statement配置

一、模块配置包含:

typeAlias节点:

定义了本映射文件里的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.itmyhome.User"定义了一个别

名"user",这样在本配置文件的其它部分,须要引用"com.itmyhome.User"类时,仅仅需以其别名替代就可以。

cacheModel节点

定义了本映射文件里使用的Cache机制

<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel>

这里声明了一个名为"userCache"的cacheModel,之后能够在Statement声明中对其进行引用

<select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache">

这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel"userCache"进行缓存。

之后假设程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。

cacheModel主要有以下几个配置点:

flushInterval:设定缓存有效期,假设超过此设定值,则将此CacheModel的缓存清空。

size:本CacheModel中最大容纳的数据对象数量。

flushOnExecute:指定执行特定Statement时,将缓存清空。如updateUser操将更

新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际

数据发生偏差,因此必须将缓存清空以避免脏数据的出现。

二、Statement配置

Statement配置包含了数个与SQL Statement相关的节点,分别为:

1)statement

2)insert

3)delete

4)update

5)select

6)procedure

当中,statement最为通用,它能够替代其余的全部节点。除statement之外的节点各自相应了SQL中的

同名操作(procedure相应存储过程).使用statement定义全部操作固然能够达成目标,但缺乏直观性,

建议在实际开发中依据操作目的,各自选用相应的节点名加以申明.一方面,使得配置文件

更加直观,还有一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免配置上的失误。

基本的配置项例如以下:

<statement id="queryUser" parameterClass="java.lang.Integer" resultClass="user">
select * from user where id = #id#
</statement> <select id="getUser" parameterClass="java.lang.String"
resultClass="user" cacheModel="userCache">
<![CDATA[
select * from user where id = #id#
]]>
</select> <insert id="insertUser" parameterClass="user">
insert into user values(#id#,#name#,#age#)
</insert> <update id="updateUser" parameterClass="java.lang.Integer">
update user set name = #name# where id = #id#
</update> <delete id="deleteUser" parameterClass="java.lang.Integer">
delete user where id = #id#
</delete>
參数 描写叙述
parameterClass 參数类.指定了參数的完整类名(包含包路径).
可通过别名避免每次反复书写冗长的类名.
resultClass 结果类.指定结果类型的完整类名(包含包路径)
可通过别名避免每次反复书写冗长的类名.
parameterMap 參数映射,需结合parameterMap节点对映射关系加以定义.
对于存储过程之外的statement而言,建议使用
parameterClass作为參数配置方式,一方面避免了
參数映射配置工,还有一方面其性能表现也更加出色。
resultMap 结果映射,需结合resultMap节点对映射关系加以定义。
cacheModel statement相应的Cache模块。

对于參数定义而言,尽量使用parameterClass,即直接将POJO作为statement的调用參数,

这样在SQL中能够直接将POJO的属性作为參数加以设定,如:

<update id="updateUser" parameterClass="com.itmyhome.User">
alter table user set name = #name# where id = #id#
</update>

这里将com.itmyhome.User类设定为updateUser的參数之后,我们就可以在SQL中通过#name#

对POJO的属性进行引用。例如以下:

set name = #name# where id = #id#

执行期,ibatis将通过调用User对象的getName,getId方法获得相应的參数值,并将其作为SQL的參数。

假设parameterClass中设定的是jdk的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的參数值。

我们也能够将包含了參数数据的Map对象传递给Statement如:

<update id="updateUser" parameterClass="java.util.Map">
update user set name = #name# where id = #id#
</update> Map<String, Object> map = new HashMap<String,Object>();
map.put("id", "1");
map.put("name", "hello");
sqlMap.update("updateUser",map);

这里传入的參数就是一个Map对象,ibatis将以key "id"、"name"从中提取相应的參数值

在SQL中设定參数名时,能够同一时候指定參数类型,如:

update  user set name = #name:VARCHAR# where id = #id:NUMBERIC#

ibatis实战之OR映射的更多相关文章

  1. ibatis实战之插入数据(自动生成主键)

    ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...

  2. ibatis实战之基础环境搭建

    关于ibatis的介绍.优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料. 一.准备工作 1.下载ibatis软件包http://download.csdn.net/de ...

  3. 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL

    4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...

  4. 第十三篇:一点一滴学ibatis(二)映射文件

       首先给出一个常见的映射文件局部模板 <?xml version="1.0" encoding="utf-8" ?><!DOCTYPE s ...

  5. Java实战之02Hibernate-02映射、一级缓存、实体对象状态

    五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...

  6. [原创+实战+钓鱼]setoolkit+映射

    所需工具:setoolkit,花生壳 (此方法主要针对没有服务器,没有空间的攻击者.有服务器或者空间可以直接上传setoolkit的生成源码到服务器或者空间.) 1.setoolkit克隆一个站点 | ...

  7. ibatis实战之一对多关联

    在实际开发中,我们常常遇到关联数据的情况,如User对象拥有若干Book对象 每个Book对象描述了归属于一个User信息,这种情况下,我们应该如何处理? 通过单独的Statement操作固然可以实现 ...

  8. ibatis实战之中的一个对多关联

    在实际开发中,我们经常遇到关联数据的情况,如User对象拥有若干Book对象 每一个Book对象描写叙述了归属于一个User信息,这样的情况下,我们应该怎样处理? 通过单独的Statement操作固然 ...

  9. SpringMVC实战(三种映射处理器)

    1.前言 上一篇博客,简单的介绍了一下SpringMVC的基础知识,这篇博客来说一下SpringMVC中的几种映射处理器机制. 2.三种映射处理器 2.1 BeanNameUrlHandlerMapp ...

随机推荐

  1. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...

  2. Delphi过程函数传递参数的八种方式

    今天一同事问我为什么有些过程函数里面有Var而有些没有,不解,遂到网上百度,得解.快哉,快哉. 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传 ...

  3. cocos2d-x 类大全及其概要

    CCNode 节点类是Cocos2D-x中的主要类,继承自CCObject. 任何需要画在屏幕上的对象都是节点类.最常用的节点类包括场景类(CCScene).布景层类(CCLayer).人物精灵类(C ...

  4. JMX操作ActiveMQ(1)

    我们知道ActiveMQ broker的管理接口是通过JMX方式提供的. 一个简单的访问方式就是通过jconsole,输入 service:jmx:rmi:///jndi/rmi://localhos ...

  5. Centos 5.5 更新网卡驱动 bnx2 version: 2.0.2

    操作系统:CentOS release 5.5 (Final) 故障现象:网卡无故自动down掉,使用service  network restart 重启后没多久又会自动down , 连接数大概在2 ...

  6. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...

  7. poj3140(树的dfs)

    题目链接:http://poj.org/problem?id=3140 题意:给定一棵n棵节点的树,求删去某条边后两个分支的最小差异值. 分析:num[u]表示以u点为根节点的子树的总人数,那么不在该 ...

  8. Java自学资料——线程

    [转]传智播客成都java培训中心学员笔记. 线程: static int MAX_PRIORITY 线程能够具有的最高优先级. static int MIN_PRIORITY 线程能够具有的最低优先 ...

  9. SWT中的GridLayout(转)例子不错

    GridLayout 是一个非常强大的布局管理器,它可以实现很多复杂的布局,名字中暗示它将所有控件放置在类似网格的布局中.^__^GridLayout 有两个构造函数. GridLayout的构造函数 ...

  10. 后台使用oracle前台使用easyui分页机制

    前台easyui 的datagrid中设置分页属性: pagination:true,//显示分页 pagePosition:'bottom',//分页栏位置 both 上下 bottom.top p ...