SQL Map XML 映射文件

SQL Map XML 映射文件

一个SQL Map XML映射文件可以包含任意多个Mapped Statement, Parameter Map Result Map.按照它们之间的逻辑关系,为您的应用合理地组织Mapped Statement, Parameter Map Result Map.

typeAlias 节点

<typeAlias> 节点让您为一个通常较长的、全限定类名指定一个较短的别名.

<typeAlias alias=”shortname” type=”com.long.class.path.Class”/>

例如:

<typeAlias alias="user" type="com.ibatis.db.User"/>

Mapped Statements

SQL Map的核心概念是Mapped Statement.Mapped Statement可以使用任意的SQL语句,并拥有Parameter Map(输入) Result Map(输出).如果是简单情况, Mapped Statement可以使用JAVA类来作为ParameterResult. Mapped Statement也可以使用缓存模型,在内存中缓存常用的数据. Mapped Statement的结构如下所示:

<statement id =”statementName”

[parameterClass=”some.class.Name”]

[resultclass=”some.class.Name”]

[parameterMap=”nameOfParameterMap”]

[resultMap=”nameOfResultMap”]

[cacheModel=”nameOfCache”] >

Select * from t_user where id =[?|#propertyName#]

order by [$simpleDynamic$]

</statement>

在上面的表达式中,括号[]里的部分是可选的属性,并具在某些情况下只有特定的组合才是合法的.

1)Statements节点
<statement>节点是个通用声明,可以用于任何类型的SQL语句。通常,使用具体的statement类型是个好主意。具体statement类型提供了更直观的XML DTD,并拥有某些<statement>节点没有的特性.下表总结了statement类型及其属性和特性:

Statement 类型

属性

子元素

方法

<statement>

id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName

所有的动态元素

insert update delete 所有的查询方法

<insert>

id parameterClass parameterMap

所有的动态元素 <selectKey>

insert

update

delete

<update>

id

parameterClass parameterMap

所有的动态元素

Insert

Update

delete

<delete>

id parameterClass resultClass parameterMap resultMap cacheModel

所有的动态元素

所有的查询方法

<select>

id parameterClass resultClass parameterMap resultMap cacheModel

所有的动态元素

所有的查询方法

<procedure>

id parameterClass resultClass parameterMap resultMap xmlResultName

所有的动态元素

insert update delete 所有的查询方法

2)Sql 语句

SQL显然是Mapped Statement中最重要的部分,可以使用对于数据库和JDBC DRIVER 合法的任意SQL语句.只要在JDBC DRIVER支持,可能使用任意的函数,甚至是多条语句.因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大于号和小于号(<>).幸运的是,解决的办法很简单,只需将包含特殊字符的SQL语句放在XMLCDATA区里面就可以了.例如:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 <statementid="getUserArrayById"parameterClass="int"
2
3resultClass="user">
4
5<![CDATA[
6
7SELECT*FROMT_USERWHEREid>#value#
8
9groupbyid
10
11]]>
12
13</statement>
14

DAO

实现如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 .
2/*
3*
4*@seecom.ibatis.dao.UserDao#findUserArrayById(java.lang.Integer)
5*/
6@Override
7publicList<User>findUserArrayById(IntegeruserId)throwsException{
8init();
9List<User>list=sqlMap.queryForList("getUserArrayById",userId);
10returnlist;
11}
12.

调用此方法,执行后的结果为:

2:User002:1

3:User003:0

4:User004:0

5:User005:0

6:User006:0

7:User007:0

8:User008:0

9:User009:0

10:User0010:0

12:User0012:1

22:User0022:1

32:User0032:1

42:User0042:1

100:User100:1

3)自动生成主键

很多数据库支持自动生成主键的数据类型.不地这通常(并不总是)是个私有的特性.SQL MAP 通过<insert>的子节点<selectKey>来支持自动生成的键值.它同时支持预生成( Oracle )和后生成两种类型(MS-SQL server, My sql).下面是几个例子.

要实现自动生成主键有两个部分的内容:

1. 建表时,将id定义为主键并且加上auto_increment”设置为自动增加.

例如:

create table ibatis_db.t_user(id int(6)

PRIMARY KEY auto_increment not null,

name varchar(15) not null, sex int(1) not null);

2 User.xml文件中

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 <insertid="insertUser"parameterClass="user">
2INSERTINTOt_user(id,name,sex)VALUES(#id#,#name#,#sex#)
3</insert>
4

修改为:

User.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1<!--MysqlSEQUENCE-->
2<insertid="insertUser-MY-SQL"parameterClass="user">
3INSERTINTOT_USER(name,sex)VALUES(#name#,#sex#)
4<selectKeyresultClass="int"keyProperty="id">
5SELECTLAST_INSERT_ID()asid
6</selectKey>
7</insert>
8
9<!--OracleSEQUENCE-->
10<insertid="insertUser-ORACLE"parameterClass="user">
11<selectKeyresultClass="int"keyProperty="id"type="pre">
12<![CDATA[
13SELECTSTOCKIDSEQUENCE.NEXTVALASIDFROMDUAL
14]]>
15</selectKey>
16<![CDATA[
17INSERTINTOt_user(id,name,sex)VALUES(#id#,#name#,#sex#)
18]]>
19</insert>
20
21<!--MicrosoftSQLServerIDENTITYColumn-->
22<insertid="insertUser-MS-SQL"parameterClass="user">
23<![CDATA[
24INSERTINTOT_USER(name,sex)VALUES(#name#,#sex#)
25]]>
26<selectKeyresultClass="int"keyProperty="id"type="post">
27<![CDATA[
28SELECT@@IDENTITYASID
29]]>
30<!--该方法不安全应当用SCOPE_IDENTITY()但这个函数属于域函数,需要在一个语句块中执行。-->
31</selectKey>
32</insert>
33
34<!--MicrosoftSQLServerIDENTITYColumn改进-->
35<insertid="insertUser-MS-SQL"parameterClass="user">
36<selectKeyresultClass="int"keyProperty="id">
37<![CDATA[
38INSERTINTOT_USER(name,sex)VALUES(#name#,#sex#)
39SELECTSCOPE_IDENTITY()ASID
40]]>
41</selectKey>
42</insert>
43

4)存储过程

SQL MAP 通过<procedure>节点支持存储过程.下面的例子说明如何使用具有输出参数的存储过程.

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1<parameterMapid="swapParameters"class="map">
2<parameterproperty="email1"jdbcType="VARCHAR"javaType="java.lang.String"mode="INOUT"/>
3<parameterproperty="email2"jdbcType="VARCHAR"javaType="java.lang.String"mode="INOUT"/>
4</parameterMap>
5
6<procedureid="swapEmailAddresses"parameterMap="swapParameters">
7{callswap_email_address(?,?)}
8</procedure>

5)<statement>的子节点的属性

1.parameterClass

例如:

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<statementid="statementName"parameterClass="user">
3INSERTINTOt_userVALUES(#id#,#name#,#sex#)
4</statement>
5

2.parameterMap

例如:

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<parameterMapid="insert-user-param"class="user">
3<parameterproperty="id"/>
4<parameterproperty="name"/>
5<parameterproperty="sex"/>
6</parameterMap>
7
8<statementid="insertUser"parameterMap="insert-user-param">
9INSERTINTOT_USER(id,name,sex)VALUES(?,?,?)
10</statement>
11

3.resultClass

例如:

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<statementid="getUser"parameterClass="String"resultClass="user">
3SELECTid,
4name,
5sex
6FROMt_user
7WHEREname=#value#
8</statement>
9

传入参数为user009”

执行结果如下:

9:user009:1

4.resultMap

例如:

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<resultMapid="get-user-result"class="user">
3<resultproperty="id"column="id"/>
4<resultproperty="name"column="name"/>
5<resultproperty="sex"column="sex"/>
6</resultMap>
7<statementid="getUserList"resultMap="get-user-result">
8select*fromt_user
9</statement>
10

执行结果如下:

1:user001:0

2:user002:1

3:user003:1

4:user004:1

5:user005:1

6:user006:1

7:user007:1

8:user008:1

9:user009:1

10:user0010:1

11:user0011:0

12:user0012:0

13:user0013:0

14:user0014:0

15:user0015:0

16:user0016:0

17:user0017:0

18:user0018:0

19:user0019:0

20:user0020:0

5.cacheModel

cacheModel 的属性值等于指定的cacheModel元素的name属性值.属性cacheModel定义查询mapped statement 的缓存.每一个查询mapped statement 可以使用不同或相同的

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<cacheModelid="user-cache"type="LRU">
3<flushIntervalhours="24"/>
4<flushOnExecutestatement="insertUser"/>
5<flushOnExecutestatement="updateUser"/>
6<flushOnExecutestatement="deleteUser"/>
7<propertyname="size"value="1000"/>
8</cacheModel>
9<statementid="getUserList"cacheModel="user-cache">
10SELECT*FROMt_user
11</statement>
12

上面的例子中,24小时刷新一次,或当更新的操作发生时刷新.

6.xmlResultName

当直接把查询结果映射成XML document ,属性xmlReesultName的值等于XML document根节点的名称.例如:

user.xml
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
2<selectid="getUserById"parameterClass="int"resultClass="xml"xmlResultName="user">
3SELECTid,
4name,
5sex
6FROMt_user
7WHEREid=#value#
8</select>
9

调用如下:

String str = (String) sqlMap.queryForObject("getUserById", id);

上面的查询结果将产生一个XML document,结构如下:

user.xml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值