ibatis施用中遇到sql语句中有$和#的处理方法
ibatis使用中遇到sql语句中有$和#的处理方法
我很虚心的接受你的批评,但是我不这样怎么得到你的回复啊?
谢谢你哦,我又学到东西了
,我也是在初学阶段,希望大家互相理解。我写这些东西的初衷还是希望能够帮助更多人的
显然我做的还不够好,我会更加努力的
$value$ $在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。Both # and $ can be escaped by doubling: ## or $$ respectively.楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
受用
nice
$value$ $在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。Both # and $ can be escaped by doubling: ## or $$ respectively.楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
受用
牛人
最近搞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>
1 楼
leeldy
2009-01-06
顶LZ。。。。一看就懂
2 楼
sdh5724
2009-01-06
$value$
$在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。
Both # and $ can be escaped by doubling: ## or $$ respectively.
楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
$在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。
Both # and $ can be escaped by doubling: ## or $$ respectively.
楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
3 楼
xiaoxin
2009-01-17
谢谢你哦,我又学到东西了
4 楼
tigerqiu85
2009-02-03
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.
楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
$在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。
Both # and $ can be escaped by doubling: ## or $$ respectively.
楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
nice
6 楼
fire2069225
2009-11-30
tigerqiu85 写道
sdh5724 写道
$value$ $在IBATIS是个很危险的东西。 在不小心情况下, 可能造成SQL注入攻击。 建议还是不要使用。 另外IBATIS对于特殊符号, 可以使用转义吧。Both # and $ can be escaped by doubling: ## or $$ respectively.楼主虽然好心, 但是还是有觉得误人子弟之嫌疑。应该是对转义的理解不够深刻。
牛人