`

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 类来作为 Parameter Result. 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 语句放在 XML CDATA 区里面就可以了 . 例如 :

 

 

Xml代码 复制代码 收藏代码
  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>  
<statement id = "getUserArrayById" parameterClass="int"
 
       resultClass="user">
 
     <![CDATA[

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

      ]]>

</statement>

 

DAO

 

实现如下:

Java代码 复制代码 收藏代码
  1. public List<User> findUserArrayById (Integer userId) throws Exception {   
  2.        init();   
  3.        List<User> list = sqlMap.queryForList("getUserArrayById", userId);   
  4.        return list;   
  5.     }  
 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 文件中

Xml代码 复制代码 收藏代码
  1. <insert id="insertUser" parameterClass="user">  
  2.              INSERT INTO t_user(id,name,sex) VALUES(#id#,#name#,#sex#)   
  3. </insert>  
<insert id="insertUser" parameterClass="user">
             INSERT INTO t_user(id,name,sex) VALUES(#id#,#name#,#sex#)
</insert>

 修改为:

 

Xml代码 复制代码 收藏代码
  1. <!-- Oracle SEQUENCE  -->      
  2. <insert id="insertUser-ORACLE" parameterClass="user">       
  3. <selectKey resultClass="int" keyProperty="id" type="pre">       
  4. <![CDATA[  
  5. SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL  
  6. ]]>     
  7. </selectKey>    
  8. <![CDATA[  
  9. INSERT INTO t_user(id,name,sex)VALUES(#id#,#name#,#sex#)  
  10. ]]>  
  11. </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> 节点支持存储过程 . 下面的例子说明如何使用具有输出参数的存储过程 .

Xml代码 复制代码 收藏代码
  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. <procedure id="swapEmailAddresses" parameterMap="swapParameters">  
  6.     {call swap_email_address(?,?)}   
  7.  </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

 

 

Xml代码 复制代码 收藏代码
  1. <statement id="statementName" parameterClass="user">  
  2.        INSERT INTO t_user VALUES(#id#,#name#,#sex#)   
  3. </statement>  
<statement id="statementName" parameterClass="user">
       INSERT INTO t_user VALUES(#id#,#name#,#sex#)
</statement>

 

2.parameterMap

Xml代码 复制代码 收藏代码
  1. <parameterMap id ="insert-user-param" class="user">  
  2.     <parameter property="id" />  
  3.    <parameter property="name" />  
  4.    <parameter property="sex" />  
  5. </parameterMap>  
  6.   
  7. <statement id = "insertUser" parameterMap="insert-user-param">  
  8.      INSERT   INTO   T_USER   (id,name, sex) VALUES   (?,?,?)   
  9. lt;/statement>  
 <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

 

Xml代码 复制代码 收藏代码
  1. <statement id="getUser" parameterClass="String" resultClass="user">  
  2.     SELECT id,   
  3.          name,   
  4.         sex            
  5.         FROM t_user   
  6.          WHERE name =#value#   
  7. </statement>  
<statement id="getUser" parameterClass="String" resultClass="user">
    SELECT id,
         name,
        sex         
        FROM t_user
         WHERE name =#value#
</statement>

 4.resultMap

 

 

Xml代码 复制代码 收藏代码
  1. <resultMap id="get-user-result" class="user">  
  2.       <result  property="id" column="id"/>  
  3.       <result property="name"  column="name"/>  
  4.       <result property="sex"  column="sex"/>  
  5.   </resultMap>  
  6.  <statement  id ="getUserList" resultMap="get-user-result">  
  7.      select * from t_user   
  8. </statement>  
<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 可以使用不同或相同的

 

 

Xml代码 复制代码 收藏代码
  1. <cacheModel id="user-cache" type="LRU">    
  2.      <flushInterval hours="24"/>    
  3.       <flushOnExecute statement="insertUser"/>    
  4.       <flushOnExecute statement="updateUser"/>    
  5.     <flushOnExecute statement="deleteUser"/>    
  6.       <property name="size" value="1000"/>  
  7.   </cacheModel>  
  8.  <statement id ="getUserList"  cacheModel="user-cache">  
  9.        SELECT * FROM t_user    
  10. </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 根节点的名称 . 例如 :

 

 

Xml代码 复制代码 收藏代码
  1. <select  id="getUserById" parameterClass="int" resultClass="xml" xmlResultName="user">  
  2.     SELECT id ,   
  3.     name ,   
  4.     sex    
  5.     FROM t_user   
  6.     WHERE id =#value#   
  7. </select>  
<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代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?><user><id>1</id><name>user001</name><sex>0</sex></user>  
<?xml version="1.0" encoding="UTF-8" standalone="no"?><user><id>1</id><name>user001</name><sex>0</sex></user>

 

分享到:
评论

相关推荐

    iBATIS 帮助文档

    #### 四、SQL Map XML 映射文件 - **Mapped Statements**:定义具体的 SQL 语句及其执行结果的映射规则。 - **Statement 类型**:包括 SELECT、INSERT、UPDATE 和 DELETE 等,每种类型对应不同的 SQL 动作。 - **...

    ibatis开发指南(中文版)

    #### 六、SQL Map XML 映射文件 - **MappedStatements**:用于定义具体的SQL语句和映射规则。 - **Statement 的类型**:包括INSERT、UPDATE、DELETE和SELECT等。 - **SQL语句**:直接在XML中定义SQL语句,可以包含...

    sql-map-2.dtd和sql-map-config-2.dtd

    Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射文件将Java对象与数据库表进行映射。这两个DTD(Document Type Definition)文件是Ibatis配置文件的定义文档,...

    Ibatis框架的核心知识点

    SQL Map XML 映射文件是Ibatis的核心组成部分,它定义了数据库操作的映射规则。例如,`&lt;sqlMap&gt;` 元素可以包含多个 `&lt;select&gt;`、`&lt;insert&gt;`、`&lt;update&gt;` 和 `&lt;delete&gt;` 语句,用于执行不同的数据库查询或更新操作。...

    Mybatis-03 SQL映射文件

    MyBatis支持在XML映射文件中使用条件标签实现动态SQL,如`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;trim&gt;`, `&lt;set&gt;`等。这些标签允许根据特定条件拼接SQL语句,极大地提高了代码的灵活性。 7. *...

    ibatis开发手册(pdf)

    #### 五、SQL Map XML 映射文件 - **Mapped Statements**:定义了 SQL 语句及其映射规则。 - **Statement 类型**:包括 INSERT、UPDATE、DELETE 和 SELECT 四种类型。 - **SQL 语句**:定义具体的 SQL 语句。 - ...

    ibatis 指导书 PDF

    #### 五、SQL Map XML 映射文件详解 **映射文件主要组成部分:** - **MappedStatements**:描述 SQL 语句及结果映射规则。 - **Statement 类型**:包括 SELECT、INSERT、UPDATE 和 DELETE 等。 - **SQL 语句**:...

    CodeSmith对应的NHibernate的.hbm.xml映射文件的生成模板

    本主题主要围绕CodeSmith如何生成NHibernate的.hbm.xml映射文件展开。这些映射文件是NHibernate工作的重要组成部分,它们描述了数据库表和C#类之间的对应关系,包括字段、属性、主键、外键、索引等信息。 `...

    ibatis的sql-map dtd

    `sql-map-2.dtd`文件主要用于定义SQL映射文件的结构。在这个文件中,你可以找到如下的元素和属性定义: 1. `&lt;sql-map&gt;`:根元素,包含了所有SQL语句和结果映射。 2. `&lt;select&gt;`:定义了一个查询语句,可以包含ID、...

    MyBatis执行SQL并将结果映射成Java对象.docx

    这样,我们就可以在项目中编写Mapper接口,定义SQL方法,创建对应的XML映射文件,并在服务类中通过SqlSession调用这些方法来执行SQL。 在实际开发中,我们通常会使用MyBatis的SqlSessionTemplate或...

    ibatis配置文件、映射文件详解

    最后,通过`sqlMap`节点引用具体的映射文件,该文件包含了具体的SQL语句和映射规则。 ### 总结 `sqlMapConfig.xml`是ibatis框架的核心配置文件之一,它不仅定义了与数据库交互的基本配置,还涉及到了性能调优的...

    基于spring的sql map实现

    最后,`sql-map`可能是指MyBatis的映射文件,其中包含了SQL语句和结果映射。映射文件通常以`.xml`扩展名,里面定义了每个数据库操作的详细结构。 综上所述,基于Spring的SQL Map实现结合了Spring的IoC和AOP优势,...

    基于iBatis SQL Map的数据持久层实现应用研究.pdf

    iBatis SQL Map的核心是基于XML配置文件的映射技术,它允许开发者不必关心底层数据库的具体操作,只需通过操作Java对象和配置文件即可完成数据的CRUD操作(创建Create、读取Read、更新***e、删除Delete)。...

    iBATISDatabaseLayer开发指南.pdf

    SQL Map通过配置文件(通常为sqlmap-config.xml)来初始化,并在运行时读取对应的SQL映射文件(如:users.xml)。映射文件中包含了具体的SQL语句以及结果集映射规则。 2.3. 快速入门 要使用SQL Map,首先需要准备...

    MyBatis SQL映射器框架的Java.zip

    MyBatis还支持动态SQL,通过`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`等标签,可以在XML映射文件中编写条件语句,根据传入参数的不同动态生成SQL。 总的来说,MyBatis是一个轻量级的ORM框架,它的主要优势在于...

Global site tag (gtag.js) - Google Analytics