存儲(chǔ)器(Repository)

2018-12-24 22:22 更新

為了能夠更方便的維護(hù)和執(zhí)行SQL語句,JDBC模塊提供了存儲(chǔ)器的支持,可以通過@Repository注解自定義SQL或自定義SQL語句或從配置文件中加載SQL并自動(dòng)執(zhí)行。

  • @Repository注解:

    • 參數(shù)說明:

      dsName:數(shù)據(jù)源名稱,默認(rèn)為空則采用默認(rèn)數(shù)據(jù)源;

      item:從資源文件中加載item指定的配置項(xiàng),默認(rèn)為空;

      value:自定義SQL配置(value的優(yōu)先級(jí)高于item);

      type:操作類型,默認(rèn)為查詢,可選值:Type.OPT.QUERY或Type.OPT.UPDATE

  • 存儲(chǔ)器示例代碼:

    • 存儲(chǔ)器:

      @Repository
      public class DemoRepository implements IRepository {
      
          /**
           * 注入SQL配置文件(任意配置對(duì)象均可)
           */
          @Inject
          private DefaultRepoConfig _repoCfg;
      
          /**
           * 返回SQL配置文件對(duì)象, 若不需要配置文件請(qǐng)不要實(shí)現(xiàn)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配置文件對(duì)象:

      @Configuration("cfgs/default.repo.xml")
      public class DefaultRepoConfig extends DefaultConfiguration {
      }
      
    • SQL配置文件default.repo.xml內(nèi)容:

      <?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>
      
    • 在控制器中調(diào)用:在瀏覽器中訪問http://localhost:8080/hello查看執(zhí)行結(jié)果

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

    • 存儲(chǔ)器類通過聲明@Repository注解被框架自動(dòng)掃描并加載;
    • 與其它被容器管理的@Bean一樣支持?jǐn)r截器、事務(wù)、緩存等注解;
    • 存儲(chǔ)器類方法的參數(shù)至少有一個(gè)參數(shù)(方法有多個(gè)參數(shù)時(shí),采用最后一個(gè)參數(shù))用于接收SQL執(zhí)行結(jié)果;
    • 查詢類型SQL的執(zhí)行結(jié)果數(shù)據(jù)類型為IResultSet<Object[]>,更新類型SQL的執(zhí)行結(jié)果數(shù)據(jù)類型為int;
    • 用于接收SQL執(zhí)行結(jié)果的方法參數(shù)支持變長類型,如:IResultSet<Object[]> resultsIResultSet<Object[]>... results是一樣的;
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)