在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注入攻击。
相关推荐
本文将通过分析iBatis的源码,深入探讨其设计理念和实现机制。 一、iBatis架构概述 iBatis主要由SqlMapConfig.xml配置文件、SqlMap接口和Executor执行器三大部分构成。SqlMapConfig.xml配置文件定义了数据源、事务...
阅读和分析iBATIS源码,可以帮助开发者: 1. **理解工作原理**:了解iBATIS如何解析SQL映射文件,如何执行SQL,如何处理结果集映射,以及事务控制等关键流程。 2. **优化性能**:通过源码,可以找出可能的性能瓶颈...
通过深入分析iBATIS的源码,开发者不仅可以了解其工作原理,还能学习到设计模式、数据库访问的最佳实践以及如何优雅地处理数据库操作。对于提升Java开发者的技能和理解数据库访问层的实现有极大的帮助。在实际开发中...
标题 "ibatis打印sql" 涉及到的是在使用iBATIS(一个轻量级的持久层框架)时如何调试和查看SQL语句的方法。iBATIS允许开发者编写SQL语句并将其与Java代码集成,以实现灵活的数据访问。在开发过程中,为了调试和优化...
在默认情况下,Ibatis并不会自动打印执行的SQL语句,但通过配置,我们可以使Ibatis在运行时输出SQL,这对于调试和性能分析非常有帮助。 要启用Ibatis的SQL日志记录,你需要在Ibatis的配置文件(通常为`mybatis-...
11. **源码分析**:对于进阶读者,可以进一步研究iBATIS的源码,了解其实现原理,有助于更深入地理解框架。 12. **工具支持**:介绍一些辅助开发的工具,如MyBatis Generator,它可以自动生成iBATIS相关的Java代码...
接下来,关于源码分析: 1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和...
《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。...在实际项目中,结合源码分析,能够更好地定制和扩展iBatis,满足特定的业务需求。
在源码分析部分,你会看到iBATIS如何加载和解析XML配置文件,如何执行SQL语句,以及如何处理异常。这部分内容对于理解iBATIS的工作流程至关重要,它将帮助你更好地调试和优化基于iBATIS的应用。 最后,你会了解到...
3. **Executor**:执行器是iBATIS的核心组件,负责处理SQL的执行,包括简单执行、批量执行和缓存管理。 4. **ParameterMapping**和**ResultMapping**:这两个概念定义了如何将Java对象的属性与SQL语句中的参数和...
同时,通过对源码的分析,开发者可以更好地利用这两个框架提供的功能,例如:利用Mybatis的注解简化开发,或者使用Ibatis的动态SQL提高查询效率。 在实践中,IbatisExer和MybatisExer这两个项目提供了一系列的示例...
源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...
通过对源码的深入分析,我们可以理解ibatis的核心机制,掌握数据库操作的底层原理,从而更好地利用和优化这个强大的持久层框架。在这个压缩包中,包含的文件是《ibatis框架源码剖析》的全文内容。 ibatis作为一个轻...
总的来说,iBATIS DAO 2.3.4.726版的源码分析对于学习和理解Java中的持久层设计有极大的帮助。通过阅读和理解源码,开发者不仅能掌握iBATIS DAO的基本使用,还能深入了解其内部实现,提升数据库操作的技巧和优化能力...
通过分析ibatis源码知道,最终负责执行sql的类是 com.ibatis.sqlmap.engine.execution.SqlExecutor,此类没有实现任何接口,这多少有点遗憾,因为接口是相对稳定契约,非大 的版本更新,接口一般是不会变的,而类...
本书籍“iBATIS 框架源码剖析”提供了对iBATIS框架深入理解的机会,通过源代码分析,帮助读者掌握其内部工作原理。源代码带有详尽的注释,使得学习过程更为直观和高效。 iBATIS的核心概念主要有以下几个方面: 1. ...
通过这个文件,iBATIS 可以知道如何连接到数据库、如何处理事务,以及如何加载 SQL 映射文件。 2. **SQL 映射文件**:每个 SQL 映射文件定义了一组 SQL 语句和相关的映射规则,通常以 `.xml` 格式存在。这些文件...
1. **动态SQL**:Ibatis允许在映射文件中直接编写SQL语句,并支持条件判断、循环等动态SQL操作,极大地提高了SQL的灵活性和可维护性。 2. **映射文件与XML配置**:通过XML配置文件,Ibatis定义了SQL语句、参数映射...