﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我思故我强-文章分类-ibatis</title><link>http://www.blogjava.net/balajinima/category/38895.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2009 15:48:18 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2009 15:48:18 GMT</pubDate><ttl>60</ttl><item><title>ibatis动态mapped Statement 配置详解</title><link>http://www.blogjava.net/balajinima/articles/261859.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Wed, 25 Mar 2009 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/261859.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/261859.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/261859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/261859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/261859.html</trackback:ping><description><![CDATA[
		<div class="blogstory">
				<script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script>
				<p>
						<strong>
								<font size="5"> 动态 Mapped Statement</font>
						</strong>
						<br />直接使用 JDBC 一个非常普遍的问题是动态 SQL。使用参数值、参数本身和数据列都<br />是动态的 SQL，通常非常困难。典型的解决方法是，使用一系列 if-else 条件语句和一连串<br />讨厌的字符串连接。对于这个问题，SQL Map API使用和 mapped statement非常相似的结构，<br />提供了较为优雅的方法。这里是一个简单的例子： <br />&lt;select id="dynamicGetAccountList" <br />cacheModel="account-cache" <br />resultMap="account-result" &gt; <br />select * from ACCOUNT <br />&lt;isGreaterThan prepend="and" property="id" compareValue="0"&gt; <br />where ACC_ID = #id# <br />&lt;/isGreaterThan&gt; <br />order by ACC_LAST_NAME <br />&lt;/select&gt;<br /> <br />上面的例子中，根据参数 bean“id”属性的不同情况，可创建两个可能的语句。如果参<br />数“id”大于 0，将创建下面的语句： <br />select * from ACCOUNT where ACC_ID = ? <br />或者，如果“id”参数小于等于 0，将创建下面的语句： <br />select * from ACCOUNT <br />在更复杂的例子中，动态 Mapped Statement 的用处更明显。如下面比较复杂的例子： <br />&lt;statement id="dynamicGetAccountList" resultMap="account-result" &gt; </p>
				<p>select * from ACCOUNT <br />&lt;dynamic prepend="WHERE"&gt; <br />&lt;isNotNull prepend="AND" property="firstName"&gt; <br />(ACC_FIRST_NAME = #firstName# <br />&lt;isNotNull prepend="OR" property="lastName"&gt; <br />ACC_LAST_NAME = #lastName# <br />&lt;/isNotNull&gt; <br />) <br />&lt;/isNotNull&gt; <br />&lt;isNotNull prepend="AND" property="emailAddress"&gt; <br />ACC_EMAIL like #emailAddress# <br />&lt;/isNotNull&gt; <br />&lt;isGreaterThan prepend="AND" property="id" compareValue="0"&gt; <br />ACC_ID = #id# <br />&lt;/isGreaterThan&gt; <br />&lt;/dynamic&gt; <br />order by ACC_LAST_NAME </p>
				<p>&lt;/statement&gt; <br />根据不同的条件，上面动态的语句可以产生 16 条不同的查询语句。使用 if-else 结构和<br />字符串，会产生上百行很乱的代码。 <br />而使用动态 Statement，和在 SQL 的动态部位周围插入条件标签一样容易。例如： <br />&lt;statement id="someName" resultMap="account-result" &gt; <br />select * from ACCOUNT <br />&lt;dynamic prepend="where"&gt; <br />&lt;isGreaterThan prepend="and" property="id" compareValue="0"&gt; <br />ACC_ID = #id# <br />&lt;/isGreaterThan&gt; <br />&lt;isNotNull prepend=”and" property="lastName"&gt; <br />ACC_LAST_NAME = #lastName# <br />&lt;/isNotNull&gt; <br />&lt;/dynamic&gt; <br />order by ACC_LAST_NAME <br />&lt;/statement&gt;<br /> <br />上面的例子中，&lt;dynamic&gt;元素划分出SQL 语句的动态部分。动态部分可以包含任意多<br />的条件标签元素，条件标签决定是否在语句中包含其中的 SQL 代码。所有的条件标签元素<br />将根据传给动态查询 Statement 的参数对象的情况来工作。&lt;dynamic&gt;元素和条件元素都有<br />“prepend”属性，它是动态 SQL 代码的一部分，在必要情况下，可以被父元素的“prepend”<br />属性覆盖。上面的例子中，prepend属性“where”将覆盖第一个为“真”的条件元素。这对</p>
				<p>于确保生成正确的 SQL 语句是有必要的。例如，在第一个为“真”的条件元素中，“AND”<br />是不需要的，事实上，加上它肯定会出错。以下小节讨论不同的条件元素，包括二元条件元<br />素，一元条件元素和其他动态元素。 <br />二元条件元素 <br />二元条件元素将一个属性值和一个静态值或另一个属性值比较，如果条件为“真”，元<br />素体的内容将被包括在查询 SQL 语句中。  二元条件元素的属性： <br />prepend  － 可被覆盖的 SQL 语句组成部分，添加在语句的前面（可选） <br />property  － 被比较的属性（必选） <br />compareProperty  －  另一个用于和前者比较的属性（必选或选择 compareValue） <br />compareValue  －  用于比较的值（必选或选择 compareProperty） <br />比较属性值和静态值或另一个属性值是否相等。 <br />&lt;isEqual&gt; <br />比较属性值和静态值或另一个属性值是否不相等。 <br />&lt;isNotEqual&gt; </p>
				<p>比较属性值是否大于静态值或另一个属性值。 <br />&lt;isGreaterThan&gt; <br />比较属性值是否大于等于静态值或另一个属性值。 <br />&lt;isGreaterEqual&gt; <br />比较属性值是否小于静态值或另一个属性值。 <br />&lt;isLessThan&gt; <br />比较属性值是否小于等于静态值或另一个属性值。 <br />&lt;isLessEqual&gt; <br />例子： <br />&lt;isLessEqual prepend=”AND” property=”age” compareValue=”18”&gt; <br />ADOLESCENT = ‘TRUE’ <br />&lt;/isLessEqual&gt; <br /> <br />一元条件元素 <br />一元条件元素检查属性的状态是否符合特定的条件。  一元条件元素的属性： <br />prepend  － 可被覆盖的 SQL 语句组成部分，添加在语句的前面（可选） <br />property  － 被比较的属性（必选） </p>
				<p>检查是否存在该属性（存在 parameter bean 的属性）。 <br />&lt;isPropertyAvailable&gt; <br />检查是否不存在该属性（不存在 parameter bean 的属性）。 <br />&lt;isNotPropertyAvailable&gt; <br />检查属性是否为 null。 <br />&lt;isNull&gt; <br />检查属性是否不为 null。 <br />&lt;isNotNull&gt; <br />检查 Collection.size()的值，属性的 String 或 String.valueOf()值,<br />&lt;isEmpty&gt; <br />是否为 null或空（“”或size() &lt; 1）。 <br />检查 Collection.size()的值，属性的 String 或 String.valueOf()值,<br />&lt;isNotEmpty&gt; <br />是否不为 null 或不为空（“”或 size() &gt; 0）。 <br />例子： <br />&lt;isNotEmpty prepend=”AND” property=”firstName” &gt; <br />FIRST_NAME=#firstName# <br />&lt;/isNotEmpty&gt;<br /> <br /> <br />其他元素  Parameter Present：这些元素检查参数对象是否存在。 <br />Parameter Present的属性： <br />prepend  － 可被覆盖的 SQL 语句组成部分，添加在语句的前面（可选） <br />检查是否存在参数对象（不为 null）。 <br />&lt;isParameterPresent&gt; <br />检查是否不存在参数对象（参数对象为 null）。 <br />&lt;isNotParameterPresent&gt; <br />例子： <br />&lt;isNotParameterPresent prepend=”AND”&gt; <br />EMPLOYEE_TYPE = ‘DEFAULT’ <br />&lt;/isNotParameterPresent&gt;<br />  Iterate：这属性遍历整个集合，并为 List 集合中的元素重复元素体的内容。 <br />Iterate 的属性： <br />prepend  － 可被覆盖的 SQL 语句组成部分，添加在语句的前面（可选） <br />property  － 类型为 java.util.List 的用于遍历的元素（必选） <br />open  －  整个遍历内容体开始的字符串，用于定义括号（可选） <br />close  －整个遍历内容体结束的字符串，用于定义括号（可选） <br />conjunction －  每次遍历内容之间的字符串，用于定义 AND 或 OR（可选） <br />遍历类型为 java.util.List的元素。 <br />&lt;iterate&gt; <br />例子： <br />&lt;iterate prepend=”AND” property=”userNameList” <br />open=”(” close=”)” conjunction=”OR”&gt; <br />username=#userNameList[]# <br />&lt;/iterate&gt;<br /> <br /> <br />注意：使用&lt;iterate&gt;时，在List元素名后面包括方括号[]非常重要，方括号[]将<br />对象标记为List，以防解析器简单地将List输出成String。 <br /></p>
		</div>
<img src ="http://www.blogjava.net/balajinima/aggbug/261859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2009-03-25 14:41 <a href="http://www.blogjava.net/balajinima/articles/261859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iBATIS自动生成主键(oracle,sqlserver,mysql)</title><link>http://www.blogjava.net/balajinima/articles/250514.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Thu, 08 Jan 2009 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/250514.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/250514.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/250514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/250514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/250514.html</trackback:ping><description><![CDATA[
		<p> </p>
		<p>
				<br />我们在数据库插入一条数据的时候，经常是需要返回插入这条数据的主键。但是数据库供应商之间生成主键的方式都不一样。<br />有些是预先生成(pre-generate)主键的，如Oracle和PostgreSQL；有些是事后生成(post-generate)主键的，如MySQL和SQL Server。但是不管是哪种方式，我们都可以用iBATIS的节点来获取语句所产生的主键。 <br />例子如下：</p>
		<p>假设我的数据库表为PRODUCT (PRD_ID,PRD_DESCRIPTION)。</p>
		<p>xml 代码 <br />&lt;!-- oracle Example --&gt; <br />&lt;insert id="insertProduct-ORACLE" parameterClass="product"&gt;   <br />    &lt;selectKey resultClass="int" type="pre" keyProperty="id" &gt;   <br />        SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL   <br />    &lt;/selectKey&gt;   <br />    insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)   <br />&lt;/insert&gt;   <br />   <br />&lt;!-- Microsoft SQL Server IDENTITY Column Example --&gt;   <br />&lt;insert id="insertProduct-MS-SQL" parameterClass="product"&gt;   <br />    insert into PRODUCT (PRD_DESCRIPTION)   <br />    values (#description#)   <br />    &lt;selectKey resultClass="int" type="post" keyProperty="id" &gt;   <br />        select @@IDENTITY as value   <br />    &lt;/selectKey&gt;   <br />&lt;/insert&gt;   <br />   <br />&lt;!-- MySQL Example --&gt;   <br />&lt;insert id="insertProduct-MYSQL" parameterClass="product"&gt;   <br />    insert into PRODUCT (PRD_DESCRIPTION)   <br />    values (#description#)   <br />    &lt;selectKey resultClass="int" type="post" keyProperty="id" &gt;   <br />        select LAST_INSERT_ID() as value   <br />    &lt;/selectKey&gt;   <br />&lt;/insert&gt;  <br /> <br /></p>
<img src ="http://www.blogjava.net/balajinima/aggbug/250514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2009-01-08 17:19 <a href="http://www.blogjava.net/balajinima/articles/250514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>