1ibatis配置

1ibatis实例
相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis是一种"半自动化"的ORM实现。全自动ORM实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行,而ibatis的着力点,则在于POJO与SQL之间的映射关系,也就是说,ibatis并不会为程序员在运行期自动生成SQL执行,具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需要的参数,以及返回的结果字段映射到指定POJO。


ibatis软件包下载:http://ibatis.apache.org采用Apache common_loggin,并结合Apache log4j作为日志输出组件。使用ibatis只需要导入ibatis-2.3.4.726.jar。


ibatis实例配置,一个典型的配置文件sqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver"
value="com.p6spy.engine.spy.P6SpyDriver"/>
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://localhost/sample"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="mypass"/>
<property name="Pool.MaximumActiveConnections"
value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime"
value="120000"/>
<property name="Pool.TimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from
ACCOUNT"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan"
value="1"/>
<property name="Pool.PingConnectionsNotUsedFor"
value="1"/>
</dataSource>
</transactionManager>


<!--导入OR映射文件-->
<sqlMap resource="com/ibatis/sample/User.xml"/>
</sqlMapConfig>


用作实例的POJO:
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
private Set addresses = new HashSet();
/** default constructor */
public User() {
}
public Integer getId
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSex() {
return this.sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}


OR映射文件
与Hibernate不同,ibatis需要人工编写SQL代码,ibatis的映射文件一般采用手动编写。针对上面的POJO类User的映射代码User.xml如下:
<?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.ibatis.sample.User"/>
<select id="getUser"
parameterClass="java.lang.String"
resultClass="user">
<![CDATA[
select
name,
sex
from t_user
where name = #name#
]]>
</select>
<update id="updateUser"
parameterClass="user">
<![CDATA[
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
]]>
</update>
<insert id="insertUser"
parameterClass="user"
>
INSERT INTO t_user (
name,
sex)
VALUES (
#name#,
#sex#
)
</insert>
<delete id="deleteUser"
parameterClass="java.lang.String">
delete from t_user
where id = #value#
</delete>
</sqlMap>
从上面的映射文件可看出,通过<insert>,<delete>,<update>,<select>四个节点,我们分别定义了针对User对象的增,删,改,查操作。我们指定的了对应的SQL语句,以update节点为例:
<update id="updateUser"
parameterClass="user">
<![CDATA[
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
]]>
</update>
ID,指定了操作ID,之后我们可以在代码中通过指定操作id来指定此节点所定义的操作。如:
sqlMap.update("updateUser",user);


parameterClass,指定了操作所需的参数类型,此例中update 操作以com.ibatis.sample.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。
parameterClass="user"中,user为“com.ibatis.sample.User”类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:<typeAlias alias="user" type="com.ibatis.sample.User"/>


<![CDATA[……]]>,通过<![CDATA[……]]>节点,因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大于号和小于号(<>)。幸运的是,解决的办法很简单,只需将包含特殊字符的SQL语句放在XML的CDATA区里面就可以了。


SQL中所需的用户名参数,“#name#”在运行期会由传入的user对象的name
属性填充。#sex#,#id#也是同样。


此例对应的应用级代码如下,其中演示了ibatis SQLMap的基本使用方法:
String resource ="com/ibatis/sample/SqlMapConfig.xml";
Reader reader;
reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlBuilder =new XmlSqlMapClientBuilder();
SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);
//sqlMap系统初始化完毕,开始执行update操作
try{
sqlMap.startTransaction();
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(1));
sqlMap.update("updateUser",user);
sqlMap.commitTransaction();
finally{
sqlMap.endTransaction();
}
其中,SqlMapClient是ibatis运作的核心,所有操作均通过SqlMapClient
实例完成。




**************ibatis的配置文件sqlMapConfig.xml************
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings ⑴
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>


<transactionManager type="JDBC"> ⑵
<dataSource type="SIMPLE"> ⑶
<property name="JDBC.Driver" value="com.p6spy.engine.spy.P6SpyDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/sample"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="mypass"/>
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from
ACCOUNT"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan"
value="1"/>
<property name="Pool.PingConnectionsNotUsedFor"
value="1"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/sample/User.xml"/> ⑷
<sqlMap resource="com/ibatis/sample/Address.xml"/>
</sqlMapConfig>


settings节点
cacheModelsEnabled,是否启用SqlMapClient上的缓存机制,建议设为"true"。


enhancementEnabled,是否针对POJO启用字节码增强机制以提升getter/setter的调用效能,避免使用Java
Reflect所带来的性能开销。同时,这也为Lazy Loading带来了极大的性能提升。建议设为"true"


errorTracingEnabled,是否启用错误日志,在开发期间建议设为"true"以方便调试。


lazyLoadingEnabled,是否启用延迟加载机制,建议设为"true"。


maxRequests,最大并发请求数(Statement并发数)。


maxTransactions,最大并发事务数。


maxSessions 最大Session 数即当前最大允许的并发SqlMapClient数。maxSessions设定必须介于maxTransactions和maxRequests之间,即:
maxTransactions < maxSessions =< maxRequests


useStatementNamespaces 是否使用Statement命名空间。这里的命名空间指的是映射文件中,sqlMap节点
的namespace属性,如在上例中针对t_user表的映射文件sqlMap节点:
<sqlMap namespace="User">
这里,指定了此sqlMap节点下定义的操作均从属于"User"命名空间。
在useStatementNamespaces="true"的情况下,Statement调用需追加命名空间,如:
sqlMap.update("User.updateUser",use
r);
否则直接通过Statement名称调用即可,如:sqlMap.update("updateUser",user);但请注意此时需要保证所有映射文件中,Statement定义无重名。默认它的值为false,所以我们如果使用了名称空间,一定要将它配置为true。


transactionManager节点transactionManager 节点定义了ibatis 的事务管理器,目前提供了以下几种选择:
JDBC,通过传统JDBC Connection.commit/rollback实现事务支持。
JTA,使用容器提供的JTA服务实现全局事务管理。
EXTERNAL,外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制。此时ibatis 将把所有事务委托给外部容器进行管理。
此外,通过Spring 等轻量级容器实现事务的配置化管理也是一个不错的选择。关于结合容器实现事务管理,参见“高级特性”中的描述。


dataSource节点
dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。
type属性: dataSource节点的type属性指定了dataSource的实现类型。可选项目:
SIMPLE:
SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。


DBCP:
基于Apache DBCP 连接池组件实现的DataSource 封装,当无容器提供DataSource 服务时,建议使用该选项,对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。


JNDI:
使用J2EE 容器提供的DataSource 实现,DataSource 将通过指定的JNDI Name 从容器中获取。对应ibatis 实现为:
com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。


dataSource节点的属性:
JDBC.Driver,JDBC 驱动。如:org.gjt.mm.mysql.Driver
JDBC.ConnectionURL,数据库URL。如:jdbc:mysql://localhost/sample
如果用的是SQLServer JDBC Driver,需要在url后追加SelectMethod=Cursor以获得
JDBC事务的多Statement支持。


JDBC.Username,数据库用户名
JDBC.Password,数据库用户密码
Pool.MaximumActiveConnections,数据库连接池可维持的最大容量。
Pool.MaximumIdleConnections,数据库连接池中允许的挂起(idle)连接数。


以上子节点适用于SIMPLE和DBCP模式,分别针对SIMPLE和DBCP模式的DataSource私有配置节点如下:
SIMPLE:
Pool.MaximumCheckoutTime
数据库联接池中,连接被某个任务所允许占用的最大时间,如果超过这个时间限定,连接将被强制收回。(毫秒)


Pool.TimeToWait,当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。此参数设定了线程所允许等待的最长时间。(毫秒)


Pool.PingQuery,数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲状态
时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用。检测语句应该是一个最简化的无逻辑SQL。
如“select 1 from t_user”,如果执行此语句成功,连接池管理器将认为此连接处于可用状态


Pool.PingEnabled,是否允许检测连接状态。


Pool.PingConnectionsOlderThan,对持续连接时间超过设定值(毫秒)的连接进行检测。


Pool.PingConnectionsNotUsedFor,对空闲超过设定值(毫秒)的连接进行检测。


DBCP:
Pool.MaximumWait,当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。此参数设定了线程所允许等待的最长时间。(毫秒)


Pool.ValidationQuery,数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲状态
时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用。检测语句应该是一个最简化的无逻辑SQL。
如“select 1 from t_user”,如果执行此语句成功,连接池管理器将认为此连接处于可用状态


Pool.LogAbandoned,当数据库连接被废弃时,是否打印日志。


Pool.RemoveAbandonedTimeout,数据库连接被废弃的最大超时时间


Pool.RemoveAbandoned,当连接空闲时间超过RemoveAbandonedTimeout时,是否将其废弃。


JNDI由于大部分配置是在应用服务器中进行,因此ibatis中的配置相对简单,下面是分别使用JDBC和JTA事务管理的JDNI配置。
使用JDBC事务管理的JNDI DataSource配置
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource"
value="java:comp/env/jdbc/myDataSource"/>
</dataSource>
</transactionManager>


<transactionManager type="JTA" >
<property name="UserTransaction"
value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI">
<property name="DataSource"
value="java:comp/env/jdbc/myDataSource"/>
</dataSource>
</transactionManager>


sqlMap节点,sqlMap 节点指定了映射文件的位置,配置中可出现多个sqlMap 节点,以指定项目内所包含的所有映射文件。


3OR映射的配置
前面我们书写一个OR映射配置文件User.xml。下面详细其配置。
typeAlias节点:
定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",这样在本配置文件的其他部分,需要引用"com.ibatis.sample.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配置包含了数个与SQL Statement相关的节点,分别为:
statement,insert,delete,update,select,procedure
其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的同名操作(insert对应插入,procedure对应存储过程)。


主要的配置项如下:
statement:
<statement id="statementName"
[parameterClass="some.class.Name"]
[resultClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]
>
select * from t_user where sex = [?|#propertyName#]
order by [$simpleDynamic$]
</statement>


select:
<select id="statementName"
[parameterClass="some.class.Name"]
[resultClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]
>
select * from t_user where sex = [?|#propertyName#]
order by [$simpleDynamic$]
</select>


Insert:
<insert id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
>
insert into t_user
(name,sex)
values
([?|#propertyName#],[?|#propertyName#])
</insert>


Update:
<update id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
>
UPDATE t_user
SET
name=[?|#propertyName#],
sex=[?|#propertyName#]
WHERE id = [?|#propertyName#]
</update>


Delete:
<delete id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
>
delete from t_user
where id = [?|#propertyName#]
</delete>


procedure:
<procedure id="swapAddRoleResource"
[parameterMap]="addRoleResourceMap"
>
{call procedure_name(?,?,?,?)}
</procedure>


其中以“[]”包围的部分为可能出现的配置栏目。
parameterClass 参数类。指定了参数的完整类名(包括包路径)。可通过别名避免每次重复书写冗长的类名。


resultClass 结果类。指定结果类型的完整类名(包括包路径)。可通过别名避免每次重复书写冗长的类名。


parameterMap 参数映射,需结合parameterMap节点对映射关系加以定义。对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现也更加出色。


resultMap 结果映射,需结合resultMap节点对映射关系加以定义。取值为<resultMap>的id。


cacheModel statement对应的Cache模块。


对于参数定义而言,尽量使用parameterClass,即直接将POJO 作为statement 的调用参数,这样在SQL 中可以直接将POJO 的属性作为参数加以设定,如:
<update id="updateUser"
parameterClass="com.ibatis.sample.User">
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
</update>
这里将com.ibatis.sample.User类设定为update statement的参数,之后,我们即可在SQL 中通过#propertyName#对POJO 的属性进行引用。如上例中的:
SET name=#name#, sex=#sex# WHERE id=#id#
运行期,ibatis 将通过调用User 对象的getName、getSex 和getId 方法获得相应的参数值,并将其作为SQL 的参数。


parameterClass取值为Map对象
我们也可以将包含了参数数据的Map对象传递给Statement,如:
<update id="updateUser"
parameterClass="java.util.Map">
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
</update>
这里传入的参数就是一个Map对象,ibatis将以key ”name”、”sex”、”id”从中提取对应的参数值。另外,map的中的元素(比如pojo)是个复杂对象,则还可以在SQL中以#key.pojo属性名#的格式来引用其中内嵌的属性。


********注意传入参数时只能是一个Object(如VO类,Map类,String类等),如果我们要传递多个参数给xml中的statement,需要将参数放进Map或VO类中传递。*******


同样的原理,我们也可以在resultMap中设定返回类型为map。
<select id="getUser"
parameterClass="java.lang.String"
resultClass="java.util.Map">
<![CDATA[
select
id,
name,
sex
from t_user
where id = #id#
]]>
</select>
返回的结果将以各字段名为key保存在Map对象中返回。


对于返回结果而言,如果是select语句,建议也采用resultClass进行定义,如:
<select id="getUser"
parameterClass="java.lang.String"
resultClass="user">
<![CDATA[
select
name,
sex
from t_user
where name = #name#
]]>
</select>
ibatis会自动根据select语句中的字段名,调用对应POJO 的set方法设定属性值,如上例中,ibatis会调用setName,setSex 方法将Select语句返回的数据赋予相应的POJO 实例。
*****************
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们
希望字段映射到POJO时,采用比较易读的属性名,此时,我们可以通过Select
的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为
xingming,对应性别的字段为xingbie):
select
xingming as name,
xingbie as sex
from t_user
where id = #id#
ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而不是setXingming方法)。
*****************


parameterMap和resultMap的配置
parameterMap和resultMap实现了POJO到数据库字段的映射配置,resultMap和parameterMap中的class取值可以为typealias中的id值也可以指定为一个完整类路径名。下面是
一个例子:
<resultMap id="get_user_result" class="user">
<result property="name" column="xingming"
jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="sex" column="xingbie"
jdbcType="int" javaType="java.lang.Integer"/>
<result property="id" column="id"
jdbcType="int" javaType="java.lang.Integer"/>
</resultMap>


<parameterMap id="update_user_para" class="redemption" >
<parameter property="name"
jdbcType="VARCHAR"
javaType="java.lang.String"
nullValue=""
/>
<parameter property="sex"
jdbcType="int"
javaType="java.lang.Integer"
nullValue=""
/>
</parameterMap>
Parameter的nullValue指定了如果参数为空(null)时的默认值。之后我们即可在statement 申明中对其进行引用,如:
<procedure id="getUserList"
resultMap="get_user_result"
>
{call sp_getUserList()}
</procedure>
<procedure id="doUserUpdate"
parameterMap="update_user_para"
>
{call sp_doUserUpdate(#id#,#name#,#sex#)}
</procedure>
一般而言,对于insert、update、delete、select语句,优先采用parameterClass和resultClass。


数据库中返回的数值型字段不要与java中Number类型的属性相对应,否则会报错。




*************************
动态SQL
可以通过使用动态SQL来组织灵活性更大的更通过的SQL。比如:一个动态的where条件
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="corpID">
CORPID=#corpID#
</isNotEmpty>
<isNotEmpty prepend="AND" property="status">
STATUS=#status#
</isNotEmpty>
</dynamic>
当然,prepend表示链接关键字,可以为任何字符串,当为sql关键字时,iBatis自动判断是否应该添加该关键字。
<select id="qryNewsInfoByIndexID" resultMap="IndexNewsResult"
parameterClass="java.util.Map">
<![CDATA[
select *
from (select row_.*, rownum rownum_
from (
SELECT CONTANTID, TITLE, DETAIL, PIC, VIDEO, CREATETIME, TOPVIEW, 
STATUS, USERID, MODULEID, LINKURL, INDEXID, UPDATETIME, VALIDTIME
FROM DGZZ_NEWS_INFO
]]>
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="indexID">
INDEXID=#indexID#
</isNotEmpty>
</dynamic>
      <![CDATA[
ORDER BY UPDATETIME ASC
) row_
where rownum <= #page.endNum#
)
where rownum_ >= #page.startNum#
]]>
</select>


**************************
注意使用了一元条件元素和二元条件元素,则parameterClass的取值需为Map或pojo对象,不能为String,Integer等。
一元条件元素 
一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性: 
prepend - 可以为任何字符串,当为sql关键字时,iBatis自动判断是否应该添加该关键字。


property - 被比较的属性(必选) 


<isPropertyAvailable> 
检查是否存在该属性(存在parameter bean的属性)。 
 
<isNotPropertyAvailable> 
检查是否不存在该属性(不存在parameter bean的属性)。 
 
<isNull> 
检查属性是否为null。 
 
<isNotNull> 
检查属性是否不为null。 
 
<isEmpty> 
检查属性是否为null或空(''或size() > 0)。 
 
<isNotEmpty> 
检查属性是否不为null或不为空(''或size() > 0)。 


例子: 
<isNotEmpty prepend="AND" property="firstName" > 
FIRST_NAME=#firstName# 
</isNotEmpty> 
不一定将<isNotEmpty>,<isNotNull>...放到<dynamic>...</dynamic>中,可以单独使用。
*******************
二元条件元素 
二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。 


二元条件元素的属性: 
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选) 


property - 被比较的属性(必选) 


compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue) 


compareValue - 用于比较的值(必选或选择compareProperty) 


<isEqual> 
 比较属性值和静态值或另一个属性值是否相等。 
 
<isNotEqual> 
 比较属性值和静态值或另一个属性值是否不相等。 
 
<isGreaterThan> 
 比较属性值是否大于静态值或另一个属性值。 
 
<isGreaterEqual> 
 比较属性值是否大于等于静态值或另一个属性值。 
 
<isLessThan> 
 比较属性值是否小于静态值或另一个属性值。 
 
<isLessEqual> 
 比较属性值是否小于等于静态值或另一个属性值。 


例子: 


<isLessEqual prepend=”AND” property=”age” compareValue=”18”> 
ADOLESCENT = ‘TRUE’ 
</isLessEqual> 











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值