<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MyBatis 的 @SelectProvider 是一個強大的注解,用于動態生成 SQL 語句

      MyBatis 的 @SelectProvider 是一個強大的注解,用于動態生成 SQL 語句。讓我詳細介紹一下它的用途和使用方法。

      一、@SelectProvider 的作用

      主要用途:

      1. 動態 SQL 構建 - 根據條件動態生成復雜的 SQL
      2. 代碼邏輯控制 - 使用 Java 代碼控制 SQL 生成邏輯
      3. 復雜查詢處理 - 處理在注解中難以表達的復雜 SQL
      4. SQL 復用 - 多個方法可以共用同一個 Provider 類

      與其他注解對比:

      • @Select:適合固定不變的簡單 SQL
      • @SelectProvider:適合動態的、復雜的 SQL

      二、基本使用方法

      1. 定義 Provider 類

      public class CheckSqlProvider {
          
          // 簡單示例
          public String selectAll() {
              return "SELECT * FROM C_CHECKS_T";
          }
          
          // 帶參數的動態 SQL
          public String selectByDateRange(Map<String, Object> params) {
              String startDate = (String) params.get("startDate");
              String endDate = (String) params.get("endDate");
              
              return "SELECT * FROM C_CHECKS_T WHERE CHECK_DATE >= TO_DATE('" + 
                     startDate + "', 'YYYY-MM-DD') AND CHECK_DATE < TO_DATE('" + 
                     endDate + "', 'YYYY-MM-DD')";
          }
      }
      

      2. 在 Mapper 中使用

      @Mapper
      public interface CChecksTMapper extends BaseMapper<CChecksT> {
          
          @SelectProvider(type = CheckSqlProvider.class, method = "selectAll")
          List<CChecksT> selectAll();
          
          @SelectProvider(type = CheckSqlProvider.class, method = "selectByDateRange")
          List<CChecksT> selectByDateRange(@Param("startDate") String startDate, 
                                         @Param("endDate") String endDate);
      }
      

      三、針對你的復雜查詢的實現

      1. 創建專門的 Provider 類

      public class CheckSummaryProvider {
          
          public String selectCheckSummary(Map<String, Object> params) {
              String startDate = (String) params.get("startDate");
              String endDate = (String) params.get("endDate");
              
              StringBuilder sql = new StringBuilder();
              sql.append("SELECT a.*, b.TRACK_RECTIFICATION, b.TRACK_ESTIMATED_FINISH_TIME ");
              sql.append("FROM (");
              sql.append("    SELECT t.BRANCH, count(*) jcxm, ");
              sql.append("        COUNT(CASE WHEN check_status IN (4,6) THEN 1 END) AS wczs, ");
              sql.append("        COUNT(CASE WHEN check_status IN (2,3,5) THEN 1 END) AS wwc ");
              sql.append("    FROM C_CHECKS_T t ");
              sql.append("    WHERE t.CHECK_DATE >= TO_DATE('").append(startDate).append("', 'YYYY-MM-DD') ");
              sql.append("        AND t.CHECK_DATE < TO_DATE('").append(endDate).append("', 'YYYY-MM-DD') ");
              sql.append("    GROUP BY t.BRANCH ");
              sql.append(") a ");
              sql.append("LEFT JOIN (");
              sql.append("    SELECT t.BRANCH, t.TRACK_RECTIFICATION, t.TRACK_ESTIMATED_FINISH_TIME ");
              sql.append("    FROM C_CHECKS_T t ");
              sql.append("    WHERE t.check_status IN (2,3,5) ");
              sql.append("        AND t.CHECK_DATE >= TO_DATE('").append(startDate).append("', 'YYYY-MM-DD') ");
              sql.append("        AND t.CHECK_DATE < TO_DATE('").append(endDate).append("', 'YYYY-MM-DD') ");
              sql.append(") b ON a.BRANCH = b.BRANCH ");
              sql.append("ORDER BY a.BRANCH");
              
              return sql.toString();
          }
          
          // 更安全的參數綁定方式
          public String selectCheckSummarySafe(Map<String, Object> params) {
              return new SQL() {{
                  SELECT("a.*, b.TRACK_RECTIFICATION, b.TRACK_ESTIMATED_FINISH_TIME");
                  FROM("(" +
                      " SELECT t.BRANCH, count(*) jcxm, " +
                      " COUNT(CASE WHEN check_status IN (4,6) THEN 1 END) AS wczs, " +
                      " COUNT(CASE WHEN check_status IN (2,3,5) THEN 1 END) AS wwc " +
                      " FROM C_CHECKS_T t " +
                      " WHERE t.CHECK_DATE >= TO_DATE(#{startDate}, 'YYYY-MM-DD') " +
                      " AND t.CHECK_DATE < TO_DATE(#{endDate}, 'YYYY-MM-DD') " +
                      " GROUP BY t.BRANCH " +
                      ") a");
                  LEFT_OUTER_JOIN("(" +
                      " SELECT t.BRANCH, t.TRACK_RECTIFICATION, t.TRACK_ESTIMATED_FINISH_TIME " +
                      " FROM C_CHECKS_T t " +
                      " WHERE t.check_status IN (2,3,5) " +
                      " AND t.CHECK_DATE >= TO_DATE(#{startDate}, 'YYYY-MM-DD') " +
                      " AND t.CHECK_DATE < TO_DATE(#{endDate}, 'YYYY-MM-DD') " +
                      ") b ON a.BRANCH = b.BRANCH");
                  ORDER_BY("a.BRANCH");
              }}.toString();
          }
      }
      

      2. 在 Mapper 中調用

      @Mapper
      public interface CChecksTMapper extends BaseMapper<CChecksT> {
          
          @SelectProvider(type = CheckSummaryProvider.class, method = "selectCheckSummary")
          List<Map<String, Object>> selectCheckSummary(@Param("startDate") String startDate, 
                                                     @Param("endDate") String endDate);
          
          @SelectProvider(type = CheckSummaryProvider.class, method = "selectCheckSummarySafe")
          List<Map<String, Object>> selectCheckSummarySafe(@Param("startDate") String startDate, 
                                                         @Param("endDate") String endDate);
      }
      

      四、高級用法

      1. 動態條件查詢

      public class DynamicCheckProvider {
          
          public String selectByConditions(Map<String, Object> params) {
              String branch = (String) params.get("branch");
              List<Integer> statusList = (List<Integer>) params.get("statusList");
              String startDate = (String) params.get("startDate");
              String endDate = (String) params.get("endDate");
              
              StringBuilder sql = new StringBuilder("SELECT * FROM C_CHECKS_T WHERE 1=1 ");
              
              if (branch != null && !branch.trim().isEmpty()) {
                  sql.append(" AND BRANCH = '").append(branch).append("'");
              }
              
              if (statusList != null && !statusList.isEmpty()) {
                  sql.append(" AND check_status IN (");
                  for (int i = 0; i < statusList.size(); i++) {
                      if (i > 0) sql.append(",");
                      sql.append(statusList.get(i));
                  }
                  sql.append(")");
              }
              
              if (startDate != null) {
                  sql.append(" AND CHECK_DATE >= TO_DATE('").append(startDate).append("', 'YYYY-MM-DD')");
              }
              
              if (endDate != null) {
                  sql.append(" AND CHECK_DATE < TO_DATE('").append(endDate).append("', 'YYYY-MM-DD')");
              }
              
              sql.append(" ORDER BY BRANCH, CHECK_DATE");
              
              return sql.toString();
          }
      }
      

      2. 使用 MyBatis SQL 構建器

      public String buildComplexQuery(Map<String, Object> params) {
          return new SQL() {{
              SELECT("t.BRANCH", "COUNT(*) as total");
              SELECT("SUM(CASE WHEN check_status IN (4,6) THEN 1 ELSE 0 END) as completed");
              FROM("C_CHECKS_T t");
              WHERE("t.CHECK_DATE >= TO_DATE(#{startDate}, 'YYYY-MM-DD')");
              WHERE("t.CHECK_DATE < TO_DATE(#{endDate}, 'YYYY-MM-DD')");
              GROUP_BY("t.BRANCH");
              ORDER_BY("t.BRANCH");
          }}.toString();
      }
      

      五、最佳實踐建議

      1. 參數安全

      // 不推薦 - SQL注入風險
      "WHERE name = '" + name + "'"
      
      // 推薦 - 使用 #{} 參數綁定
      "WHERE name = #{name}"
      

      2. 代碼組織

      // 按功能模塊組織 Provider 類
      - provider/
        - UserSqlProvider.java
        - OrderSqlProvider.java  
        - CheckSqlProvider.java
      

      3. 異常處理

      public String safeQuery(Map<String, Object> params) {
          try {
              // SQL 構建邏輯
              return sql.toString();
          } catch (Exception e) {
              throw new RuntimeException("SQL構建失敗", e);
          }
      }
      

      六、總結

      @SelectProvider 的優勢:

      • ? 靈活性 - 可以處理極其復雜的 SQL 邏輯
      • ? 可維護性 - SQL 在 Java 代碼中,便于調試和維護
      • ? 復用性 - 多個 Mapper 方法可以共用 Provider
      • ? 類型安全 - 編譯時檢查 SQL 構建邏輯

      對于你的復雜查詢場景,使用 @SelectProvider 是非常合適的選擇!

      posted @ 2025-10-21 17:04  dirgo  閱讀(18)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲欧美人成网站在线观看看| 蜜臀av无码一区二区三区| 海宁市| 国产免费无遮挡吸奶头视频| 国产中文三级全黄| 国产午夜伦鲁鲁| 国产一区二区三区乱码在线观看| 西西人体大胆444WWW| 汕头市| 熟女蜜臀av麻豆一区二区| 欧美大bbbb流白水| 大厂| 婷婷四虎东京热无码群交双飞视频| 91产精品无码无套在线| 国产av无码专区亚洲av软件| 日韩老熟女av搜索结果| 亚洲国产成人久久77| 婷婷六月色| 一区二区三区国产亚洲自拍| 国产极品美女高潮无套| 粉嫩国产一区二区三区在线| 亚洲老熟女一区二区三区| 伊人久久大香线蕉av五月天| 兴海县| 韩国无码AV片午夜福利| 人妻伦理在线一二三区| 国产精品无码专区| 久久国产成人高清精品亚洲| 色综合天天综合网中文伊| 一本加勒比hezyo无码人妻| 成人精品日韩专区在线观看| 开心一区二区三区激情| 国产又色又爽又黄的免费软件| 白白发布视频一区二区视频| 国产精品区视频中文字幕| 亚洲综合无码日韩国产加勒比| 亚洲 欧美 清纯 校园 另类| 一区二区三区四区五区黄色 | 国产一区二区波多野结衣| 国产成人高清亚洲综合| 秋霞鲁丝片成人无码|