sqlHelper是基於 spring-data-jdbc 的 orm,支援 sqlite、mysql、postgresql 三種資料庫,主要特點是像 mongodb 一樣使用 sql 資料庫。
sqlHelper 為 mongoHelper 的兄弟專案,旨在為關係型資料庫提供近似 mongodb 的使用體驗。即開發過程中完全不用關心資料庫結構,在任意一個空白或是有結構的資料庫中,在專案啟動的瞬間都可以立刻構建出與 pojo 類對應的資料庫結構,可以立即開始進行業務開發。除了查詢 sql 語句的執行效果,已經完全不必開啟資料庫客戶端對資料庫結構進行管理了。
本專案只適用於 springBoot 專案,專案也依賴 springBoot 相關庫,springMVC 專案無法使用。另外專案依賴了 hutool 提供的諸多 Util 工具,讓程式碼更簡潔。
演示應用專案:https://gitee.com/cym1102/nginxWebUI 此專案是nginx的WebUI專案,資料庫使用 sqlite,因此伺服器上不需要安裝任何資料庫。
1. 基本操作
本orm會在容器中注入一個物件SqlHelper,這個物件擁有諸多單表查詢功能,如下
這個SqlHelper能夠完成所有查詢任務,插入和更新操作能夠自動判斷pojo的型別操作對應表,查詢操作根據傳入的Class進行對應表操作,本orm所有資料庫操作都基於SqlHelper的功能,不用像mybatis一樣,每個表都要建立一套Mapper,xml,Service,model,大大減少資料層的程式碼量。可以將SqlHelper直接注入到controller層,簡單的操作直接呼叫SqlHelper進行操作,不需要呼叫service層。
而複雜的操作及事務處理需要service層,將SqlHelper注入service,並使用service層的@Transactional註解就能使用springBoot管理的事務功能。
2. 複雜查詢功能
本orm的查詢功能都在SqlHelper的findByQuery,findPage方法中.使用CriteriaAndWrapper和CriteriaOrWrapper物件作為sql的拼接物件
// 根據輸入條件進行查詢 public List<User> search(String word, Integer type) { CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper(); if (StrUtil.isNotEmpty(word)) { criteriaAndWrapper.and(new CriteriaOrWrapper().like("name", word).like("phone", word)); } if (type != null) { criteriaAndWrapper.eq("type", type); } List<User> userList = SqlHelper.findListByQuery(criteriaAndWrapper, User.class); return userList ; }
以上程式碼組裝了類似於select * from user where (name like '%xxx%' or phone like '%xxx%') and type = xxx的查詢語句。
本專案不支援使用left join rigth join等連線查詢,關係型資料庫的連表查詢能解決很多問題,但在大公司中已不再推薦使用,因為很難做資料庫最佳化,資料量龐大時查詢時間很慢而且很難進行最佳化。需要連表查詢時,先查出對方id集,再使用in進行包含查詢,可以很方便的走索引,而且分庫的時候很容易修改。這樣使用的話,實際是將關係型資料庫用成了近似文件型資料庫,表之間不再產生關聯。
基於以上理念,本orm還提供了一些小功能用於完善這種多次連線查詢,在mongoHelper中有以下方法
用法示例:
// 查出訂單下的所有商品(OrderProduct.class為訂單商品對照表) public List<Product> getProductList(String orderId) { List<String> productIds = mongoHelper.findPropertiesByQuery(new CriteriaAndWrapper().eq("orderId", orderId), OrderProduct.class, "productId", String.class); return mongoHelper.findListByQuery(new CriteriaAndWrapper().in("id", productIds), Product.class); } // 根據產品名查出所有訂單 public Page search(Page page, String keywords) { CriteriaOrWrapper criteriaOrWrapper = new CriteriaOrWrapper(); if (StrUtil.isNotEmpty(keywords)) { List<String> productIds = mongoHelper.findIdsByQuery(new CriteriaAndWrapper().like("name", keywords), Product.class); List<String> orderIds = mongoHelper.findPropertiesByQuery(new CriteriaAndWrapper().in("productId", productIds), OrderProduct.class, "orderId", String.class); criteriaOrWrapper.in("id", orderIds); } page = mongoHelper.findPage(criteriaOrWrapper, page, Order.class); return page; }
3. 分頁查詢,
本orm提供一個Page類,包含count總記錄數,limit每頁記錄數,curr起始頁(從1開始),records結果列表四個屬性,只要將包含curr和limit資料的Page物件傳入findPage,即可查詢出records,count的資料並自動返回到Page物件中。這裡三個屬性參考了layui的分頁引數,可直接無縫對接layui的分頁控制元件。
public Page search(Page page, String word, Integer type) { CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper(); if (StrUtil.isNotEmpty(word)) { criteriaAndWrapper.and(new CriteriaOrWrapper().like("name", word).like("phone", word)); } if (type != null) { criteriaAndWrapper.eq("type", type); } Sort sort = Sort.by(Direction.DESC, "creatTime"); page = SqlHelper.findPage(criteriaAndWrapper, sort, page, User.class); return page; }
[admin
]