/* * 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这种持久层框架时,修改SQL映射文件是常有的事。然而,每次修改后都需要重启应用服务器,这无疑降低了开发效率。本篇将详细介绍如何在不重启...
Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...
因此,我们需要通过修改Ibatis的源代码来实现物理分页,以提高查询效率。 物理分页是直接在数据库层面进行分页,避免了将所有数据加载到内存中的问题。下面我们将详细探讨如何在Ibatis中实现物理分页。 首先,了解...
但当涉及数据库字段的修改,Hibernate的改动通常较少,iBATIS则需要修改SQL Mapping。 3. 细粒度优化:iBATIS允许开发者进行更细致的SQL优化,例如针对特定场景编写高效的更新或查询语句。 4. 维护性:由于iBATIS的...
本文将深入探讨如何使用iBatis调用存储过程并返回游标,这是一个在处理复杂数据库操作时常见的需求。 ### iBatis调用存储过程返回游标 #### 存储过程简介 存储过程是预先编译并存储在数据库中的SQL代码块,它可以...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将SQL语句与Java代码分离,从而更好地管理数据库操作。Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,...
《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...
例如,`DynamicSqlMapClient`类支持动态SQL Map的执行,它可以根据传入的参数动态修改SQL语句,避免了大量的条件分支代码。 此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`...
4. 参数映射和结果映射:详细解释了如何处理输入参数和返回结果,包括自动类型匹配、级联映射等。 5. 事务管理:介绍如何使用Ibatis进行事务控制,包括手动和自动事务。 6. 缓存:Ibatis提供了本地缓存和二级缓存...
3. **测试验证**:在完成修改后,需要对所有相关的查询进行测试,确保修改后的代码能够正确地处理不同的动态表名和字段名,并且能够返回正确的结果。 #### 总结 通过在 `<select>` 标签中设置 `remapResults="true...
**ibatis入门** iBatis,一款轻量级的Java持久层框架,是MyBatis的前身,由美国华人开发团队开发。它提供了一个SQL、Java和XML的映射框架,将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作,避免...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写SQL语句上,而无需关注JDBC代码的编写。Ibatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集的...
2.4 结果处理:查询操作返回的结果会被自动映射到 Java 对象,更新操作返回受影响的行数。 **3. 动态 SQL** Ibatis 的一大亮点是支持动态 SQL,开发者可以在 SQL 映射文件中使用条件判断、循环等结构,使得 SQL ...
Ibatis 会自动处理查询结果,如果返回多条记录,只会返回第一条。确保 SQL 语句的条件能够唯一确定一条记录。 6. **数据集合查询** 对于查询结果集的情况,使用 `selectList` 方法。它会返回一个 List 对象,每个...
2. 执行映射的Statement,iBATIS创建PreparedStatement,填充参数,执行SQL并从结果集中构建返回对象。 3. 返回结果,对于更新操作,返回受影响的行数;对于查询,返回对象或对象集合。 基础知识点包括: 1. ...
### Ibatis3手册知识点概述 Ibatis3作为一款流行的持久层框架,在软件开发领域具有重要的地位。本篇文章基于“Ibatis3手册 Ibatis3参考手册”的标题及描述,深入解析Ibatis3的核心概念、架构特点以及如何进行实际...
- 可以自定义MyBatis拦截器,对输入参数进行编码转换,或者在返回结果前进行解码处理。 6. **日志记录**: - 日志输出时,确保日志框架(如Log4j、SLF4J等)的配置文件中指定了正确的字符集,避免在打印SQL语句时...
ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南
### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往会导致效率低下。这是因为每一次循环都需要执行一次数据库连接操作,对于批量更新来说,这样的处理方式显然不够高效。为了解决这个问题,...
**IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...