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

源码分析 iBatis简单动态SQL处理($$)

阅读更多

  在iBatis中对于$param$的处理方法是怎么样的呢?下面将通过源码解读具体的处理逻辑

 

public class SimpleDynamicSql implements Sql {

  private static final Probe PROBE = ProbeFactory.getProbe();

  // 分词字符
  private static final String ELEMENT_TOKEN = "$";

  private String sqlStatement;

  private SqlMapExecutorDelegate delegate;

  public SimpleDynamicSql(SqlMapExecutorDelegate delegate, String sqlStatement) {
    this.delegate = delegate;
    this.sqlStatement = sqlStatement;
  }
// 获取sql
  public String getSql(StatementScope statementScope, Object parameterObject) {
    return processDynamicElements(sqlStatement, parameterObject);
  }

  public ParameterMap getParameterMap(StatementScope statementScope, Object parameterObject) {
    return statementScope.getParameterMap();
  }

  public ResultMap getResultMap(StatementScope statementScope, Object parameterObject) {
    return statementScope.getResultMap();
  }

  public void cleanup(StatementScope statementScope) {
  }
// 如果sql不为null且存在$则认为是简单动态sql
  public static boolean isSimpleDynamicSql(String sql) {
    return sql != null && sql.indexOf(ELEMENT_TOKEN) > -1;
  }

  private String processDynamicElements(String sql, Object parameterObject) {
  // 新建一个分词工具
    StringTokenizer parser = new StringTokenizer(sql, ELEMENT_TOKEN, true);
    StringBuffer newSql = new StringBuffer();

    String token = null;
    String lastToken = null;
	//如果sql中含有$
    while (parser.hasMoreTokens()) {
	// 获取第一个分词对象
      token = parser.nextToken();
		//如果最后一个分词对象等于$
      if (ELEMENT_TOKEN.equals(lastToken)) {
        if (ELEMENT_TOKEN.equals(token)) {
          newSql.append(ELEMENT_TOKEN);
          token = null;
        } else {
// 如果lastToken=$且token不等于$则将token替换为token对应的属性值,默认为空字符串
          Object value = null;
          if (parameterObject != null) {
            if (delegate.getTypeHandlerFactory().hasTypeHandler(parameterObject.getClass())) {
              value = parameterObject;
            } else {
              value = PROBE.getObject(parameterObject, token);
            }
          }
          if (value != null) {
            newSql.append(String.valueOf(value));
          }
          //获取下一个分词,如果下一个分词不是$则抛出异常
          token = parser.nextToken();
          if (!ELEMENT_TOKEN.equals(token)) {
            throw new SqlMapException("Unterminated dynamic element in sql (" + sql + ").");
          }
          token = null;
        }
		// 如果最后一个分词对象不等于$
      } else {
	     //如果当前分词不是$在将当前分词追加在newSql中
        if (!ELEMENT_TOKEN.equals(token)) {
          newSql.append(token);
        }
		// 如果当前分词等于$则不做任何处理
      }
		//将当前分词赋值给最后一次分词
      lastToken = token;
    }

    return newSql.toString();
  }


}

 

 例如:select * from $a$,param={a,tax_refund_info}的分词结果是:


select * from

$

a

$

第一次循环:
  lastToken=null,
  token=select*from
 
  lastToken!=$

  newSql=select* from
 
 lastToken=select*from
 
第二次循环
  lastToken=select * from
  token=$
 //doNothing
 lastToken=$
第三次循环
  lastToken=$
  token=a;
 
  newSql=select * from tax_refund_info
 
 第三次循环
   lastToken=a;
   token=$
   //doNothing
   newSql=select * from  tax_refund_info
  
 我们可以发现这样的查询完全无法防止SQL注入攻击。

 

0
0
分享到:
评论

相关推荐

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

    本文将通过分析iBatis的源码,深入探讨其设计理念和实现机制。 一、iBatis架构概述 iBatis主要由SqlMapConfig.xml配置文件、SqlMap接口和Executor执行器三大部分构成。SqlMapConfig.xml配置文件定义了数据源、事务...

    ibatis源码

    阅读和分析iBATIS源码,可以帮助开发者: 1. **理解工作原理**:了解iBATIS如何解析SQL映射文件,如何执行SQL,如何处理结果集映射,以及事务控制等关键流程。 2. **优化性能**:通过源码,可以找出可能的性能瓶颈...

    iBATIS框架源码剖析源码

    通过深入分析iBATIS的源码,开发者不仅可以了解其工作原理,还能学习到设计模式、数据库访问的最佳实践以及如何优雅地处理数据库操作。对于提升Java开发者的技能和理解数据库访问层的实现有极大的帮助。在实际开发中...

    ibatis打印sql

    标题 "ibatis打印sql" 涉及到的是在使用iBATIS(一个轻量级的持久层框架)时如何调试和查看SQL语句的方法。iBATIS允许开发者编写SQL语句并将其与Java代码集成,以实现灵活的数据访问。在开发过程中,为了调试和优化...

    打log4j日志-ibatis的sql输出

    在默认情况下,Ibatis并不会自动打印执行的SQL语句,但通过配置,我们可以使Ibatis在运行时输出SQL,这对于调试和性能分析非常有帮助。 要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-...

    iBATIS-SqlMaps-中文教程

    11. **源码分析**:对于进阶读者,可以进一步研究iBATIS的源码,了解其实现原理,有助于更深入地理解框架。 12. **工具支持**:介绍一些辅助开发的工具,如MyBatis Generator,它可以自动生成iBATIS相关的Java代码...

    ibatis源码+api文档+jar包

    接下来,关于源码分析: 1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和...

    ibatis2.3-src

    《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。...在实际项目中,结合源码分析,能够更好地定制和扩展iBatis,满足特定的业务需求。

    iBATIS框架源码剖析pdf第二部分

    在源码分析部分,你会看到iBATIS如何加载和解析XML配置文件,如何执行SQL语句,以及如何处理异常。这部分内容对于理解iBATIS的工作流程至关重要,它将帮助你更好地调试和优化基于iBATIS的应用。 最后,你会了解到...

    ibatis2.3源码

    3. **Executor**:执行器是iBATIS的核心组件,负责处理SQL的执行,包括简单执行、批量执行和缓存管理。 4. **ParameterMapping**和**ResultMapping**:这两个概念定义了如何将Java对象的属性与SQL语句中的参数和...

    Ibatis和Mybatis实例源码

    同时,通过对源码的分析,开发者可以更好地利用这两个框架提供的功能,例如:利用Mybatis的注解简化开发,或者使用Ibatis的动态SQL提高查询效率。 在实践中,IbatisExer和MybatisExer这两个项目提供了一系列的示例...

    iBATIS入门讲解和程序源码+iBATIS开发指南电子书

    源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...

    ibatis框架源码剖析光盘资料

    通过对源码的深入分析,我们可以理解ibatis的核心机制,掌握数据库操作的底层原理,从而更好地利用和优化这个强大的持久层框架。在这个压缩包中,包含的文件是《ibatis框架源码剖析》的全文内容。 ibatis作为一个轻...

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

    总的来说,iBATIS DAO 2.3.4.726版的源码分析对于学习和理解Java中的持久层设计有极大的帮助。通过阅读和理解源码,开发者不仅能掌握iBATIS DAO的基本使用,还能深入了解其内部实现,提升数据库操作的技巧和优化能力...

    spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL

    通过分析ibatis源码知道,最终负责执行sql的类是 com.ibatis.sqlmap.engine.execution.SqlExecutor,此类没有实现任何接口,这多少有点遗憾,因为接口是相对稳定契约,非大 的版本更新,接口一般是不会变的,而类...

    ibatis 框架源码剖析 书籍源代码 带有详尽注释

    本书籍“iBATIS 框架源码剖析”提供了对iBATIS框架深入理解的机会,通过源代码分析,帮助读者掌握其内部工作原理。源代码带有详尽的注释,使得学习过程更为直观和高效。 iBATIS的核心概念主要有以下几个方面: 1. ...

    深入分析 iBATIS 框架之系统架构与映射原理

    通过这个文件,iBATIS 可以知道如何连接到数据库、如何处理事务,以及如何加载 SQL 映射文件。 2. **SQL 映射文件**:每个 SQL 映射文件定义了一组 SQL 语句和相关的映射规则,通常以 `.xml` 格式存在。这些文件...

    ibatis-2.3.3.720.jar

    1. **动态SQL**:Ibatis允许在映射文件中直接编写SQL语句,并支持条件判断、循环等动态SQL操作,极大地提高了SQL的灵活性和可维护性。 2. **映射文件与XML配置**:通过XML配置文件,Ibatis定义了SQL语句、参数映射...

Global site tag (gtag.js) - Google Analytics