??xml version="1.0" encoding="utf-8" standalone="yes"?> <select id="selectDispatchedKey" parameterClass="KeyAndKeyFlowInfo" resultMap="KeyAndKeyFlowResult"> <update id="updateKeyFlow" parameterClass="KeyFlowInfo">
属性关键字
含义
<isEqual>
如果参数相等于?/span>
则查询条件有效?/span>
<isNotEqual>
如果参数不等于值则查询条g有效?/span>
<isGreaterThan>
如果参数大于值则查询条g有效?/span>
<isGreaterEqual>
如果参数{于值则查询条g有效?/span>
<isLessEqual>
如果参数于值则查询条g有效。如下所C:
<isLessEqual prepend = ”AND?property = ”age?compareValue = ?8?>
ADOLESCENT = ‘TRUE?/span>
</isLessEqual>
<isPropertyAvailable>
如果参数有用则查询条g有效?/span>
<isNotPropertyAvailable>
如果参数没有使用则查询条件有效?/span>
<isNull>
如果参数为NULL则查询条件有效?/span>
<isNotNull>
如果参数不ؓNULL则查询条件有效?/span>
<isEmpty>
如果参数为空则查询条件有效?/span>
<isNotEmpty>
如果参数不ؓI则查询条g有效
。参数的数据cd?/span>
Collection
?/span>
String
时参C?/span>
NULL
或“”。如下所C:
<isNotEmpty prepend=”AND?property=”firstName?>
FIRST_NAME=#firstName#
</isNotEmpty>
<isParameterPresent>
如果参数cM为NULL
则查询条件有效?/span>
<isNotParameterPresent>
Checks to see if the parameter object is not present (null). Example Usage:
<isNotParameterPresent prepend=”AND?gt;
EMPLOYEE_TYPE = ‘DEFAULT?/span>
</isNotParameterPresent>
Iterate 的属性:
prepend Q?可被覆盖?SQL 语句l成部分Q添加在语句的前面(可选)
property Q?cd?java.util.List 的用于遍历的元素Q必选)
open Q?整个遍历内容体开始的字符Ԍ用于定义括号Q可选)
close Q整个遍历内容体l束的字W串Q用于定义括P可选)
conjunction Q?每次遍历内容之间的字W串Q用于定?AND ?ORQ可选)
遍历cd?java.util.List的元素?
例子Q?
<iterate prepend=”AND?property=”userNameList?
open=??close=??conjunction=”OR?gt;
username=#userNameList[]#
</iterate>
ibatis中如何配|in语句Q需要P代,不能直接用string的写?br /><select id="sql_test" parameterclass="myPramBean" resultclass="myResult">
select *from tablewhere name in
<iterate property="ids" conjunction="," close=")" open="(" />
#value[]#
</iterate>
and code=#code#
</select>
myPramBean
{
private String code;
private List ids;
...
}
eg:
<delete id="member.batchDelete" parameterClass="java.util.List">
DELETE FROM member where id IN
<iterate conjunction="," open="(" close=")" >
#value[]#
</iterate>
</delete>
注意Q?/strong>使用<iterate>Ӟ在List元素名后面包括方括号[]非常重要Q方括号[]?br />对象标记为ListQ以防解析器单地List输出成String?br />
]]>
select distinct
KEY_ID,
USER_ID,
INITIATOR,
INIT_DATE,
INITIATOR_EMAIL,
SGS_KEY.BRANCH_NAME,
APPROVER,
APPROVER_EMAIL,
APPROVE_DATE
from
SGS_KEY,
SGS_KEY_FLOW
where SGS_KEY.APPLY_FLOW_ID=SGS_KEY_FLOW.KEY_FLOW_ID
<dynamicprepend="and" open="(" close=")">
<isNotNull property="ki.userId" prepend="and" removeFirstPrepend="false">
USER_ID = #ki.userId#
</isNotNull>
<isNotNullproperty="kfi.initiator" prepend="and">
INITIATOR = #kfi.initiator#
</isNotNull>
<isNotNullproperty="kfi.initDate" prepend="and">
INIT_DATE = #kfi.initDate#
</isNotNull>
</dynamic>
</select>
update SGS_KEY_FLOW set
<dynamic>
KEY_FLOW_ID =#keyFlowId#
<isNotNull property="branchName" prepend=",">
BRANCH_NAME = #branchName#
</isNotNull>
<isNotEqual property="operation" prepend="," compareProperty="operation" compareValue="0">
OPERATION = #operation#
</isNotEqual>
<isNotNull property="initiator" prepend=",">
INITIATOR = #initiator#
</isNotNull>
<isNotNull property="initiatorEmail" prepend=",">
INITIATOR_EMAIL = #initiatorEmail#
</isNotNull>
<isNotNull property="initDate" prepend=",">
INIT_DATE = #initDate#
</isNotNull>
<isNotNull property="approver" prepend=",">
APPROVER = #approver#
</isNotNull>
<isNotNull property="approverEmail" prepend=",">
APPROVER_EMAIL = #approverEmail#
</isNotNull>
<isNotNull property="approveDate" prepend=",">
APPROVE_DATE = #approveDate#
</isNotNull>
<isNotEqual property="keyNum" prepend="," compareProperty="keyNum" compareValue="0">
KEY_NUM = #keyNum#
</isNotEqual>
<isNotNull property="applyReason" prepend=",">
APPLY_REASON = #applyReason#
</isNotNull>
<isNotNull property="rejectReason" prepend=",">
REJECT_REASON = #rejectReason#
</isNotNull>
</dynamic>
where
KEY_FLOW_ID =#keyFlowId#
</update>
http://203.208.39.132/search?q=cache:c0ebNIxuwRsJ:blog.csdn.net/yangguoqi/archive/2009/04/25/4122824.aspx+isNotNull+removeFirstPrepend&cd=4&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy292qjrM9JyeUS1SW1kaFKLSpEs4-w
目的例子:
<statement id="[customerinfo-lookup]" parameterClass="java.util.Map" resultClass="java.util.HashMap">
<![CDATA[
SELECT A.ROW_ID s_CUSTOMER_ID,A.PERMIT_NO s_PERMIT_NO,A.CUSTOMER_DESC s_CUSTOMER_DESC,A.ADDR s_ADDR,
A.CUSTMGR_ID s_CUSTMGR_ID,B.EMPLOYEE_NAME s_CUSTMGR_NAME,A.MARKET_ORG s_MARKET_ORG,C.DEPT_NAME s_DEPT_NAME
FROM MD_CUSTOMER A LEFT JOIN MD_EMPLOYEE B ON A.CUSTMGR_ID=B.ROW_ID LEFT JOIN MD_DEPT C ON A.MARKET_ORG=C.ROW_ID
WHERE 1=1 AND A.STATUS='1'
]]>
<isNotEmpty prepend="and" property="custmgrID">
<![CDATA[ A.CUSTMGR_ID=#custmgrID# ]]>
</isNotEmpty>
<isNotNull property="filter" removeFirstPrepend="true" prepend="AND" open="(" close=")">
<isNotEmpty prepend="OR" property="filter.m_PERMIT_NO">
<![CDATA[ A.PERMIT_NO LIKE '%$filter.m_PERMIT_NO$%' ]]>
</isNotEmpty>
<isNotEmpty prepend="OR" property="filter.m_CUSTOMER_DESC">
<![CDATA[ A.CUSTOMER_DESC LIKE '%$filter.m_CUSTOMER_DESC$%' ]]>
</isNotEmpty>
<isNotEmpty prepend="OR" property="filter.s_PLACE_NAME">
<![CDATA[ A.ADDR LIKE '%$filter.m_ADDR$%' ]]>
</isNotEmpty>
</isNotNull>
<isNotNull prepend="ORDER BY" property="sort"> <!--排序-->
$sort$
</isNotNull>
</statement>
]]>
<?
xml version="1.0" encoding="UTF-8"
?>
<
Context
path
=""
>
<
Resource
name
="jdbc/pgsqldbcp"
auth
="Container"
type
="javax.sql.DataSource"
factory
="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName
="org.postgresql.Driver"
url
="jdbc:postgresql://localhost/xxxxdb"
username
="postgres"
password
="xxxx"
maxActive
="20"
/>
</
Context
>
q里使用Tomcat带的tomcat-dbcp.jar包,它包含了 commons-collections.jar, commons-pool.jar, commons-dbcp.jarQ如果不使用tomcat-dbcp.jar 则需要将上述3个包拯?Tomcat的lib中。另外把数据库的驱动包拷贝到Tomcat的lib中,可以了?br />
在开发中spring中的dataSource可以按如下Ş式写Q?br /><bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/pgsqldbcp"/>
</bean>
]]>
那么ibatis的SqlMapConfig.xml的配|如?br />
<dataSource type="JNDI">
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory" />
<property name="context.java.naming.provider.url" value="t3://localhost:7001" />
<property name="DataSource" value="TestDatasource" />
</dataSource>
</transactionManager>
<transactionManager type="JTA" >
<property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
注意QUserTransaction属性指向UserTransaction实例所在的JNDI位置。JTA事务理需要它Q以使SQL Map能够参与涉及其他数据库和事务资源的范围更大的事务?img src ="http://www.aygfsteel.com/kyleYang/aggbug/305261.html" width = "1" height = "1" />
]]>
]]>
?/span>hibernatecMQ?/span>Spring 提供?/span>SqlMapClientDaoSupport对象Q我们的DAO可以l承q个c,通过它所提供?/span>SqlMapClientTemplate对象来操U|据库。看hq些概念都与hibernatecM?/span>
通过SqlMapClientTemplate来操U|据库?/span>CRUD是没有问题的Q这里面关键的问题是事务处理?/span>Spring提供了强大的声明式事务处理的功能Q我们已l清?/span>hibernate中如何配|声明式的事务,那么?/span>iBATIS中如何获得声明式事务的能力呢Q?/span>
W一Q我们需要了解的?/span>spring通过AOP来拦截方法的调用Q从而在q些Ҏ上面d声明式事务处理的能力。典型配|如下:applicationContext-common.xml
<!-- 配置事务Ҏ?/span> --> <tx:advice id="txAdvice" transaction-manager="事务理器名U?/span>"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice>
<!-- 配置哪些cȝҎ需要进行事务管?/span> --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.ibatis.manager.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/> </aop:config> |
q些事务都是声明在业务逻辑层的对象上的?/span>
W二Q我们需要一个事务管理器Q对事务q行理?/span>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1/ibatis"/> <property name="username" value="root"/> <property name="password" value="mysql"/> </bean> |
此后Q我们需要让spring来管?/span>SqlMapClient对象Q?/span>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"><value>classpath:sqlMapConfig.xml</value></property> </bean> |
我们?/span>sqlMapConfig.xml可以简写ؓQ?/span>
<?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
lazyLoadingEnabled="true"
useStatementNamespaces="true" />
<!-- 使用spring之后Q数据源的配|移植到?/span>spring上,所?/span>iBATIS本n的配|可以取?/span> -->
<sqlMap resource="com/ibatis/dao/impl/ibatis/User.xml"/>
</sqlMapConfig>
User.xml:如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="User" type="com.ibatis.User"/>
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllUsers" resultClass="User">
select * from t_user
</select>
<select id="selectUser" resultClass="User" parameterClass="int">
select * from t_user where id=#id#
</select>
<insert id="insertUser" parameterClass="User">
insert into t_user values (
null,#username#,#password#
)
</insert>
<update id="updateUser" parameterClass="User">
update t_user set username = #username#,password=#password#
where id=#id#
</update>
<delete id="deleteUser" parameterClass="int">
delete from t_user where id=#id#
</delete>
</sqlMap>
我们?/span>DAO的编写:
package com.iabtis.dao.impl.ibatis; import java.util.List; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ibatis.dao.UserDAO; import com.ibatis.crm.model.User; public class UserDAOImpl extends SqlMapClientDaoSupport implements UserDAO { public void select(User user) { getSqlMapClientTemplate().delete("selectUser ",user.getId()); } public List findAll() { return getSqlMapClientTemplate().queryForList("selectAllUsers "); } public void delete(User user) { getSqlMapClientTemplate().delete("deleteUser ",user.getId()); } public void save(User user) { getSqlMapClientTemplate().insert("insertUser ",user); } public void update(User user) { getSqlMapClientTemplate().update("updateUser ",user); } } |
l承SqlMapClientDaoSupportQ要求我们注?/span>SqlMapClient对象Q因此,需要有如下?/span>DAO配置Q?/span>
<bean id="userDAO" class="com.ibatils.dao.impl.ibatis.UserDAOImpl"> <property name=”sqlMapClient” ref=”sqlMapClient”/> </bean> |
q就是所有需要注意的问题了,此后可以在业务逻辑层调?/span>DAO对象了!