论坛首页 Java企业应用论坛

iBatis中直接执行sql语句的方法

浏览 23134 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-24  
最近项目中要用到 直接执行 大量sql  其中 主要是 update 和insert 和delet语句
如果直接执行的话要考虑到 回滚 日志等 自己做不好管理  ,加上项目本身就使用了ibatis 就一直寻找ibatis 直接执行SQL的方法
之前有人 讨论过
http://www.iteye.com/post/134239 得出的结论是不能
昨天晚上翻了一下文档 试了一下 是可以的
文档见
http://ibatis.apache.org/docs/dotnet/datamapper/ch03s03.html

主要是sqlmap xml配置问题
<sqlMap namespace="ExecuteSql">
	<typeAlias alias="exeSqlModel" type="org.****.model.system.ExeSqlModel"/>
	<statement id="exeSqlString"  parameterClass="exeSqlModel">
		$exeSqlSting$
	</statement>
</sqlMap>


其中statemnet 可以执行所有的功能
update insert delete其实也行
还有 procedure 也行

需要注意的是  要用$ 而不是# 具体的原因是 ibatis自己会在##中间的字符串中加入''
昨天晚上就是这个问题搞了好久
   发表时间:2007-10-24  
干嘛不直接用她的<update/>或者<insert/>元素包含你想执行的SQL?
0 请登录后投票
   发表时间:2007-10-25  
lz的意思,是不是利用同一个配置,进行update 和insert 和delete操作,输入的parameterClass又是固定的,基本上只能针对一张表进行操作,只是省下几行配置文件的问题。却从根本上改变了 SQL 语句本身,比仅仅简单地改变参数值严重得多。你与其这样,还不如直接用JDBC好了。
0 请登录后投票
   发表时间:2007-10-25  
lz的意思主要就是用$$替代##的话,能跳过ibatis的参数类型解析和调整sql语句的过程,还有,parameterClass固定并不代表着就只能操作一张表,具体操作哪张表还是看具体的sql语句来的。
不过,这种方法确实是只能执行uid的操作,而且,这么做跟直接写jdbc有什么区别呢?是要使用ibatis的事务管理?
0 请登录后投票
   发表时间:2007-11-28  
这样不能执行ddl的语句!
0 请登录后投票
   发表时间:2007-12-04  
LZ说了用iBatis的好处是不需要自己再实现事务管理,回滚和日志。

我现在在做的一个小功能是让用户(不懂SQL)在图形化生成SQL查询, 并展示出来。 我们的主体框架是Spring+iBatis, 如果直接用JDBC, 还需要考虑注册数据库一些琐碎的事情。

我现在的困难是如何取得返回数据, iBatis需要在写xml的时候就定义好对应的model, 或者字段的对应关系。但是我要做的是动态的产生SQL, 查询的项目也是动态的。
0 请登录后投票
   发表时间:2007-12-04  
如果我没记错........
好像第一次用了之后
第2次再调用这个SQL  即使换了条件和字段 他还是会调用第一次的 或者报错........

没试过.....不过以前看到有人写过...
0 请登录后投票
   发表时间:2008-04-30  
ddandyy 写道
如果我没记错........
好像第一次用了之后
第2次再调用这个SQL  即使换了条件和字段 他还是会调用第一次的 或者报错........

没试过.....不过以前看到有人写过...

是不是真的有楼上描述的情况啊?
1 请登录后投票
   发表时间:2008-05-01  
ddandyy 写道
如果我没记错........
好像第一次用了之后
第2次再调用这个SQL  即使换了条件和字段 他还是会调用第一次的 或者报错........

没试过.....不过以前看到有人写过...

引用
因为iBatis自己有 AutoResultMap的cache,尽管你传入的$tableName$不同,但是他总是

用第一个建立的AutoResultMap的cache去匹配以后的$tableName$当然有错误了
解决方法: 使用多个statment或者使用 remapResults="true" (为了效率他默认的是false)


楼主的做法在某些场合下确实有其意义,不过不推荐在全部使用这种做法,这种做法等于直接在代码中写sql。

0 请登录后投票
   发表时间:2008-05-26  
楼主的意思应该是说sql语句是动态的(不仅仅是查询参数动态,有可能insert、select或是表名称都是可变的),然后将sql 语句传递给ibatis进行执行,但是又不想自己手写jdbc进行执行吧,呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics