`

修改返回ibatis的AutoResultMap

 
阅读更多
/*
 *  Copyright 2004 Clinton Begin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.ibatis.sqlmap.engine.mapping.result;

import com.ibatis.common.beans.*;
import com.ibatis.sqlmap.client.SqlMapException;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.ibatis.sqlmap.engine.scope.StatementScope;
import com.ibatis.sqlmap.engine.type.DomTypeMarker;

import java.sql.*;
import java.util.*;

/**
 * An automatic result map for simple stuff
 */
public class AutoResultMap extends ResultMap {

  /**
   * Constructor to pass in the SqlMapExecutorDelegate
   *
   * @param delegate - the delegate
   */
  public AutoResultMap(SqlMapExecutorDelegate delegate, boolean allowRemapping) {
    super(delegate);
    this.allowRemapping = allowRemapping;
  }

  public synchronized Object[] getResults(StatementScope statementScope, ResultSet rs)
      throws SQLException {
    if (allowRemapping || getResultMappings() == null) {
      initialize(rs);
    }
    return super.getResults(statementScope, rs);
  }

  public Object setResultObjectValues(StatementScope statementScope, Object resultObject, Object[] values) {
    // synchronization is only needed when remapping is enabled
    if (allowRemapping) {
      synchronized (this) {
        return super.setResultObjectValues(statementScope, resultObject, values);
      }
    }
    return super.setResultObjectValues(statementScope, resultObject, values);
  }

  private void initialize(ResultSet rs) {
    if (getResultClass() == null) {
      throw new SqlMapException("The automatic ResultMap named " + this.getId() + " had a null result class (not allowed).");
    } else if (Map.class.isAssignableFrom(getResultClass())) {
      initializeMapResults(rs);
    } else if (getDelegate().getTypeHandlerFactory().getTypeHandler(getResultClass()) != null) {
      initializePrimitiveResults(rs);
    } else if (DomTypeMarker.class.isAssignableFrom(getResultClass())) {
      initializeXmlResults(rs);
    } else {
      initializeBeanResults(rs);
    }
  }

  private void initializeBeanResults(ResultSet rs) {
    try {
      ClassInfo classInfo = ClassInfo.getInstance(getResultClass());
      String[] propertyNames = classInfo.getWriteablePropertyNames();

      Map propertyMap = new HashMap();
      for (int i = 0; i < propertyNames.length; i++) {
        propertyMap.put(propertyNames[i].toUpperCase(java.util.Locale.ENGLISH), propertyNames[i]);
      }

      List resultMappingList = new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData();
      for (int i = 0, n = rsmd.getColumnCount(); i < n; i++) {
        String columnName = getColumnIdentifier(rsmd, i + 1);
        String upperColumnName = columnName.toUpperCase(java.util.Locale.ENGLISH);
        String matchedProp = (String) propertyMap.get(upperColumnName);
        Class type = null;
        if (matchedProp == null) {
          Probe p = ProbeFactory.getProbe(this.getResultClass());
          try {
            type = p.getPropertyTypeForSetter(this.getResultClass(), columnName);
          } catch (Exception e) {
            //TODO - add logging to this class?
          }
        } else {
          type = classInfo.getSetterType(matchedProp);
        }
        if (type != null || matchedProp != null) {
          ResultMapping resultMapping = new ResultMapping();
          resultMapping.setPropertyName((matchedProp != null ? matchedProp : columnName));
          resultMapping.setColumnName(columnName);
          resultMapping.setColumnIndex(i + 1);
          resultMapping.setTypeHandler(getDelegate().getTypeHandlerFactory().getTypeHandler(type)); //map SQL to JDBC type
          resultMappingList.add(resultMapping);
        }
      }
      setResultMappingList(resultMappingList);

    } catch (SQLException e) {
      throw new RuntimeException("Error automapping columns. Cause: " + e);
    }

  }

  private void initializeXmlResults(ResultSet rs) {
    try {
      List resultMappingList = new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData();
      for (int i = 0, n = rsmd.getColumnCount(); i < n; i++) {
        String columnName = getColumnIdentifier(rsmd, i + 1);
        ResultMapping resultMapping = new ResultMapping();
        resultMapping.setPropertyName(columnName);
        resultMapping.setColumnName(columnName);
        resultMapping.setColumnIndex(i + 1);
        resultMapping.setTypeHandler(getDelegate().getTypeHandlerFactory().getTypeHandler(String.class));
        resultMappingList.add(resultMapping);
      }
      setResultMappingList(resultMappingList);
    } catch (SQLException e) {
      throw new RuntimeException("Error automapping columns. Cause: " + e);
    }
  }

  private void initializeMapResults(ResultSet rs) {
    try {
      List resultMappingList = new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData();
      for (int i = 0, n = rsmd.getColumnCount(); i < n; i++) {
        String columnName = getColumnIdentifier(rsmd, i + 1);
        ResultMapping resultMapping = new ResultMapping();
        resultMapping.setPropertyName(setPropertyName(columnName));
        resultMapping.setColumnName(columnName);
        resultMapping.setColumnIndex(i + 1);
        resultMapping.setTypeHandler(getDelegate().getTypeHandlerFactory().getTypeHandler(Object.class));
        resultMappingList.add(resultMapping);
      }

      setResultMappingList(resultMappingList);

    } catch (SQLException e) {
      throw new RuntimeException("Error automapping columns. Cause: " + e);
    }
  }

  private void initializePrimitiveResults(ResultSet rs) {
    try {
      ResultSetMetaData rsmd = rs.getMetaData();
      String columnName = getColumnIdentifier(rsmd, 1);
      ResultMapping resultMapping = new ResultMapping();
      resultMapping.setPropertyName(columnName);
      resultMapping.setColumnName(columnName);
      resultMapping.setColumnIndex(1);
      resultMapping.setTypeHandler(getDelegate().getTypeHandlerFactory().getTypeHandler(getResultClass()));

      List resultMappingList = new ArrayList();
      resultMappingList.add(resultMapping);

      setResultMappingList(resultMappingList);

    } catch (SQLException e) {
      throw new RuntimeException("Error automapping columns. Cause: " + e);
    }
  }

  private String getColumnIdentifier(ResultSetMetaData rsmd, int i) throws SQLException {
    if (delegate.isUseColumnLabel()) {
      return rsmd.getColumnLabel(i);
    } else {
      return rsmd.getColumnName(i);
    }
  }

  private String setPropertyName(String coulumn) {
		//String ch = "" + coulumn.charAt(0);
		//coulumn = coulumn.replaceFirst(ch, ch.toLowerCase());
	    String ch ;
		coulumn=coulumn.toLowerCase();
		for (int index = 0; (index = coulumn.indexOf("_", index)) != -1 && index < coulumn.length() - 1;) {
			index++;
			ch = "" + coulumn.charAt(index);
			coulumn = coulumn.replace("_" + ch, ch.toUpperCase());
		}
		coulumn = coulumn.replace("_", "");
		ch = null;
		return coulumn;
	}
  
}

 

分享到:
评论

相关推荐

    修改ibatis不用重启的方法

    在开发过程中,我们经常需要对数据库访问层进行调整,特别是在使用iBatis这种持久层框架时,修改SQL映射文件是常有的事。然而,每次修改后都需要重启应用服务器,这无疑降低了开发效率。本篇将详细介绍如何在不重启...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    修改ibatis源代码实现物理分页

    因此,我们需要通过修改Ibatis的源代码来实现物理分页,以提高查询效率。 物理分页是直接在数据库层面进行分页,避免了将所有数据加载到内存中的问题。下面我们将详细探讨如何在Ibatis中实现物理分页。 首先,了解...

    ibatis教程,ibatis帮助文档

    但当涉及数据库字段的修改,Hibernate的改动通常较少,iBATIS则需要修改SQL Mapping。 3. 细粒度优化:iBATIS允许开发者进行更细致的SQL优化,例如针对特定场景编写高效的更新或查询语句。 4. 维护性:由于iBATIS的...

    ibatis调存储过程返回游标

    本文将深入探讨如何使用iBatis调用存储过程并返回游标,这是一个在处理复杂数据库操作时常见的需求。 ### iBatis调用存储过程返回游标 #### 存储过程简介 存储过程是预先编译并存储在数据库中的SQL代码块,它可以...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    例如,`DynamicSqlMapClient`类支持动态SQL Map的执行,它可以根据传入的参数动态修改SQL语句,避免了大量的条件分支代码。 此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`...

    ibatis api,ibatis文档,ibatis说明文档

    4. 参数映射和结果映射:详细解释了如何处理输入参数和返回结果,包括自动类型匹配、级联映射等。 5. 事务管理:介绍如何使用Ibatis进行事务控制,包括手动和自动事务。 6. 缓存:Ibatis提供了本地缓存和二级缓存...

    解决IBatis缓存动态字段问题

    3. **测试验证**:在完成修改后,需要对所有相关的查询进行测试,确保修改后的代码能够正确地处理不同的动态表名和字段名,并且能够返回正确的结果。 #### 总结 通过在 `&lt;select&gt;` 标签中设置 `remapResults="true...

    ibatis入门与ibatis迭代的用法

    **ibatis入门** iBatis,一款轻量级的Java持久层框架,是MyBatis的前身,由美国华人开发团队开发。它提供了一个SQL、Java和XML的映射框架,将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作,避免...

    Ibatis入门例子,Ibatis教程

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...

    Ibatis

    2.4 结果处理:查询操作返回的结果会被自动映射到 Java 对象,更新操作返回受影响的行数。 **3. 动态 SQL** Ibatis 的一大亮点是支持动态 SQL,开发者可以在 SQL 映射文件中使用条件判断、循环等结构,使得 SQL ...

    ibatis入门

    Ibatis 会自动处理查询结果,如果返回多条记录,只会返回第一条。确保 SQL 语句的条件能够唯一确定一条记录。 6. **数据集合查询** 对于查询结果集的情况,使用 `selectList` 方法。它会返回一个 List 对象,每个...

    ibatis基础教学文档

    2. 执行映射的Statement,iBATIS创建PreparedStatement,填充参数,执行SQL并从结果集中构建返回对象。 3. 返回结果,对于更新操作,返回受影响的行数;对于查询,返回对象或对象集合。 基础知识点包括: 1. ...

    Ibatis3手册 Ibatis3参考手册

    ### Ibatis3手册知识点概述 Ibatis3作为一款流行的持久层框架,在软件开发领域具有重要的地位。本篇文章基于“Ibatis3手册 Ibatis3参考手册”的标题及描述,深入解析Ibatis3的核心概念、架构特点以及如何进行实际...

    ibatis2指南及ibatis包

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

    ibatis应对批量update

    ### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往会导致效率低下。这是因为每一次循环都需要执行一次数据库连接操作,对于批量更新来说,这样的处理方式显然不够高效。为了解决这个问题,...

    ibatis api 帮助文档+IBATIS 开发文档

    **IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...

    Spring与iBATIS的集成

    Spring与iBATIS的集成 iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。但正如Spring A Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比...

Global site tag (gtag.js) - Google Analytics