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

 

<statement id = "getUserArrayById" parameterClass="int"
 
       resultClass="user">
 
     <![CDATA[

        SELECT * FROM T_USER WHERE id > #value#
 
        group by id

      ]]>

</statement>

 

DAO

 

实现如下:

 public List<User> findUserArrayById (Integer userId) throws Exception {
        init();
        List<User> list = sqlMap.queryForList("getUserArrayById", userId);
        return list;
     }

 

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 文件中

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

 修改为:

 

<!-- Oracle SEQUENCE  -->   
<insert id="insertUser-ORACLE" parameterClass="user">    
<selectKey resultClass="int" keyProperty="id" type="pre">    
<![CDATA[
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
]]>  
</selectKey> 
<![CDATA[
INSERT INTO t_user(id,name,sex)VALUES(#id#,#name#,#sex#)
]]>
</insert> 

 

4) 存储过程

   SQL MAP 通过 <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>

 

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

1.parameterClass

 

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

2.parameterMap

 <parameterMap id ="insert-user-param" class="user">
     <parameter property="id" />
    <parameter property="name" />
    <parameter property="sex" />
 </parameterMap>

 <statement id = "insertUser" parameterMap="insert-user-param">
      INSERT   INTO   T_USER   (id,name, sex) VALUES   (?,?,?)
</statement>
 

3.resultClass

 

<statement id="getUser" parameterClass="String" resultClass="user">
    SELECT id,
         name,
        sex         
        FROM t_user
         WHERE name =#value#
</statement>

 4.resultMap

 

 

<resultMap id="get-user-result" class="user">
      <result  property="id" column="id"/>
      <result property="name"  column="name"/>
      <result property="sex"  column="sex"/>
  </resultMap>
 <statement  id ="getUserList" resultMap="get-user-result">
     select * from t_user
</statement>

 

5.cacheModel

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

 

<cacheModel id="user-cache" type="LRU"> 
     <flushInterval hours="24"/> 
      <flushOnExecute statement="insertUser"/> 
      <flushOnExecute statement="updateUser"/> 
    <flushOnExecute statement="deleteUser"/> 
      <property name="size" value="1000"/>
  </cacheModel>
 <statement id ="getUserList"  cacheModel="user-cache">
       SELECT * FROM t_user 
</statement>

 

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

 

6.xmlResultName

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

 

<select  id="getUserById" parameterClass="int" resultClass="xml" xmlResultName="user">
    SELECT id ,
    name ,
    sex 
    FROM t_user
    WHERE id =#value#
</select>

 调用如下 :

 

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

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

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?><user><id>1</id><name>user001</name><sex>0</sex></user>
 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值