記憶體(Repository)


為了能夠更方便的維護和執行SQL語句,JDBC模組提供了記憶體的支持,可以透過@Repository註解自訂SQL或自訂SQL語句或從設定檔中加載SQL並自動執行。

  • @Repository註解:

    • #參數說明:

      dsName:資料來源名稱,預設為空則採用預設資料來源;

      item:從資源檔案載入item指定的設定項,預設為空;

      value:自訂SQL配置(value的優先權高於item);

      type:操作類型,預設為查詢,可選值:Type.OPT.QUERY或Type.OPT.UPDATE

  • 記憶體範例程式碼:

    • 記憶體:

      @Repository
      public class DemoRepository implements IRepository {
      
          /**
           * 注入SQL配置文件(任意配置对象均可)
           */
          @Inject
          private DefaultRepoConfig _repoCfg;
      
          /**
           * 返回SQL配置文件对象, 若不需要配置文件请不要实现IRepository接口
           */
          public IConfiguration getConfig() {
              return _repoCfg;
          }
      
          /**
           * 自定义SQL
           */
          @Repository("select * from ymcms_attachment where hash = ${hash}")
          public IResultSet<Object[]> getSQLResults(String hash, IResultSet<Object[]> results) throws Exception {
              return results;
          }
      
          /**
           * 读取配置文件中的SQL
           */
          @Repository(item = "demo_query")
          public List<Attachment> getAttachments(String hash, IResultSet<Object[]>... results) throws Exception {
              final List<Attachment> _returnValues = new ArrayList<Attachment>();
              if (results != null && results.length > 0) {
                  ResultSetHelper _help = ResultSetHelper.bind(results[0]);
                  if (_help != null)
                      _help.forEach(new ResultSetHelper.ItemHandler() {
                          @Override
                          public boolean handle(ResultSetHelper.ItemWrapper wrapper, int row) throws Exception {
                              _returnValues.add(wrapper.toEntity(new Attachment()));
                              return true;
                          }
                      });
              }
              return _returnValues;
          }
      }
    • SQL設定檔物件:

      @Configuration("cfgs/default.repo.xml")
      public class DefaultRepoConfig extends DefaultConfiguration {
      }
    • SQL設定檔default.repo.xml內容:

      <?xml version="1.0" encoding="UTF-8"?>
      <properties>
          <category name="default">
              <property name="demo_query">
                  <value><![CDATA[select * from ymcms_attachment where hash = ${hash}]]></value>
              </property>
          </category>
      </properties>
    • 在控制器中呼叫:在瀏覽器中存取http://localhost:8080/hello查看執行結果

      @Controller
      @RequestMapping("/hello")
      public class HelloController {
      
          /**
           * 注入存储器
           */
          @Inject
          private DemoRepository _repo;
      
          @RequestMapping("/")
          public IView hello() throws Exception {
              // 调用存储器方法
              return View.jsonView(_repo.getAttachments("44f5b005c7a94a0d42f53946f16b6bb2"));
          }
      }
  • 說明:

    • 記憶體類別透過宣告@Repository註解被框架自動掃描並載入;
    • 與其它被容器管理的@Bean一樣支援攔截器、交易、快取等註解;
    • 記憶體類別方法的參數至少有一個參數(方法有多個參數時,採用最後一個參數)用於接收SQL執行結果;
    • 查詢類型SQL的執行結果資料型別為IResultSet<Object[]> ,更新型別SQL的執行結果資料型別為int;
    • 用來接收SQL執行結果的方法參數支援變長型別,如:IResultSet<Object[ ]> resultsIResultSet<Object[]>... results是一樣的;