`
iamxi
  • 浏览: 192251 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Mybatis返回特殊Map

    博客分类:
  • Java
 
阅读更多

想返回个特殊实体,一个Map,key是一个表的一个字段的值,value是另一个表的所有记录。参考了下网上的“攻略”,不过和攻略里面讲的有点不同,那里面key的值value的实体实在同一个表内,如果不同表,会报缺少set方法的异常。解决方法很简单,就是在实体里面加个字段对应的属性。但是并不愿意为了一个查询语句就要去改变实体。
   无聊看了下session的select,提供了通过ResultHandler来处理返回的结果集。所以尝试着解决这个问题。

mapper.xml里面的配置如下:

<resultMap type="HashMap" id="testMap">
  	<result column="UA_INFO" property="key" />
    <association property="value" resultMap="com.xxx.xxx.BaseResultMap"></association>
  </resultMap>


<select id="getUaMapByTimestamp" parameterType="Map" resultMap="testMap">
  SQL语句
</select>
 

 com.xxx.xxx.BaseResultMap是另一个实体的mapper的resultMap。
这个查询,返回的每一条记录都是
{key=..., value=...}

这个结果集并不符合要求。不过通过ResultHandler来处理每一条记录就可以达到要求了。
看下Mybatis源码里面有关继承ResultHandler的DefaultMapResultHandler类。

public class DefaultMapResultHandler<K, V> implements ResultHandler {

  private final Map<K, V> mappedResults;
  private final String mapKey;

  @SuppressWarnings("unchecked")
  public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory) {
    this.mappedResults = objectFactory.create(Map.class);
    this.mapKey = mapKey;
  }

  public void handleResult(ResultContext context) {
    // TODO is that assignment always true?
    final V value = (V) context.getResultObject();
    final MetaObject mo = MetaObject.forObject(value);
    // TODO is that assignment always true?
    final K key = (K) mo.getValue(mapKey);
    mappedResults.put(key, value);
  }

  public Map<K, V> getMappedResults() {
    return mappedResults;
  }
}
 

这个DefaultMapResultHandler实现handleResult接口,处理每条数据。

 

可以模仿这个类写个类来装配自己所需要的Map。

private class MapResultHandler implements ResultHandler {

		@SuppressWarnings("rawtypes")
		private final Map mappedResults = new HashMap();
		
		@SuppressWarnings({ "unchecked", "rawtypes" })
		@Override
		public void handleResult(ResultContext context) {
			Map map = (Map) context.getResultObject();
			mappedResults.put(map.get("key"), map.get("value"));
		}
		
		public Map getMappedResults() {
			return mappedResults;
		}
		
	}

 

this.getSqlSession().select(getWholeSqlId("getUaMapByTimestamp"),handler);

 这样就可以得到需要的结果集了。

分享到:
评论

相关推荐

    mybatis实战

    对于特殊的数据类型,Mybatis允许开发者自定义TypeHandler,实现Java类型与数据库类型的转换,以满足特定需求。 13、Mybatis缓存机制 Mybatis内置了本地缓存和二级缓存,可以提高数据读取速度,减少数据库访问。...

    mybatis-3.0.4源码

    MyBatis的TypeHandler接口定义了Java类型与JDBC类型之间的转换,系统内置了一些常见的类型处理器,同时支持自定义类型处理器以处理特殊类型。 通过对`mybatis-3.0.4源码`的深入研究,开发者不仅可以理解MyBatis的...

    mybatis jar 文件和学习文档

    MyBatis可以使用简单的XML或注解进行配置和原始映射,可以将基本类型、Map接口和Java POJOs(纯老式Java对象)映射到数据库记录。 #### 1.1.2 如何改进文档? 如果发现文档存在任何不足之处或者缺少对某项特性的...

    mybatis3 源码

    它可以处理基本类型、POJO、Map等各种返回类型。源码分析有助于理解MyBatis如何根据结果集和结果映射配置创建目标对象。 8. **TypeHandler** TypeHandler是MyBatis中处理Java类型和JDBC类型之间转换的关键组件。...

    java+mybatis+mysql查询结果集的映射问题.pdf

    然而,如果数据库字段的值为null,该字段将不会出现在返回的Map中。为了避免这个问题,可以在SQL查询中使用`IFNULL()`函数来处理可能的null值。 接下来,我们探讨第二种方式,使用实体类进行结果映射。这种方式需要...

    MyBatis.rar

    MyBatis内置了许多常见的类型处理器,同时允许用户自定义类型处理器以处理特殊类型。 8. **Mapper动态代理**:当使用注解配置时,MyBatis会生成Mapper的动态代理类,使得我们可以在不接触SqlSession的情况下调用...

    MyBatis技术文档.pdf

    #### 七、特殊SQL的执行 1. **模糊查询**: - 通过 LIKE 语句实现。 2. **批量删除**: - 在 SQL 语句中使用 IN 子句实现。 3. **动态设置表名**: - 通过变量或表达式动态指定表名。 4. **添加功能获取自增的主键**...

    MyBatis3_用户指南(附JavaDB实例)

    MyBatis可以通过简单的XML格式或者注解进行配置,并且能够映射基本数据元素、Map接口和POJOs(普通Java对象)到数据库中的记录。 MyBatis的所有应用都是以SqlSessionFactory实例为中心的。SqlSessionFactory实例...

    36道面试常问的MyBatis面试题!.zip

    javaType指定Java对象的类型,jdbcType对应数据库中的数据类型,主要用于Oracle等数据库的特殊类型处理。 23. **MyBatis的标签有什么作用?** 标签定义可重用的SQL片段,提高代码复用。 24. **MyBatis如何处理...

    mybatis中注解映射SQL示例代码

    例如,我们通过SQL查询学生的stud_id和name,并期望返回一个map,其中key是stud_id,value是name。 ```java public interface ResultHandler { void handleResult(ResultContext context); } Map, String&gt; map = ...

    JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)习题(2022).pdf

    8. MyBaits 中 &lt;trim&gt; 元素:&lt;trim&gt; 元素的作用是去除一些特殊的字符串,它的 prefix 属性代表的是语句的前缀,而 prefixOverrides 属性代表的是需要去除的哪些特殊字符串。 9. MyBaits 映射文件:&lt;include&gt; 元素的...

    ibatis调存储过程返回游标

    对于返回游标的存储过程,还需要定义一个特殊的`parameter`,其`javaType`为`java.sql.ResultSet`,并使用`resultMap`属性关联上述定义的`resultMap`: ```xml &lt;parameterMap class="hashmap" id="pro_cursor_map"&gt;...

    1000道 互联网Java架构师面试题 485页_.pdf

    - MyBatis 提供更多的 SQL 控制权,适合对 SQL 优化有特殊需求的项目。 - Hibernate 是全自动 ORM 框架,适用于快速开发,无需关注 SQL,但可能性能稍逊。 6. MyBatis 的分页通常需要借助于数据库特定的分页语法...

    1000道互联网Java工程师面试题485页.pdf

    11. **SQL执行结果封装**:使用映射文件或注解来定义对象与字段之间的映射关系,通过结果集映射返回目标对象。 12. **批量插入**:可以使用`&lt;foreach&gt;`标签或手动构造批量插入的SQL语句。 13. **获取自动生成键值*...

    ibatis2讲义

    iBATIS(现称为 MyBatis)是一个开源的持久层框架,最初由Clinton Begin在2001年发起。它主要用于处理关系型数据库的持久化层,提供了一种高效的方式来执行SQL语句并映射结果到Java对象。 #### 2. 为什么要用IBATIS...

    单点登录源码

    zheng.jtotop.js | 返回顶部插件 | [https://github.com/shuzheng/zheng.jtotop.js](https://github.com/shuzheng/zheng.jtotop.js) #### 架构图 ![架构图](project-bootstrap/architect.png) #### 模块依赖 !...

    Java技术面试 ---- 框架.md

    它将直接替换参数值到 SQL 语句中,不进行任何特殊处理。通常用于需要字符串拼接的情况,如表名、列名等。 例如: ```sql SELECT * FROM ${tableName} ``` 如果 `tableName` 的值为 `'table'`,则生成的 SQL ...

    JAVA相关面试题,Spring面试题

    - **rowid**: rowid是Oracle中的一个特殊数据类型,表示表中每行的唯一地址。 #### 二十、简述Oracle执行计划的概念? - **Oracle执行计划**: Oracle执行计划是指数据库优化器选择的一组操作,用于确定如何执行SQL...

    Java 最常见 200+ 面试题全解析:面试必备.docx

    在这个例子中,尽管 `str1` 和 `str2` 的 `hashCode()` 可能相同,但 `str1.equals(str2)` 返回 `false`,表明它们的值不同。 #### 容器 - Java 中的容器主要分为集合(Collection)和映射(Map)两大类。 - **...

Global site tag (gtag.js) - Google Analytics