`

ibaits2中要注意remapResults

阅读更多
在ibatis2中,要注意动态列,动态表是可以使用的,比如:

select $filelist from assetlocationmapping where $colname$ = #colvalue#

然后

Map deleteinAssetLocationMapping=new HashMap();
deleteinAssetLocationMapping.put("colname",colname);
deleteinAssetLocationMapping.put("colvalue",colvalue)
就是传一个MAP进去,就可以实现动态列了,但要注意,在配置文件中,
要加上:
<select id="selectBySql" resultClass="java.util.HashMap"
remapResults="true">中的remapResults="true",默认为FALSE,参考手册说明如下:


Proper Usage of remapResults="true"
The remapResults attribute is available on 【statement】, 【select】, and 【procedure】 mapped statements. It is an optional attribute and the default value is false.
The remapResults attribute should be set to true when a query has a variable set of return columns. For example, consider the following queries:
在 【statement】, 【select】, 和【procedure】 标签中存在一个可选的属性【remapResults】,默认值是false.
如果每次查询的列不定的话,这个属性需要设置为true.如下所例:
xml 代码
SELECT $fieldList$  
  FROM table 
In this example, the list of column names is dynamic, even though the table is always the same.
在这个例子中,虽然检索的是同一张表,可是每次查询的列却是可变的。
xml 代码
SELECT *  
  FROM $someTable$ 
In this example, the table could be different. Because of the usage of * in the SELECT clause, the resulting columns names could be different, as well.
在这个例子中,因为在Select中使用了*匹配符,所以查询的列会随着表名的不同而发生变化。
Since the overhead to introspect the result set metadata is not trivial, iBATIS will remember what was returned the last time the query was run. This could create problems in situations similar to the examples above.
为了避免经常的对返回的结果进行内省,iBATIS会记录上一次查询结果的元数据,这样,在遇到上面的例子时就会出现问题。


Let's consider what iBATIS will do for the first example depending on the usage of remapResults.
让我们了解一下,iBATIS是如何依赖remapResults属性的。
Without remapResults, or remapResults="false":
当没有设置remapResults属性,或者设置remapResults为false时:
Let's say $fieldList$ is set to "fld1, fld2" the first time the query is executed, thus giving the query:
假设在第一次查询时,$fieldList$设置为"fld1, fld2" ,查询语句等效下面的SQL:
xml 代码
SELECT fld1, fld2  
  FROM table 
iBATIS will try to be efficient by assuming that fld1 and fld2 will always be in the result set on each subsequent execution of the query.
The application will run into trouble if the value for $fieldList$ changes, such as "fld3, fld4". Not only will iBATIS be unable to find fld1 and fld2 in the result set,
thus returning improper results, iBATIS won't know about fld3 and fld4 because they weren't in the query on its initial execution.
iBATIS为了效率,假设这条SQL语句今后的查询结果都会返回fld1和fld2列。
如果后面$fieldList$发生变化,比如设置为 "fld3, fld4",程序将会遇到一些麻烦。不仅仅是iBATIS找不到fld1和fld2列那么简单,
麻烦的是,iBATIS也不会识别fld3和fld4,因为在SQL初始化的时候,这两列并没有包括在内。
With remapResults="true":
iBATIS will introspect the result set metadata every time the query is run and will always return the proper results. This feature comes at some performance cost, so only use it if you really need it – when the columns in the result set are variable, either directly, like in the first example, or indirectly, because of a variable table.
当设置remapResults为"true"时:
iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用--查询列发生变化,直接的,如第一个例子一样,或者隐含的,如第二个例子,检索的表发生变化。
分享到:
评论

相关推荐

    解决IBatis缓存动态字段问题

    通过在 `&lt;select&gt;` 标签中设置 `remapResults="true"`,可以有效地解决IBatis缓存动态字段带来的问题。这不仅避免了因缓存错误而导致的查询失败,还确保了程序能够灵活地处理动态表名和字段名。同时,需要注意的是,...

    ibatis2指南及ibatis包

    ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南

    ibatis官方中文文档

    对于那些想要了解或深入掌握iBATIS,特别是想在实际项目中使用iBATIS存储过程的开发者来说,这是一份非常宝贵的学习资料。 **iBATIS简介** iBATIS(现更名为MyBatis)是一个优秀的Java持久层框架,它简化了数据库...

    ibatis2.rar

    "ibatis2.rar"这个压缩包文件包含了关于iBATIS 2.x版本的学习资料,主要包括了iBATIS与Spring的集成以及环境搭建的相关教程。 《iBATIS与Spring集成及环境搭建 - 振华 - ITeye技术网站.htm》这篇文档可能详细介绍了...

    ibatis+struts2

    【描述】"ibatis+struts2 Demo"是一个实战项目,展示了如何在实际开发中运用这两个框架来实现基本的数据库CRUD(创建、读取、更新、删除)操作。iBatis是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提高了...

    iBATIS 2 文档

    iBATIS 2是iBATIS的早期版本,它在当时的Java Web开发领域中扮演了重要角色,尤其在数据访问层(DAL)的实现上,提供了比传统的JDBC更高效、更易维护的解决方案。文档中可能会涵盖以下几个关键知识点: 1. **概念...

    ssh2+ibatis框架

    SSH2+IBATIS框架是Java开发中常用的一套企业级应用开发框架组合,它将Spring、Hibernate、Struts2和iBatis等组件融合在一起,以提高开发效率和实现松耦合。以下是对这些框架及其整合方式的详细说明: **Spring框架*...

    ibatis2mybatis-master.zip

    标题“ibatis2mybatis-master.zip”所指的是一款工具或服务,用于将基于iBATIS的数据访问框架的代码自动转换为使用MyBatis框架的代码。iBATIS和MyBatis都是Java开发中常用的持久层框架,它们帮助开发者简化数据库...

    struts2+ibatis

    在Struts2和iBatis的组合中,Spring可以作为容器管理它们的生命周期,同时也可以提供事务管理,进一步提高了应用的可维护性和可扩展性。 将这三个框架整合在一起,通常的做法是: 1. 使用Spring管理Struts2的...

    iBatis net版中文 1.6的

    2. 动态SQL:支持在SQL语句中进行条件判断、循环等动态操作,增强了SQL的灵活性。 3. 易于集成:可与各种ORM(对象关系映射)工具结合使用,如MyBatis Generator,自动生成实体类和Mapper接口。 4. 性能高效:由于...

    ibatis2.X升级mybatis3.X之曲径通幽处

    最后,从Ibatis2.x到Mybatis3.x的迁移过程中,需要注意兼容性问题。升级前,需要全面评估现有的SQL Map配置、Mapper接口和实体类,确保在新的版本下能够正常工作。此外,还需要检查和更新相关的依赖库,因为Mybatis3...

    ibatis2.0中文API

    在iBATIS 2.0中文API中,我们可以深入理解这个框架的核心功能和用法,包括一对多、多对一的关系映射、属性设置以及解决方案的详细解析。 首先,一对多和多对一的关系映射是ORM(对象关系映射)中的关键概念。在...

    Struts2+Spring2+iBatis2整合的例子

    Struts2、Spring和iBatis是Java Web开发中三个非常重要的框架,它们分别负责表现层、业务层和数据访问层。将这三个框架整合在一起,可以实现MVC(Model-View-Controller)架构,提高应用的灵活性和可维护性。 **...

    ibatis2小例子(转)

    描述虽然为空,但根据标题和标签,我们可以推测博主可能在博文中分享了他们对iBatis2的理解和应用经验,可能包括了一些实用技巧或常见问题的解决方案。 标签 "源码" 和 "工具" 提示我们,内容可能包含了源代码示例...

    Struts2+Spring2+iBatis2+MySQL的完整示例

    开发环境说明 ...本示例完整地结合Struts2+Spring2+iBatis2+MySQL5,演示了一个用户表的增、删、改、查。 想完整学习Struts2+Spring+iBatis的同仁,可以在这个例子中学习或模仿最基本也是最核心的技术要点。

    iBatis2学习笔记

    1.iBatis2学习笔记:基本原理和配置.doc 2.iBatis2学习笔记:与Spring2的整合.doc 3.iBatis2学习笔记:单表映射 .doc 4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc ...

    Struts2+IBatis整合

    Struts2和iBatis是两个非常著名的Java开源框架,它们在Web开发中扮演着重要的角色。Struts2是一款强大的MVC(Model-View-Controller)框架,它为构建基于J2EE的Web应用程序提供了全面的架构支持。而iBatis则是一个...

Global site tag (gtag.js) - Google Analytics