在IBatis框架中,利用一个映射文件来定义需要持久化的对象,在这个文件中SQL语句是最显眼的,这个映射文件的目的就是将SQL映射到对象。下面先看一下映射文件的主要功能:
q 定义一个持久化的Java类。
q 映射VO中的变量属性为表字段。
q 根据SQL来持久化对象。
q 可以定义随意使用的SQL。
q 支持各种条件语句的定义。
q 支持数据库自动主键的生成。
q 支持存储过程。
q 支持将结果映射成XML文档。
q 支持多表关联。
1. 一个具体映射文件的示例
下面看一个具体映射文件的示例。在这之前,表结构和VO将沿用第十一章的例11.2 AttackSolution.java,从这里可以看出,IBatis框架的VO也是一个POJO。映射文件的文件名可以随意指定,只要在sql_map_config.xml中的<sqlMap>元素定义中与之对应即可。
与例12.1 sql_map_config.xml的<sqlMap>元素对应的,将定义映射文件名为fw_attacksolution_SqlMap.xml,示例见12.2,在示例12.2中将分段解释各个应用:
例12.2:fw_attacksolution_SqlMap.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="fw_attacksolution">
映射文件的根节点是<sqlMap>。namespace是该<sqlMap>的命名空间,因为SQL Map映射文件可以有多个,而对于SQL Map来说所有映射文件都是全局性的。这意味着在SQL Map中的标识只能是惟一的,利用namespace和标识的全限定名就可以进行区别,前提是,配置文件中的useStatementNamespaces属性必须设置为true。
<resultMap id="fwAttacksolutionResult"
class="struts.sample.cap11.sample2.entity.Attacksolution">
<result column="attack_event_code" property="attack_event_code" jdbcType="VARCHAR" />
<result column="attack_mean" property="attack_mean" jdbcType="VARCHAR" />
<result column="attack_action" property="attack_action" jdbcType="VARCHAR" />
</resultMap>
<resultMap>元素是最常用的元素,使用<resultMap>元素可以定义数据返回的对象。其id属性在之后的各种带返回对象的元素中,将作为返回对象的标识。即,返回结果将会以calss属性定义的对象作为承体。本例中定义返回结果到VO对象Attacksolution。
<resultMap>元素的子元素以column属性作为数据库表字段、并以property字段作为VO变量属性进行映射。返回结果根据字段设置VO变量属性的值。jdbcType属性则指定了数据库表中字段的数据库类型。
<!--定义一般的SQL语句,通常用来作为动态SQL语句的指定。id属性被用作对整个动态SQL语句的标识。 -->
<sql id="example_Where_Clause">
<!-- <dynamic>元素可以划分出SQL语句的动态部分。动态部分可以包含任意多的条件元素。条件元素决定,是否在语句中包含其中的SQL代码。-->
<!-- prepend属性是动态SQL代码的一部分,prepend属性值会被用来覆盖第一个条件元素。 -->
<dynamic prepend="where">
<!-- isPropertyAvailable用来作为一个条件判断元素,它判断是否存在property属性所指定的某个对象的变量属 -->
<!-- prepend属性指定了条件元素-->
<isPropertyAvailable prepend="and" property="AND_attack_event_code_NULL">
<!-- 若存在该变量属性,则指定可以使用<isPropertyAvailable>元素的实体内容。-->
attack_event_code is null
</isPropertyAvailable>
<isPropertyAvailable prepend="and" property="AND_attack_event_code_NOT_NULL">
attack_event_code is not null
</isPropertyAvailable>
<isPropertyAvailable prepend="or" property="OR_attack_event_code_NOT_NULL">
attack_event_code is not null
</isPropertyAvailable>
<isPropertyAvailable prepend="and" property="AND_attack_event_code_EQUALS">
<!-- 用“#”包含起来的内容是某个对象中的变量属性 -->
attack_event_code = #attack_event_code#
</isPropertyAvailable>
<isPropertyAvailable prepend="or" property="OR_attack_event_code_EQUALS">
<!-- 用“#”包含起来的内容是某个对象中的变量属性 -->
attack_event_code = #attack_event_code#
</isPropertyAvailable>
</dynamic>
</sql>
以本例中最后一个<isPropertyAvailable>来说明:当某个对象存在变量属性OR_attack_event_code_EQUALS时,将定义“or attack_event_code = ?”的条件语句,并判断是否是第一个条件。如果是第一个条件则会以“where”来替换“or”,成为“where attack_event_code = ?”,而“?”将以某个对象中变量属性attack_event_code的值来替换。
说明:在本例中,OR_attack_event_code_EQUALS并不是VO对象的变量属性,因此将会有一个新的Java类来提供该变量属性,这在之后的介绍中可以看到,这种做法是非常灵活的。
<!-- 定义所有的查询SQL -->
<!-- id声明了该查询的惟一标识 -->
<!-- resultMap属性与<resultMap>元素的id属性匹配表示结果映射到的VO,当查询结果是多条记录时,会返回一个集合 -->
<!-- parameterClass属性是传入参数的类,该类在这里必须使用全限定名-->
<select id="selectByPrimaryKey"
resultMap="fwAttacksolutionResult"
parameterClass="struts.sample.cap11.sample2.entity.Attacksolution">
<!-- <select>元素的实体内容为SQL语句,其中由“#”包含的内容将根据parameterClass属性指定的对象中找到匹配的变量属性值。 -->
select attack_event_code,
attack_mean,
attack_action
from fw_attacksolution
where attack_event_code = #attack_event_code#
</select>
本例中,该<select>元素的含义是:以带条件的预处理SQL查询表fw_attacksolution,条件的“?”参数将通过struts.sample.cap11.sample2.entity.Attacksolution类的attack_event_code变量属性得到,查询结果被返回到<resultMap>元素所指定的VO struts.sample.cap11.sample2.entity.Attacksolution中。
<select id="selectByExample"
resultMap="fwAttacksolutionResult"
parameterClass="java.util.Map">
select attack_event_code,
attack_mean,
attack_action
from fw_attacksolution
<!-- <include>子元素可以包含动态SQL到<select>元素的实体内容中去-->
<!-- 属性refid指定被包含的动态SQL标识,该标识是全局性的-->
<include refid=" fw_attacksolution.example_Where_Clause"/>
<!-- 判断property属性所指定的对象变量属性是否存在 -->
<isPropertyAvailable property="ORDER_BY_CLAUSE">
<!-- 使用“$”,包含的是变量属性值 -->
order by $ORDER_BY_CLAUSE$
</isPropertyAvailable>
</select>
以上这部分仍然使用<select>元素来定义一句查询SQL,不过这部分的SQL复杂一些,因为这是一句动态SQL。在本例中需要注意的是,SQL的传入参数被使用parameterClass属性指定的java.util.Map来传入,这个Map的内容必须符合Map实例put(method, value),在底层框架处理时会如同得到一个POJO的变量属性名、变量属性值一样来取得这个Map中的每一行作为参数名和参数值。
本例的含义是:当传入参数中存在“ORDER_BY_CLAUSE”变量属性时,就将“ORDER_BY_CLAUSE”的值替换$ORDER_BY_CLAUSE$,形成一句完整的order by语句。
说明:“$”和“#”同样都是替换变量属性的值,有什么区别呢?“$”是一般的替换,用变量属性值来替换“$”包含的内容。而“#”与“$”完全是处理方式的区别,包含在“#”中的变量属性值会被用来在带“?”的SQL中替换“?”,进行SQL预处理。
<delete id="deleteByPrimaryKey"
parameterClass="struts.sample.cap11.sample2.entity.Attacksolution">
delete from fw_attacksolution
where attack_event_code = #attack_event_code#
</delete>
<delete>元素也是执行一句SQL,但是它执行的是删除功能的SQL。<delete>元素拥有id、parameterClass和parameterMap三种属性,但是没有resultClass和resultMap这两个返回性质的属性,所以<delete>元素执行后的SQL是无返回值的。
<delete id="deleteByExample"
parameterClass="java.util.Map">
delete from fw_attacksolution
<include refid="fw_attacksolution.example_Where_Clause"/>
</delete>
以上也是一个<delete>元素执行的删除语句,惟一不同的是它有了动态SQL的特性,所以<delete>元素支持所有的动态SQL。
<insert id="insert"
parameterClass="struts.sample.cap11.sample2.entity.Attacksolution">
<!-- 要显式地声明数据库中对应字段的类型 -->
insert into fw_attacksolution (attack_event_code, attack_mean,
attack_action)
values (#attack_event_code:VARCHAR#, #attack_mean:VARCHAR#,
#attack_action:VARCHAR#)
</insert>
<insert>元素执行的是新增记录的SQL语句,它的特性和<delete>元素类似。本例中的insert语句会为表fw_attacksolution插入一条记录,记录中的每个字段都是VARCHAR型,通过parameterClass属性指定的对象来传入变量属性值。
<update id=" updateByPrimaryKey"
parameterClass="struts.sample.cap11.sample2.entity.Attacksolution">
update fw_attacksolution
set attack_mean = #attack_mean:VARCHAR#,
attack_action = #attack_action:VARCHAR#
where attack_event_code = #attack_event_code#
</update>
</sqlMap>
<update>元素执行的是更新记录的SQL语句,它的特性和<delete>、<insert>元素一样,也必须显式地声明所更新的数据库表字段的类型,支持所有的动态SQL。
2. 其他条件判断元素和属性
IBatis框架对于动态SQL的支持不仅提供了<isPropertyAvailable>元素,还提供了其他类似的元素,如下所示:
q <isNotPropertyAvailable>元素:当不存在对象的变量属性时,可以使用元素的实体内容。
q <isNull>元素:当对象的变量属性为null时可以使用元素的实体内容。
q <isNotNull>元素:当对象的变量属性不为null时可以使用元素的实体内容。
q <isEmpty>元素:检查对象的变量属性为空时可以使用元素的实体内容。
q <isNotEmpty>元素:检查对象的变量属性不为空时可以使用元素的实体内容。
以上这些元素都拥有prepend属性和property属性,property属性被作为某个对象的变量属性。prepend属性指定了条件元素,具体如下所示:
q <isEqual>元素:在比较对象与对象之间的变量属性,或对象与静态值相等的条件下,可以使用元素的实体内容。
q <isNotEqual>元素:在比较对象与对象之间的变量属性,或对象与静态值不相等的条件下,可以使用元素的实体内容。
q <isGreaterThan>元素:比较对象与对象之间的变量属性,或对象与静态值是否存在前者大于后者的情况,若存在,可以使用元素的实体内容。
q <isGreaterEqual>元素:比较对象与对象之间的变量属性,或对象与静态值是否存在前者大于且等于后者的情况,若存在,可以使用元素的实体内容。
q <isLessThan>元素:比较对象与对象之间的变量属性,或对象与静态值是否存在前者小于后者的情况,若存在,可以使用元素的实体内容。
q <isLessEqual>元素:比较对象与对象之间的变量属性,或对象与静态值是否存在前者小于且等于后者的情况,若存在,可以使用元素的实体内容
以上这些元素都拥有:prepend、property、compareProperty、compareValue四个属性。prepend属性指定了条件元素;property指定了某个对象的变量属性;compareProperty作为另一个对象的变量属性与property指定的某个对象的变量属性进行比较;compareValue作为一个静态值与property指定的某个对象的变量属性进行比较。compareProperty和compareValue属性至少使用一个。
3. <select>元素的其他属性
<select>元素中,除了本例所提供的属性外,还提供了resultClass、parameterMap两个可选属性。
q resultClass属性明确指定了返回结果的全限定名对象。resultClass并不常用,因为它没有了映射数据库字段的持久化特性。
q parameterMap属性则指定了传入参数的一个标识,读者可以想象到,同样会由<parameterMap>元素来定义一个传入参数的对象,并用id来惟一标识它。的确如此,<parameterMap>和<resultMap>的写法十分类似,但它不必要映射到表中字段,因为仅仅是作为一个传入参数的对象没有持久化的概念。<parameterMap>元素并不常用,parameterMap属性也不常用,一般来说用parameterClass属性已经足够满足大多数的需要了。
4.其他SQL执行元素
除了本例中所见到的执行SQL的元素外,IBatis框架还提供了其他的SQL执行元素。
q <statement>元素,通用的SQL执行元素,可以执行任何SQL语句。在上例中的所有SQL语句,都可以使用<statement>元素来替换。<statement>元素还提供了一个新的属性xmlResultName作为将返回结果生成一个XML文档。
q <procedure>元素,用于执行存储过程。<procedure>元素也提供了xmlResultName属性来返回结果生成XML文档。
相关推荐
`sql-map-2.dtd`文件主要用于定义SQL映射文件的结构。在这个文件中,你可以找到如下的元素和属性定义: 1. `<sql-map>`:根元素,包含了所有SQL语句和结果映射。 2. `<select>`:定义了一个查询语句,可以包含ID、...
### ibatis配置文件、映射文件详解 #### 1. SQL Map Config 文件详解 在ibatis框架中,`sqlMapConfig.xml`是一个非常重要的配置文件,它主要用于设置ibatis的全局配置信息,包括数据库连接信息、环境配置以及其它...
IBatis.NET是SQL Map的一种实现,它是一个持久层框架,用于将SQL查询与.NET应用中的业务逻辑分离。 在Mygeneration_1309_20081006中,内置了IBatisObject模板,这是Mygeneration的一个重要功能。这个模板允许用户...
4. **Mapper接口和XML配置**:IBATIS支持使用Java接口和XML映射文件结合的方式,通过注解或XML配置定义SQL方法。这种方式提高了代码的可读性和可维护性。 5. **Map对象(Map Elements)**:在IBATIS中,Map对象常...
通过本文档的学习,你可以掌握如何使用iBATIS-SqlMaps2来进行数据库操作,包括创建配置文件、定义数据源、以及编写简单的映射文件等内容。此外,本文档还简要介绍了SQLMap的基本架构和设计理念,帮助开发者更好地...
总结来说,"sql-map-2.dtd"和"sql-map-config-2.dtd"是Ibatis 2.x版本中非常关键的组件,它们为XML配置文件提供了结构化规则,使得开发人员能够编写出合法且易于维护的SQL映射文件和全局配置文件。理解并正确使用...
- `<sqlMap>`元素指向了一个具体的SQL映射文件`Person.xml`,该文件包含了与`Person`类相关的SQL语句。 #### 四、总结 本教程通过一个简单的`Person`类示例介绍了如何使用ibatis SQL Maps进行数据库操作。首先,...
在本文中,作者以物流系统开发为实例,介绍了基于iBatis SQL Map实现数据持久层的主要内容,这包括映射关系的建立、SQL Map配置文件的编写,以及SQL Map API的使用。 iBatis SQL Map的核心是基于XML配置文件的映射...
SQL Map 配置文件是 XML 文件,用于设置 iBATIS-SqlMaps-2 的配置信息。配置文件可以设置各种属性,JDBC DataSource 和 SQL Map。在配置文件中,可以方便地统一配置 DataSource 不同的实现。 知识点5:DataSource ...
1. SQL Map:SQL Map是Ibatis的主要配置文件,用于存储SQL语句、结果映射等信息,通常以XML格式存在。 2. SqlSession:SqlSession是与数据库交互的接口,负责执行SQL语句并返回结果。 3. Mapper:Mapper接口,开发者...
1. **SQL Map Configuration File**:这是整个SQL Maps的核心,它包含了所有SQL映射文件的引用,以及数据源和事务管理器的配置。 2. **SQL ID**:每个SQL语句都有一个唯一的ID,这使得在代码中调用SQL时更加方便和...
动态SQL是Ibatis的一大亮点,它允许我们在XML映射文件或Java接口方法中根据条件动态地构建SQL语句。通过使用`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>`, `<trim>`, `<foreach>`等标签,我们...
4. **编写XML映射文件**:定义数据库操作的具体细节,包括SQL语句和参数映射等。 5. **集成测试**:完成基本配置后,进行单元测试确保一切正常运行。 ##### 升级 从1.x版本升级至2.0版本时需要注意以下事项: - *...
SQL Map XML 文件是 iBATIS 的核心配置文件,包含了所有 SQL 映射规则。这些规则包括: - **Mapped Statements**:具体描述了 SQL 语句以及其对应的 Java 对象映射规则。 - **Statement 类型**:如 SELECT、INSERT、...
iBATIS SQL Maps 开发指南是一本专注于介绍iBATIS SQL Map用法的详细教程,旨在帮助开发者深入了解和高效利用这一强大的数据访问框架。iBATIS SQL Map是Java开发中的一个关键组件,它允许程序员将SQL语句与Java代码...
- **定义映射文件**:为了使用iBATIS进行数据库操作,需要定义SQL映射文件,通常命名为 `.xml` 文件。这些文件定义了SQL语句以及它们与Java对象之间的映射关系。 - **SQL语句类型**:iBATIS支持多种SQL语句类型,...
iBATIS SQL Maps的核心概念是SQL Map,它是一个XML文件,包含了SQL语句和结果映射。通过这种方式,SQL逻辑被封装在XML配置文件中,与业务逻辑代码解耦,使得代码更易于维护和测试。在XML文件中,可以定义查询、插入...
SQL Map XML 映射文件是Ibatis的核心组成部分,它定义了数据库操作的映射规则。例如,`<sqlMap>` 元素可以包含多个 `<select>`、`<insert>`、`<update>` 和 `<delete>` 语句,用于执行不同的数据库查询或更新操作。...
最后,`<sqlMap>`节点引用了具体的映射文件,如`userMap.xml`,这个文件包含了SQL语句和结果集映射的详细定义,是iBatis与数据库交互的核心部分。 映射文件`userMap.xml`通常包含以下元素: - `<select>`:定义查询...