SQL Map XML 映射文件

来源:互联网 发布:淘宝客批量转换工具 编辑:程序博客网 时间:2024/06/05 07:37

一个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区里面就可以了.例如:

 

 1  <statement id = "getUserArrayById" parameterClass="int"
 2 
 3       resultClass="user">
 4 
 5      <![CDATA[
 6 
 7         SELECT * FROM T_USER WHERE id > #value#
 8 
 9         group by id
10 
11       ]]>
12 
13 </statement>
14 

 

 

DAO

 

实现如下:

 1    .
 2    /*
 3     * 
 4     * @see com.ibatis.dao.UserDao#findUserArrayById(java.lang.Integer)
 5     */
 6     @Override
 7     public List<User> findUserArrayById (Integer userId) throws Exception {
 8         init();
 9         List<User> list = sqlMap.queryForList("getUserArrayById", userId);
10         return list;
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文件中

1 <insert id="insertUser" parameterClass="user">
2             INSERT INTO t_user(id,name,sex) VALUES(#id#,#name#,#sex#)
3 </insert>
4 

修改为:

 


 1<!--  My sql SEQUENCE-->   
 2<insert   id="insertUser-MY-SQL"   parameterClass="user">   
 3      INSERT   INTO   T_USER   (name, sex) VALUES (#name#,#sex#)   
 4      <selectKey   resultClass="int"   keyProperty="id" >   
 5          SELECT   LAST_INSERT_ID() as id  
 6      </selectKey>   
 7</insert> 
 8
 9<!-- Oracle SEQUENCE  -->   
10<insert id="insertUser-ORACLE" parameterClass="user">    
11<selectKey resultClass="int" keyProperty="id" type="pre">    
12<![CDATA[
13SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
14]]>  
15</selectKey> 
16<![CDATA[
17INSERT INTO t_user(id,name,sex)VALUES(#id#,#name#,#sex#)
18]]>
19</insert> 
20
21<!-- Microsoft SQL Server IDENTITY Column -->    
22<insert  id="insertUser-MS-SQL" parameterClass="user ">    
23<![CDATA[
24INSERT   INTO   T_USER   (name, sex) VALUES   (#name#,#sex#)  
25]]>    
26<selectKey resultClass="int" keyProperty="id" type="post">    
27<![CDATA[
28SELECT @@IDENTITY AS ID 
29]]> 
30<!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->  
31</selectKey>    
32</insert> 
33
34<!-- Microsoft SQL Server IDENTITY Column 改进-->    
35<insert id="insertUser-MS-SQL" parameterClass="user">    
36<selectKey resultClass="int" keyProperty="id">    
37<![CDATA[
38INSERT   INTO   T_USER   (name, sex) VALUES   (#name#,#sex#)   
39   SELECT SCOPE_IDENTITY() AS ID 
40]]>  
41</selectKey>    
42</insert> 
43

 

4)存储过程

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


1 <parameterMap id="swapParameters" class="map">
2     <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
3     <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
4 </parameterMap>
5 
6 <procedure id="swapEmailAddresses" parameterMap="swapParameters">
7    {call swap_email_address(?,?)}
8 </procedure>

 

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

1.parameterClass

例如:


1 
2 <statement id="statementName" parameterClass="user">
3        INSERT INTO t_user VALUES(#id#,#name#,#sex#)
4 </statement>
5 

 

2.parameterMap

例如:


 1 
 2 <parameterMap id ="insert-user-param" class="user">
 3     <parameter property="id" />
 4     <parameter property="name" />
 5     <parameter property="sex" />
 6 </parameterMap>
 7 
 8 <statement id = "insertUser" parameterMap="insert-user-param">
 9      INSERT   INTO   T_USER   (id,name, sex) VALUES   (?,?,?)
10 </statement>
11 

 

3.resultClass

例如:


1 
2 <statement id="getUser" parameterClass="String" resultClass="user">
3     SELECT id,
4         name,
5         sex         
6         FROM t_user
7         WHERE name =#value#
8 </statement>
9 

 传入参数为user009”

    执行结果如下:

    9:user009:1

 

4.resultMap

例如:


 1 
 2 <resultMap id="get-user-result" class="user">
 3     <result  property="id" column="id"/>
 4     <result property="name"  column="name"/>
 5     <result property="sex"  column="sex"/>
 6 </resultMap>
 7 <statement  id ="getUserList" resultMap="get-user-result">
 8     select * from t_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

 

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

 

6.xmlResultName

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


1
2<select  id="getUserById" parameterClass="int" resultClass="xml" xmlResultName="user">
3    SELECT id ,
4    name ,
5    sex 
6    FROM t_user
7    WHERE id =#value#
8</select>
9

 

 

    调用如下:

 

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

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

 

 


1 <?xml version="1.0" encoding="UTF-8" standalone="no"?><user><id>1</id><name>user001</name><sex>0</sex></user>
2
原创粉丝点击