1. ibatis 中sql语句传参数时 id=#id#与id=$id$ 有区别么
#是占位符
$字符串拼接
如果id = 3
id = #{id} 生成的sql语句是 id = ?
使用的是PreparedStatement,执行时,通过setXXX方法,将值加入在sql语句,如setInt(1, 3)
id = ${id} 生成的sql语句是 id = 3
直接拼接成sql语句,做的是字符串拼接操作
2. 关于ibatis如何传入数组作为参数
在ibatis中,parameterClass的类型大都是:string,int/对象/hashmap
resultclass/resultMap的类型大都是:对象/hashmap
当parameterClass为string,int时,可用#value#表示或直接用传入的值名表示。
当parameterClass/resultMap的类型是对象时,用#属性#表示。程序会调用JAVABEAN的getter方法,进行获取属性值。
当parameterClass/resultMap的类型是hashmap(Map是key-value结构的)时,那程序会直接通过key来分析取参数。
具体请见以下两部分:
ibatis各种参数数据集
原型参数
<select id="select1" parameterClass="java.lang.String" resultClass="AppLog">
select
ID as id,
TYPE as type,
DESCR as descr
from APP_LOG
where ID = #id#
</select>
sqlMapper.queryForObject("select0", id);
参数名与传入值名称一样,应该也可用参数#value#表示
3. ibatis sql快定义的sql能在其他sql文件中引用吗
不可以,因为后面在调用sqlMap.xml文件时是通过xml解析器解释xml文件,>把sql语句括起来,也可以才用$传参
4. IBatis 怎样直接执行SQL语句
ibatis中,参数部分是用##表示的,这种格式的是字符串,会自动在内容两端加上单引号,$$表示的是原样输出,你这里有两个参数,且要求的是数值,所以要用$$,那么在ibatis的xml配置文件中,写法就是:
select *
from table
limit $count1$, $count2$.
而在java中,通过调用ibatis框架中的方法,将count1和count2变量的值传递进去就可以了。
5. ibatis SQL语句传入一个函数的参数是一个用分号隔开的多个值怎么办
分割“版区负责人Id”,使其结果为版区Id版区负责人Id612364566789(这里,我想来想去,只有使用零时表+游标来实现,个人没有想到更好的方法)CREATEFUNCTION[dbo].[fun_Split](@strVARCHAR(MAX),@splitVARCHAR(10))RETURNSTABLEASRETURN(SELECTB.idFROM(SELECT[value]=CONVERT(XML,''+REPLACE(@str,@split,'')+''))AOUTERAPPLY(SELECTid=N.v.value('.','varchar(100)')FROMA.[value].nodes('/v')N(v))B)GO--2005以及以上的版本支持这种分割写法。用xmlpath,把数据搞成你所要的结果
6. ibatis怎么将解析参数传递给sql
# Print SQL
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG, A1
7. 怎么从ibatis中获取SQL
如何从ibatis中获取SQL
以下是在网上搜到的办法:
运行期从ibatis配置文件中获取sql的两种方法
运行期从ibatis配置文件中获取sql
1.通过SqlMapClientDaoSupport,SqlMapClientImpl,MappedStatement,Sql,RequestScope等ibatis提供的类
public List<UserInfo> getUserList(UserInfo userInfo) {
String sql = null;
SqlMapClientImpl sqlmap = (SqlMapClientImpl) this.getSqlMapClient();
MappedStatement stmt = sqlmap.getMappedStatement("getUserInfoList");
Sql stmtSql = stmt.getSql();
RequestScope requestScope = new RequestScope();
requestScope.setStatement(stmt);
sql = stmtSql.getSql(requestScope, userInfo);
System.out.println(sql);
return null;
}
注:这个方法我是写在中的,该 extends SqlMapClientDaoSupport,所以上述就可以直接this调用getSqlMapClient()方法,
2.通过SqlMapExecutorDelegate,MappedStatement,Sql,RequestScope等ibatis提供的类
public List<UserInfo> getUserList(UserInfo userInfo) {
SqlMapExecutorDelegate delegate=((ExtendedSqlMapClient)
(getSqlMapClientTemplate().getSqlMapClient())).getDelegate();
MappedStatement ms = delegate.getMappedStatement("getUserInfoList");
Sql sql=ms.getSql();
RequestScope requestScope = new RequestScope();
requestScope.setStatement(ms);
String sqlStr = sql.getSql(requestScope,userInfo);
System.out.println(sqlStr);
}
注:这两个例子中用到的类都是ibatis官方jar文件中的,快速导入即可,"getUserInfoList"为ibatis的xml文件中配置的id,getSql(,)
中第二个参数就是要传递的参数对象。
上述写法完全可以再简化,上述只是简单介绍,可供参考.......
参考:http://hi..com/iany/item/254166ffaef7a3e81a111f71
但是以上方法有点问题,ibatis参数有$和#之分,当#的时候,获取出来的SQL是含有?号的。
我想ibatis一定也是最后使用的是JDBC的一种实现,所以就debug了一下源代码。
看了一下,总结了一下,可以这样实现:
package com.seven.dbTools.ibatis;
import java.util.HashMap;
import java.util.Map;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
import com.ibatis.sqlmap.engine.scope.RequestScope;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
public class IbatisUtil extends SqlMapClientDaoSupport {
/**
* get sql from ibatis :从ibatis中获取sql已经动态参数
* @param sqlid : sqlMap中的id
* @param parameterMap : 参数map
* @return
*/
public Map<String, Object[]> getSqlAndParametersFromIbatis(String sqlid,
Map parameterMap) {
String sql = null;
SqlMapClientImpl sqlmap = (SqlMapClientImpl) this.getSqlMapClient();
MappedStatement stmt = sqlmap.getMappedStatement(sqlid);
Sql stmtSql = stmt.getSql();
RequestScope requestScope = new RequestScope();
requestScope.setStatement(stmt);
ParameterMap dynamicParameterMap = stmtSql.getParameterMap(
requestScope, parameterMap);
Object[] values = null;
if (dynamicParameterMap != null) {
values = dynamicParameterMap.getParameterObjectValues(requestScope,
parameterMap);
}
sql = stmtSql.getSql(requestScope, parameterMap);
Map<String, Object[]> sqlMap = new HashMap<String, Object[]>();
sqlMap.put(sql, values);
return sqlMap;
}
}
以上代码得到SQL和动态的参数。
8. 请问:ibatis2,假如传入参数A,B,它们中任意一个isNotEmpty 那么就增加一条sql。 这个该怎么写
<statement id="id自己命名">
<dynamic>
<isNotEmpty property="A">
sql1
</isNotEmpty>
<isNotEmpty property="B">
sql2
</isNotEmpty>
</dynamic>
</statement>
没经过测试,一般动态ibatis SQL动态语句是用来动态改变一条SQL语句的条件(包括where 条件和 select 的字段条件)
一般不会你说的那么用,因为你这个问题,完全可以在xml写两个ibatis statement,在java里判断A,B是否为空,来决定调一个还是两个statement
9. ibatis怎么将JSP页面的输入信息传递到sql map的映射文件中去
看你怎么使用,如果是用struts,你的action里面肯定要有一个接收值,ibatis肯定之前就要写好一个实现的方法,然后两者结合起来。