當前位置:首頁 » 編程語言 » ibatis傳入sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

ibatis傳入sql

發布時間: 2022-05-31 06:10:10

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肯定之前就要寫好一個實現的方法,然後兩者結合起來。