原文链接
http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+reuse+SQL-fragments
When writing SqlMaps, you often encounter duplicate fragments of SQL, for example a FROM-clause or constraint-statement; iBATIS offers a simple yet powerful tag to reuse them. For the sake of simplicity, let's assume we want to get some items and we want to do a count on them.
Normally, you would write something like this:
当我们写SqlMaps的时候,经常会碰到重复的SQL片段,例如From语句或者约束条件;iBATIS提供了一个强大的标签来复用这些重复片段,简单举例,我们想检索一些字段,并且想统计它们。
通常情况下,你会这样写:
xml 代码
- <select id="selectItemCount" resultClass="int">
- SELECT COUNT(*) AS total
- FROM items
- WHERE parentid = 6
- select>
- <select id="selectItems" resultClass="Item">
- SELECT id, name
- FROM items
- WHERE parentid = 6
- select>
-
To eliminate this duplication, we use the tags 【sql】 and 【include】. The 【sql】-tag contains the fragment to reuse, the 【include】-tag to include such a fragment:
为了消除重复片段,我们使用【sql】和【include】标签。【sql】标签用来包含重复片段,【include】标签用来引入片段:
xml 代码
- <sql id="selectItem_fragment">
- FROM items
- WHERE parentid = 6
- sql>
- <select id="selectItemCount" resultClass="int">
- SELECT COUNT(*) AS total
- <include refid="selectItem_fragment"/>
- select>
- <select id="selectItems" resultClass="Item">
- SELECT id, name
- <include refid="selectItem_fragment"/>
- select>
-
The 【include】-tag is namespace-aware so you can refer to fragments even when they are located in another map (however, due to the way iBATIS loads the SqlMaps, the included fragment should be loaded before the including statement).
【inclued】标签是一个命名空间可知的,所以你可以引入其他map的片段.(但是,因为iBATIS引入SqlMap的顺序,被引入的片段,要优先于欲引入的sql部分被导入)
The fragments are included and processed on query-execution so parameters can be used too:
重复片段在查询执行时被引入和执行,所以参数依然可以使用:
xml 代码
- <sql id="selectItem_fragment">
- FROM items
- WHERE parentid = #value#
- sql>
- <select id="selectItemCount" parameterClass="int" resultClass="int">
- SELECT COUNT(*) AS total
- <include refid="selectItem_fragment"/>
- select>
- <select id="selectItems" parameterClass="int" resultClass="Item">
- SELECT id, name
- <include refid="selectItem_fragment"/>
- select>
-
分享到:
相关推荐
上述示例中,`userNameList`是一个List类型的集合,`<iterate>`标签会遍历该集合中的所有元素,并为每个元素生成如下的SQL片段:`AND (username=#userNameList[0] OR username=#userNameList[1] OR ...)`。...
- **SQL 片段重用**:通过 `<sql>` 元素定义通用的 SQL 片段,提高代码复用性。 - **键值自动生成**:配置主键自增或其他机制来自动为新记录生成唯一的标识符。 - **存储过程**:支持调用数据库中的存储过程,并处理...
通过<sql>元素可以复用SQL片段,、、和元素分别对应SQL查询、插入、更新和删除操作。 4. **动态SQL**:iBATIS支持条件式SQL,可以通过if、where、choose(when/otherwise)、trim、foreach等元素构建动态SQL,使得...
SQL映射文件中的<sql>标签可以复用SQL片段,、、、标签分别对应查询、插入、更新和删除操作。动态SQL是iBatis的一大亮点,通过、、、等标签,可以在运行时根据条件动态生成SQL语句。 此外,iBatis支持预编译的...
2. 引入了`<include/>`节点,支持SQL片段的重用,提高代码的可维护性和复用性。 3. 添加了对字典查询的支持,即`QueryForDictionary, V>(...)`方法,使得查询结果可以映射到字典中,方便数据处理。 4. 允许存储过程...
4. **代码复用**:封装常用的 SQL 动态构建逻辑,减少重复代码。 通过以上分析,我们可以看出 iBatis 在处理动态 SQL 方面具有很大的灵活性和扩展性。在实际开发过程中,合理利用 iBatis 可以极大地提高开发效率和...
11. **<sql>SQL语句片段**:定义可重用的SQL片段,方便在多个SQL语句中复用。 12. **组合语句**:用于包含另一个SQL片段,实现SQL语句的组合。 13. ****:定义主键生成策略,常用于自动填充主键字段。 这些标签...
为了提高代码复用性,iBATIS还支持将动态SQL片段定义为独立的`<sql>`标签,如: ```xml <sql id="queryCondition"> where user_id = #{userId} </sql> select * from user <!-- 引入动态的查询条件 --...
- 使用<sql>元素复用SQL片段 - 、、和元素的使用 - 动态SQL:、、、等标签的应用 4. **Java接口绑定**: - 定义Mapper接口 - 映射接口方法到SQL语句 - 使用@Select、@Insert、@Update、@Delete注解 5. **...
7. `iBatis.inc`:这个文件可能是一个包含文件,其中包含了常量、宏定义或者共享的代码片段,可以被其他模板引用,提高代码复用性。 通过这些模板,开发者可以快速地根据数据库结构生成完整的DAL层和部分Service层...
- **二元条件标签**:如`<where>`、`<set>`,用于生成带有条件的SQL片段。 - **其它标签**:如`<foreach>`,用于循环生成SQL片段。 #### 高级查询技术 - **映射继承**:支持继承映射关系,简化重复的映射配置。 - ...
为了提高代码复用性和维护性,iBATIS支持重用SQL片段。通过定义通用的SQL模板并在不同的Mapped Statements中引用它们,可以有效减少重复代码。 ##### 4. Auto-Generated Keys 对于需要自动生成主键的情况,iBATIS...
2. 通过节点标识,支持了SQL片段的复用,使得SQL代码更加模块化。 3. 增加了对字典查询的支持,通过IDictionary,V>QueryForDictionary,V>()方法提供了直接查询字典对象的功能。 4. 支持存储过程无参数映射,简化了...
- **SQL 元素**:可以将通用的SQL片段抽取出来,提高代码复用性。 - **参数处理**:支持动态SQL,例如条件判断、循环等。 - **结果映射**(`resultMap`):用于定义SQL查询结果如何映射到Java对象,支持复杂的一对一...
2. **动态SQL**:iBATIS允许在SQL语句中使用条件判断,使得SQL可以根据传入参数的不同动态生成,提高了代码的可复用性。 3. **事务管理**:iBATIS提供了简单的事务控制,可以在代码中手动开启、提交或回滚事务。 4...
例如,使用`<if>`标签可以判断条件是否满足,然后决定是否执行相应的SQL片段。 4. **结果映射**: - 结果映射用于将数据库查询结果映射到Java对象,通过`<resultMap>` 标签定义字段与Java对象属性的对应关系,支持...