首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

iBATIS.NET 模糊查詢實作範例解析

     編輯:Java 相關知識

核心思路

iBATIS.NET 本身不直接支援「多關鍵字模糊查詢」,但可透過前置處理關鍵字字串,拆解為帶通配符的列表,再搭配動態 SQL 的 <iterate> 標籤生成 OR 連接的 LIKE 條件來實現。

關鍵元件:KeyWordSearch 輔助類

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;
}

DAO 層調用範例

public IList SearchPersonInfoList(string keywords)
{
    object parameterObject = new KeyWordSearch(keywords);
    return this.ExecuteQueryForList("SearchPersonList", parameterObject);
}

SQL Map 定義

<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>

執行流程解析

  1. 使用者輸入 "java developer"。
  2. KeyWordSearch 產生列表:["%java%", "%developer%"]。
  3. 動態 SQL 解析時,<iterate> 遍歷列表,生成:
    AND (lower(job.jobName) LIKE '%java%' OR lower(job.jobName) LIKE '%developer%')。
  4. 資料庫執行查詢,回傳符合任一關鍵字的職缺記錄。

優化建議

  • 全文檢索替代:資料量大時,建議改用 Lucene/Elasticsearch 等全文搜尋引擎。
  • 參數化防注入:iBATIS 會自動處理 #KeywordList[]# 的參數綁定,避免 SQL 注入風險。
  • 大小寫不敏感:範例使用 lower() 函數,若資料庫預設 Collation 已不區分大小寫(如 SQL Server 的 CI),可移除以利用索引。

此模式展示了 iBATIS 動態 SQL 強大的組合能力,將複雜的條件構建邏輯從 Java/C# 代碼移至 XML 映射檔,保持 DAO 層簡潔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved