`

ibatis使用中遇到sql语句中有$和#的处理方法

阅读更多

最近搞oracle text的全文检索功能,发现在项目中使用ibatis在查询ctxsys.dr$class这个表时,总是报错,错误如下

 com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in com/tc/fts/ibatis/map/CTXSYS_DRCLASS_SqlMap.xml.  
--- The error occurred while preparing the mapped statement for execution.  
--- Check the selectDrClass.  
--- Check the SQL statement.  
--- Cause: java.util.NoSuchElementException
	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:615)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:589)

 后来才发现表名中含有美元符,而在sqlmap中$是用来替换变量的,是sqlmap中特殊意义的字符,所以直接这么写到sql中肯定是不行的了。

可以考虑使用变量传值的方式,将表名当参数传进来。做了如下更改

调用代码:

ls = sqlMap.queryForList("selectDrClass","ctxsys.dr$class");

 sqlmap代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="CTXSYS_DRCLASS" >
  <select id="selectDrClass" resultClass="com.tc.fts.ibatis.model.DrClass" parameterClass="java.lang.String" >
  <![CDATA[
    select * from #temp# order by CLA_ID
    ]]>
  </select>
</sqlMap>

 结果发现ibatis默认将select * from #temp# order by CLA_ID变成了sql语句的参数化形式select * from ? order by CLA_ID,然后调用setString(1)了,这样最后的sql语句中表名被加了引号了。所以还是不行。

 

尝试直接代换法,这次OK了

调用代码:

dc.setClaName("ctxsys.dr$class");
ls = sqlMap.queryForList("selectDrClass",dc);

 sqlmap代码:

<select id="selectDrClass" resultClass="com.tc.fts.ibatis.model.DrClass" parameterClass="com.tc.fts.ibatis.model.DrClass" >
  <![CDATA[
    select * from $claName$ order by CLA_ID
    ]]>
  </select>

 这样执行的时候sql语句就被正常代换成

select * from ctxsys.dr$class order by CLA_ID

 

 现在又发现一种方法可以这样更符合要求,原谅我之前的做法吧

ls = sqlMap.queryForList("selectDrClass","ctxsys.dr$class");

 

	<select id="selectDrClass"
		resultClass="com.tc.fts.ibatis.model.DrClass"
		parameterClass="String">
		<![CDATA[
    select cla_Id claid,cla_Name claname,cla_Desc cladesc from $value$ order by CLA_ID
    ]]>
	</select>

 

 

分享到:
评论
8 楼 maidouzi 2013-10-18  
$
以下方式解决
'%'‖#参数名#‖'%'
7 楼 maidouzi 2013-10-18  
$ 中招了啊
6 楼 fire2069225 2009-11-30  
tigerqiu85 写道
sdh5724 写道

$value$ $在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。Both # and $ can be escaped by doubling: ## or $$ respectively.楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。


受用

牛人
5 楼 tianlang0101 2009-09-24  
sdh5724 写道
$value$

$在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。

Both # and $ can be escaped by doubling: ## or $$ respectively.

楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。




nice
4 楼 tigerqiu85 2009-02-03  
sdh5724 写道

$value$ $在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。Both # and $ can be escaped by doubling: ## or $$ respectively.楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。


受用
3 楼 xiaoxin 2009-01-17  
我很虚心的接受你的批评,但是我不这样怎么得到你的回复啊?

谢谢你哦,我又学到东西了 ,我也是在初学阶段,希望大家互相理解。我写这些东西的初衷还是希望能够帮助更多人的 显然我做的还不够好,我会更加努力的
2 楼 sdh5724 2009-01-06  
$value$

$在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。

Both # and $ can be escaped by doubling: ## or $$ respectively.

楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
1 楼 leeldy 2009-01-06  
顶LZ。。。。一看就懂

相关推荐

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    在使用iBATIS(现已被MyBatis取代)进行数据库操作时,我们常常需要传递参数到SQL语句中。在iBATIS中,有两种主要的方式来处理这些参数:使用`$`和`#`。这两种方式在不同的场景下有不同的效果。 首先,让我们来看看...

    ibatis sql语句对条件中特殊字符% # 处理

    通过对ibatis框架下SQL语句中特殊字符处理方法的详细分析,我们可以看到,合理地使用字符串转义处理结合动态SQL标签,可以有效地解决特殊字符带来的问题。这样不仅可以保证查询的准确性,还可以提高代码的健壮性和...

    ibatis中 $ 于 # 的 区别

    当使用`${}`时,如果传入的参数值中含有SQL注释符号,那么这些注释符号会被直接插入到SQL语句中,可能会导致SQL语句解析失败或产生意外结果。 #### 3. # 与 $ 的对比总结 - **安全性方面**:`#{}`更加安全,因为...

    在ibatis日志信息中打印SQL语句的方法(个人总结)

    本文将详细讲解如何在iBatis日志信息中打印SQL语句,以便更好地理解和优化数据库操作。 首先,iBatis提供了一个强大的日志系统,支持多种日志实现,如Log4j、SLF4J、Java Util Logging等。选择哪种日志实现取决于你...

    iBatis的动态SQL语句

    iBatis框架中的动态SQL主要通过XML映射文件来实现,它允许在映射文件中使用各种标签来控制SQL语句的生成过程。这些标签包括但不限于`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;trim&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`...

    ibatis常用sql语句

    在iBATIS中,当输入参数为单个值时,如示例中的`long`类型,可以使用`&lt;delete&gt;`标签结合`#value#`占位符来构建SQL语句。这里的`#value#`会被实际的参数值替换,从而执行具体的数据库删除操作。这种简单的参数绑定...

    ibatis16个常用sql语句

    在iBatis中,SQL语句是通过XML文件来配置的。下面是16个常用的iBatis SQL语句,涵盖了基本的CRUD(Create、Read、Update、Delete)操作。 1. 删除语句 在iBatis中,删除语句可以使用`&lt;delete&gt;`元素。例如: ```xml...

    ibatis sql 语句的编写

    本文将详细介绍ibatis中的SQL语句编写方法,主要包括查询、插入、更新和删除等基本操作,并通过一个具体的例子来加深理解。 #### 二、ibatis简介 Ibatis是一个基于Java的持久层框架,它支持定制化SQL、存储过程...

    Ibatis常用sql语句

    根据给定的文件信息,以下是对“Ibatis常用SQL语句”的详细解析,涵盖了一系列Ibatis在数据操作中的应用实例。 ### Ibatis简介 Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让...

    ibatis常用的sql

    根据提供的文件信息,本文将对...综上所述,ibatis框架通过XML配置文件中的SQL语句模板和参数化处理,极大地简化了数据库操作的过程,提高了代码的安全性和可维护性。以上就是对所提供的ibatis常用SQL语句的详细解析。

    ibatis的dynamicSQL中,关于prepend的使用

    在探讨ibatis中的动态SQL(Dynamic SQL)及`prepend`的使用时,我们首先需要对ibatis有一个基本的理解。ibatis是一种开源的数据访问层框架,它简化了Java应用程序与数据库之间的交互过程。通过使用XML配置文件来定义...

    sql语句中用问号代替参数

    在SQL语句中,使用问号(`?`)作为参数占位符是一种常见的做法,尤其是在编程语言如Java中与数据库交互时。这种方式被称为预编译语句或参数化查询,它具有重要的安全性和性能优势。 ### SQL参数化查询的概念 参数化...

    iBatis.net使用动态sql语句

    因为要下载其它的文件,所以从网站复制了一些其它的资源进行上传。但是这个资源是相当有用的。这里感谢之前总结相关技术的人员。谢谢

    WAS上log4j日志不能输出(ibatis)sql语句解决办法[借鉴].pdf

    在部署到 WAS 服务器上的 CMSII 系统中,ibatis 的 sql 语句不能输出日志的问题。解决该问题需要改变 WAS 的默认 LogFactory 实现类,使其使用 log4j 框架下的 LogFactory 实现类。 问题描述: 在本机 TOMCAT ...

    ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc

    iBatis 中使用安全的拼接语句、动态查询、大于、小于、等于 iBatis 是一个流行的持久层框架,提供了许多强大的功能来帮助开发者构建高效、安全的数据库交互应用程序。本文将详细介绍 iBatis 中使用安全的拼接语句、...

    打log4j日志-ibatis的sql输出

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

    ibatis动态SQL标签用法

    iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的、独立的片段,然后根据不同的条件组合这些片段生成最终的SQL语句。这可以提高代码的可重用性和灵活性。 例如,在上面的代码中,我们定义了三个动态SQL片段...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    9. **错误处理与调试**:分享如何排查和解决iBATIS在实际使用过程中遇到的问题。 10. **最佳实践**:提供一些关于如何优化iBATIS使用的建议,以提高性能和代码质量。 《iBATIS-SqlMaps》则可能更侧重于实战和案例...

    ibatis中输入输出各种类型的参数分析及#与$区别

    在iBatis中编写SQL语句时,可以使用`#{}`和`${}`两种方式来插入参数。这两种方式的主要区别在于安全性和性能: - **#{}**: - 安全性: 使用`#{}`可以有效防止SQL注入攻击,因为它会自动进行SQL转义。 - 性能: 当...

Global site tag (gtag.js) - Google Analytics