sqlMap所包含的标签:
<sqlMap
id="Product">
<cacheModel id="productCache"
type="LRU">
<flushInterval
hours="24"/>
<property name="size"
value="1000" />
</cacheModel>
<typeAlias alias="product"
type="com.ibatis.example.Product" />
<parameterMap id="productParam"
class="product">
<parameter
property="id"/>
</parameterMap>
<resultMap id="productResult"
class="product">
<result property="id"
column="PRD_ID"/>
<result
property="description" column="PRD_DESCRIPTION"/>
</resultMap>
<select id="getProduct"
parameterMap="productParam" resultMap="productResult"
cacheModel="product-cache">
select * from PRODUCT where
PRD_ID = ?
</select>
</sqlMap>
The
SQL Map XML File
(
http://www.ibatis.com/dtd/sql-map-config-2.dtd)
一、Mapped
Statements
Mapped statements可以是任何一个SQL
statement,并且可以指定输入参数的map和输出结果的map。
简单的情况下,mapped
statement可以直接指定一个类来做为输入参数和输出结果参数。mapped
statement也可以使用cache
model在内存中缓冲经常使用的数据。
<statement
id="statementName"
[parameterClass="some.class.Name"]
[resultClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]
>
select * from PRODUCT where PRD_ID =
[?|#propertyName#] order by [$simpleDynamic$]
</statement>
在上面的statement的配置中,放在[]中的配置参数是可选的,所以下面的Mapped
Statement是完全合法的。
<statement
id="insertTestProduct">
insert into PRODUCT (PRD_ID,
PRD_DESCRIPTION) values (1, "Shih Tzu")
</statement>
下面逐一介绍各个标签的含义以及使用方法:
1. Statement 类型
下表中列出了所有的Statement,以及他们的属性和所支持的特征。
Statement Element
|
Attributes
|
Child Elements
|
Methods
|
<statement> |
id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
xmlResultName |
All
dynamic elements |
insert
update
delete
All
query methods |
<insert>
|
id
parameterClass
parameterMap |
All
dynamic elements
<selectKey> |
insert
update
delete |
<update>
|
id
parameterClass
parameterMap |
All
dynamic elements
|
insert
update
delete |
<delete>
|
id
parameterClass
parameterMap |
All dynamic
elements |
insert
update
delete |
<select>
|
id
parameterClass
resultClass
parameterMap
resultMap
cacheModel |
All dynamic
elements |
All query
methods |
<procedure>
|
id
parameterClass
resultClass
parameterMap
resultMap
xmlResultName |
All
dynamic elements |
insert
update
delete
All
query methods |
<statement id="statementName"
[parameterClass="some.class.Name"]
[resultClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
[resultMap="nameOfResultMap"]
[cacheModel="nameOfCache"]
>
select * from PRODUCT
where PRD_ID = [?|#propertyName#] order by [$simpleDynamic$]
</statement>
2. the SQL
sql语句无疑是map中最重要的组成部分,你可以使用任何的sql语句,只要你的数据库和JDBC驱动支持就行。你也可以使用数据库和驱动支持的任何函数。因为你是将sql语句写在了XML文档中,为了区别Sql中的"<>"和XML中的"<>",在写Sql时,可以用<![CDATA[ SQL ]]>来写。
3. 自增
很多关系型数据库都支持主键的自增,SQL Map可以通过<insert>标签中的<selectKey>来支持自增。预生成(如Oracle)和后生成(如Sql Server)都支持,下面是例子:
<!—Oracle SEQUENCE Example
-->
<insert id="insertProduct-ORACLE"
parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values
(#id#,#description#)
</insert>
<!— Microsoft SQL Server IDENTITY Column
Example -->
<insert id="insertProduct-MS-SQL"
parameterClass="com.domain.Product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
4. 存储过程:
通过<procedure>标签来支持存储过程,下面的例子显示了如何使用带有输出参数的存储过程。
<parameterMap id="swapParameters"
class="map" >
<parameter property="email1" jdbcType="VARCHAR"
javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2" jdbcType="VARCHAR"
javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses"
parameterMap="swapParameters" >
{call swap_email_address (?, ?)}
</procedure>
调用上面的存储过程会在数据表的两列间交换Email地址,而且在对应的参数对象中的也会交换。记住:当parameter mapping的mode为INOUT或OUT的时候,
你输入的参数对象才会改变。很显然,不变的参数对象也是不会改变的,比如说String对象。
记住:一定要使用标准的JDBC存储过程的语法。请参见JDBC CallableStatement documentation以获取更多信息。