iBATIS.NET 本身不直接支援「多關鍵字模糊查詢」,但可透過前置處理關鍵字字串,拆解為帶通配符的列表,再搭配動態 SQL 的 <iterate> 標籤生成 OR 連接的 LIKE 條件來實現。
protected internal class KeyWordSearch
{
private IList keywordList = new ArrayList();
public KeyWordSearch(string keywords)
{
// 以空白鍵分割關鍵字,每個關鍵字前後加上 % 通配符
StringTokenizer splitter = new StringTokenizer(keywords, " ", false);
while (splitter.MoveNext())
{
string token = (string)splitter.Current;
keywordList.Add("%" + token + "%");
}
}
public IList KeywordList => keywordList;
}
public IList SearchPersonInfoList(string keywords)
{
object parameterObject = new KeyWordSearch(keywords);
return this.ExecuteQueryForList("SearchPersonList", parameterObject);
}
<select id="SearchPersonList" resultMap="PersonResult">
select UserId, UserName, Sex, Birthday, Mobile, HomeTel, EMail, ...
from Career_PersonInfo person
inner join Career_Nation nation on person.NationId = nation.NationId
inner join Career_Job job on person.jobid = job.jobId
inner join Career_City city on person.CityCode = city.code
inner join Career_Degree degree on person.degreeId = degree.degreeId
<dynamic prepend="and">
<iterate property="KeywordList" open="" close="" conjunction="OR">
lower(job.jobName) like #KeywordList[]#
</iterate>
</dynamic>
</select>
"java developer"。KeyWordSearch 產生列表:["%java%", "%developer%"]。<iterate> 遍歷列表,生成:AND (lower(job.jobName) LIKE '%java%' OR lower(job.jobName) LIKE '%developer%')。#KeywordList[]# 的參數綁定,避免 SQL 注入風險。lower() 函數,若資料庫預設 Collation 已不區分大小寫(如 SQL Server 的 CI),可移除以利用索引。此模式展示了 iBATIS 動態 SQL 強大的組合能力,將複雜的條件構建邏輯從 Java/C# 代碼移至 XML 映射檔,保持 DAO 層簡潔。