http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html

<?xml version="1.0" encoding="UTF-8"?>
<sqlMap namespace="Product" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SqlMap.xsd">
<alias>
<typeAlias alias="Product" type="NPetshop.Domain.Catalog.Product, NPetshop.Domain"/>
</alias>
<cacheModels>
<cacheModel id="ProductList-cache" implementation="MEMORY">
<flushInterval hours=""/>
<property name="Type" value="Weak"/>
</cacheModel>
</cacheModels>
<resultMaps>
<resultMap id="ProductResult" class="Product">
<result property="Id" column="Product_Id"/>
<result property="Name" column="Product_Name"/>
<result property="Description" column="Product_Description"/>
</resultMap>
<resultMap id="ProductList" class="Product" extends="ProductResult">
<result property="Category" resultMapping="Category.CategoryResult"/>
</resultMap>
</resultMaps>
<!-- =============================================
MAPPED STATEMENTS
=============================================
-->
<statements>
<select id="GetProductListByCategory" cacheModel="ProductList-cache" resultMap="ProductList" parameterClass="string">
select
Product_Id,
Product_Name,
Product_Description,
P.Category_Id,
Category_Name,
Category_Description
from Products as P, Categories as C
where C.Category_ID= P.Category_ID and
P.Category_Id = #value#
</select>
<select id="GetProduct" resultMap="ProductResult" parameterClass="string">
select
Product_Id,
Product_Name,
Product_Description
from Products
where Product_Id = #value#
</select>
<select id="SearchProductList" resultMap="ProductResult">
select
Product_Id,
Product_Name,
Product_Description
from Products
<dynamic prepend="WHERE">
<iterate property="KeywordList" open="" close="" conjunction="OR">
lower(Product_Name) like #KeywordList[]# OR lower(Category_ID) like #KeywordList[]# OR lower(Product_Description) like #KeywordList[]#
</iterate>
</dynamic>
</select>
</statements>
</sqlMap>

type:缓存的类型,iBatis.Net中有4种类型,分别为MEMORY、LRU、FIFO、OSCACHE。

其中MEMORY是内存缓存,LRU是使用最近最少使用策略,FIFO是使用先进先出策略,OSCACHE是通过第三方的缓存插件来实现。

id:是cacheModel的一个标识,标识该缓存的名字,供后面设置使用。

readOnly:指缓存的数据对象是只读还是可读写,默认为"true",即只读,这里的只读并不是意味着数据对象一旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要需重新从数据库读取数据,构造新的数据对象。而readOnly="false"则意味着缓存中的数据对象可更新。

serialize:是否从缓存中读取同一个对象,还是对象的副本。该参数只有在readOnly为false的情况下才有效, 因为缓存是只读的,那么为不同会话返回的对象肯定是一个,只有在缓存是可读写的时候,才需要为每个会话返回对象的副本。

flushInterval:指定缓存自动刷新的时间,可以为hours、minutes、seconds和milliseconds。需要注意的是,这个间隔时间不是时间到了,在缓存里的信息会自动刷新,而是在间隔时间过后,下次查询将不会从缓存中去取值,而会用SQL去查询,同时将查询的结果更新缓存的值。

flushOnExecute:指定在发生哪些操作时,更新缓存。

property:针对cacheModel的额外的一些属性配置,不同type的cacheModel将会有自己专有的一些property配置,如:

FIFO: <property name="CacheSize" value="100" />

LRU: <property name="CacheSize" value="100" />

MEMORY: <property name="Type" value="WEAK" />

3 语句配置

语句配置(Mapped Statements):顾名思义就是映射的语句声明。它是XML数据映射文件的核心,在iBatis.Net框架中真正和数据库打交道的被执行的SQL语句(或存储过程)都必须在这里被显式声明。语句配置可以包含有:statement、select、insert、update、delete和procedure这6种不同的语句类型。其中statement可以包含所有类型的SQL语句(存储过程),它是一个泛泛的语句配置,没特别明确的职责,相反,其它5种类型的语句配置就是专门负责各种不同的SQL语句。下面这张表列出了各种类型的语句的不同职责和调用方法。

Statement类型

属性

子元素

方法

<statement>

id

parameterClass

resultClass

parameterMap

resultMap

cacheModel

所有动态元素

insert

update

delete

所有的查询方法

<insert>

id

parameterClass

parameterMap

所有的动态元素

<selectKey>

insert

update

delete

<update>

id

parameterClass

parameterMap

所有的动态元素

insert

update

delete

<delete>

id

parameterClass

parameterMap

所有的动态元素

insert

update

delete

<select>

id

parameterClass

resultClass

parameterMap

resultMap

cacheModel

所有的动态元素

所有的查询方法

<procedure>

id

parameterClass

resultClass

parameterMap

resultMap

所有的动态元素

insert

update

delete

所有的查询方法

4 特殊配置

4.1 XML转义字符

很多时候在SQL语句中会用到大于或者下于符号(即:><),这个时候就与XML规范相冲突,影响XML映射文件的合法性。通过加入CDATA节点来避免这种情况的发生,如:

<statement id="SelectPersonsByAge" parameterClass="int" resultClass="Person">

<![CDATA[

SELECT * FROM PERSON WHERE AGE > #value#

]]>

</statement>

4.2自动生成主键

目前很多数据库都支持为新插入的记录自动生成主键,Oracle也提供这种功能,通过序列加触发器来解决。这当然很方便,但是当希望在插入一条记录后立即获得该记录的主键值,问题就出现了,因为很可能为此不得不新写一条语句去获取该主键值。iBatis.Net提供了一种比较好的解决方式。通过在XML数据映射文件中的<selectKey>元素来获取这些自动生成的主键值并将其保存在对象中。

如上面的"添加"操作配置信息修改为:

<insert id="InsertSysuser" parameterClass="Sysuser">

<selectKey resultClass="int32" property="Userid" type="pre">

SELECT DEAN.SEQ_SYSUSER_USERID.NEXTVAL AS Userid FROM DUAL

</selectKey>

INSERT INTO DEAN.SYSUSER (USERID,PASSWORD,LOGINNAME,SEX,BIRTHDAY,IDCARD,OFFICEPHONE,FAMILYPHONE,MOBILEPHONE,EMAIL,ADDRESS,ZIPCODE,REMARK,STATUS)

VALUES (#Userid#,#Password#,#Loginname#,#Sex#,#Birthday#,#Idcard#,#Officephone#,#Familyphone#,#Mobilephone#,#Email#,#Address#,#Zipcode#,#Remark#,#Status#)

</insert>

粗体部分为新加的selectKey节点。#Userid#参数将使用节点中从序列里选出的值进行填充。修改调用的代码:

ISqlMapper mapper = Mapper.Instance(); //得到ISqlMapper实例

Int32 result = (Int32)mapper.Insert("SysuserMap.InsertSysuser", model);//调用Insert方法

Label1.Text = "添加用户成功,result返回UserID为" + Convert.ToString(result) + ",Sysuser实例model的UserID为" + Convert.ToString(model.Userid);

运行程序,这样result就得到想要获取的键值,同时Sysuser的实例化对象model的UserID属性也返回了该条新记录的键值。

4.3 #与$的选择

在XML数据映射文件中,参数用#号来表示。如前面提到的#Userid#,同时也可以使用$来标识。两者有什么区别,以及如何选择呢?

(1)#是把传入的数据当作参数,如 order by #field# ,如果#field#传入的值是字符型,传入值为id, 则sql语句会生成order by "id",很明显生成的sql语句提交给数据库执行会报错。#参数往往用在需传入实际变量值的情况,如where id=#id#,变量#id#传入10,则sql语句会生成where id=10。

(2)$采用拼接方式生成sql语句,即传入的数据直接生成在sql语句里,如 order by $field$,如$field$传入的是id,则sql语句会生成order by id。$参数方式一般用于传入数据库对象。例如传入表名。不过要特别提醒,因为使用该参数是直接组成sql语句,所以需注意防止sql注入。

4.4 LIKE语句处理

在查询处理过程中,模糊查询经常会用到。iBatis如何处理这种模糊查询呢?处理Like模糊查询iBatis提供以下两种方法:

(1)使用#参数: 配置如Where UserName Like #param#||'%', 采用参数传递的方式,如#param#传入字符d,生成的sql语句为Where UserName Like 'd%',其他模糊情况同理可以相应配置出来。

(2)使用$参数:配置如Where UserName Like '$param$%' ,采用字符串替换,就是用参数的值替换param,如$param$传入字符d,也可以生成相同的语句。

$方式会引起sql注入风险,实际的使用中,建议大家都使用第一种配置方式来处理LIKE模糊查询。

5 结语

以上程序在Windows7(64位)+VS2012+Oracle 11g(64位)上测试通过。

【ibatis】cachemodel、属性 及特殊配置的更多相关文章

  1. iBATIS缓存cacheModel属性浅析

    iBATIS缓存cacheModel属性的应用使得在Mapped Statement中缓存常用的数据,那么本文将会给你介绍iBATIS缓存cacheModel属性的信息. AD:2013云计算架构师峰 ...

  2. 22Spring_JdbcTemplatem模板工具类的使用——使用外部属性文件来配置(properties)

    前一篇文章写得是xml文件来配置数据库连接的.但是为了方便,我们实际中采用的是properties文件的方式来配置数据库的.修改properties 文件 会比 修改 xml文件 方便. 做法是: 将 ...

  3. 8 -- 深入使用Spring -- 1...4 属性占位符配置器

    8.1.4 属性占位符配置器 PropertyPlaceholderConfigurer 是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的 ...

  4. Opencv2.4.9+win7+VS2012一次性配置的方法--通过建立属性表永久配置

    Opencv的配置对于初学者很麻烦,网上的教程也非常多,针对不同的操作系统.opencv版本.Visual studio版本都有相应的教程,但即便是按照教程一步一步来,仍然难免出错,很多教程还是一次性 ...

  5. js语言评价--js 基于哈希表、原型链、作用域、属性类型可配置的多范式编程语言

    js 基于哈希表.原型链.作用域.属性类型可配置的多范式编程语言 值类型.引用类型.直接赋值: 原型是以对象形式存在的类型信息. ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值,对 ...

  6. Vue基础二之全局API、实例属性和全局配置,以及组件进阶(mixins)的详细教程(案列实现,详细图解,附源码)

    本篇文章主要是写Vue.directive().Vue.use()等常用全局API的使用,vm.$props.vm.$options.vm.$slots等实例属性的使用,以及Vue全局配置.组件的mi ...

  7. Intent的属性及Intent-filter配置——Data、Type属性与intent-filter配置

    Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示: content://com.android.contacts/co ...

  8. Intent的属性及Intent-filter配置——指定Action、Category调用系统Activity

    Intent代表了启动某个程序组件的“意图”,实际上Intent对象不仅可以启动本应用内程序组件,也可启动Android系统的其他应用的程序组件,包括系统自带的程序组件——只要权限允许. 实际上And ...

  9. Intent的属性及Intent-filter配置——Action、Category属性与intent-filter属性

    Intent的Action.Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加列别的信息.通常 ...

随机推荐

  1. markdownpad2 pro注册信息升级 破解版

    注册信息邮箱地址: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2 ...

  2. [原创] CSS总结!! 有关HTML第二篇 !!

    同样是拿xMind写的   明天上传 CSS+DIV 总结   今天只有CSS了 但是首先涉及一下浏览器原理:  还有好多不知道的模块 但是页面的核心模块就这些了:(些许 需要补充 请关照   ) / ...

  3. Linux 命令 - less: LESS IS MORE

    less 程序是为了替换早期 UNIX 中的 more 程序.less 这个名字是对短语 "less is more" 开了个玩笑,该短语是现代派建筑师和设计师们的座右铭. les ...

  4. javascript 笔记——setTimeout的参数问题

    setTimeout("xxx",500) 双引号中的作用域不捕捉局部变量,因此会报错误 如果你需要在双引号中可以在外部定义一个变量 var now; window.onload ...

  5. 使用httpclient发送post请求与get请求

    最近因为项目的要求,需要使用httpclient来发送请求.但是查阅了许多博客,大家发送请求的方法各不相同.原因是因为httpclient的jar包的不同版本,其内部方法也不相同.因此抛开具体用到的j ...

  6. jQuery 日历控件 FullCalendar 初识

    最近有个日程管理的需求,就学习了一下 FullCalendar 控件的一些基本知识,本文不是详细介绍该控件的 API 的文档,而是记录本人使用过程中的一些学习情况. 先看一下效果图  月/周/日视图 ...

  7. mouseover,mouseout,mouseenter,mouseleave的区别

    相信做前端开发的都听说过“冒泡型事件”吧,<JavaScript高级程序设计>第九章有详细的讲述,但是,在学习的时候一知半解,也没详细去理解,导致最近在工作中碰到了问题:有许多 li 标签 ...

  8. COM 学习小记录

    COM组件程序:模块,它可以是 动态连接库(DLL) && 可执行程序(EXE),称为 进程内组件(in-of-process component) && 进程外组件( ...

  9. 什么是MBR?(含图解)

    Mbr位于磁盘的0柱面,0磁头,1扇区. MBR       有三部分构成,主引导程序,硬盘分区表DPT和,硬盘的有效标志55AA.在512个字节的主引导扇区里. 主引导程序占446个字节,dpt占6 ...

  10. android app widget 创建调用周期

    1 ?Android widget 大小问题 2 ?RemoteViewService Android开发历程_15(AppWidget的使用) Appwidget就是手机应用中常常放在桌面(即hom ...