記憶體(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[ ]> results
和IResultSet<Object[]>... results
是一樣的;
- 記憶體類別透過宣告