歡迎您光臨本站 註冊首頁

sqlHelper 0.0.6 釋出,像 MongoDB 一樣使用 SQL 資料庫

←手機掃碼閱讀     admin @ 2020-05-14 , reply:0

sqlHelper是基於 spring-data-jdbc 的 orm,支援 sqlite、mysql、postgresql 三種資料庫,主要特點是像 mongodb 一樣使用 sql 資料庫。

sqlHelper 為 mongoHelper 的兄弟專案,旨在為關係型資料庫提供近似 mongodb 的使用體驗。即開發過程中完全不用關心資料庫結構,在任意一個空白或是有結構的資料庫中,在專案啟動的瞬間都可以立刻構建出與 pojo 類對應的資料庫結構,可以立即開始進行業務開發。除了查詢 sql 語句的執行效果,已經完全不必開啟資料庫客戶端對資料庫結構進行管理了。

更新說明

  1. 修改部分bug
  2. 增加了對複合索引的支援,新增兩個註解@SingleIndex 單索引 @CompositeIndex 複合索引, 可自動生成索引

軟體架構

本專案只適用於 springBoot 專案,專案也依賴 springBoot 相關庫,springMVC 專案無法使用。另外專案依賴了 hutool 提供的諸多 Util 工具,讓程式碼更簡潔。

演示應用專案:https://gitee.com/cym1102/nginxWebUI  此專案是nginx的WebUI專案,資料庫使用 sqlite,因此伺服器上不需要安裝任何資料庫。

使用說明

1. 基本操作

本orm會在容器中注入一個物件SqlHelper,這個物件擁有諸多單表查詢功能,如下

  • 按id刪除:deleteById(String, Class<?>)
  • 按條件刪除:deleteByQuery(CriteriaAndWrapper, Class<?>)
  • 查詢所有:findAll(Class)
  • 查詢數量:findCount(Class<?>)
  • 根據id查詢:findById(String, Class)
  • 根據條件查詢:findListByQuery(CriteriaAndWrapper, Class<?>)
  • 根據條件查詢並分頁:findPage(CriteriaAndWrapper, Page, Class<?>)
  • 插入:insert(Object)
  • 插入或更新:insertOrUpdate(Object)
  • 根據id更新:updateById(Object)
  • 根據id更新全部欄位:updateAllColumnById(Object)
  • 累加某一個欄位的數量, 原子操作:addCountById(String id, String property, Long count, Class<?> clazz)

這個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中有以下方法

  • 只查出表的id作為List返回:findIdsByQuery(CriteriaAndWrapper criteriaAndWrapper, Class<?> clazz)
  • 只查出表的某個欄位作為List返回:findPropertiesByQuery(CriteriaAndWrapper criteriaAndWrapper, Class<?> documentClass, String property, Class propertyClass)

用法示例:


 // 查出訂單下的所有商品(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 ]

來源:OsChina
連結:https://www.oschina.net/news/115616/sqlhelper-0-0-6-released
sqlHelper 0.0.6 釋出,像 MongoDB 一樣使用 SQL 資料庫已經有255次圍觀

http://coctec.com/news/all/show-post-234492.html