致謝:
非常感謝多個網友的積極參與和反饋,提出這麼多的好意見,讓sqltoy越來越堅實可靠!開源地址:
更新內容
1、優化了執行輸出,避免存在2次日誌輸出現象,導致日誌分析幹擾
2、改進批量操作的日誌輸出信息,增加了批量執行的記錄數量
3、修復特定情況下存儲過程調用bug
4、修復報表集成使用sqltoy自身的匯總計算前面的命名空間沒有處理的缺陷
5、分頁優化代碼優化
快速了解 sqltoy-orm:
sqltoy是全新一代的ORM框架,兼顧jpa對象式操作的優勢,同時極大增強了查詢功能,輔以科學的sql編寫模式、巧妙的緩存翻譯集成、極致的分頁優化以及針對大規模數據下的分庫分表、超複雜場景下的mongodb、elastic、clickhouse組合應用! sqltoy給你帶來了多種主鍵策略,除常規的UUID、sequence、identity外,還包含雪花算法和基於redis產生有規則的業務主鍵等。 sqltoy還提供了針對統計分析的:數據旋轉、無限級分組計算、同比環比等來減少開發者寫複雜sql。 sqltoy在很多方面提供了極為實用的方法,如:樹形表處理、isUnique、findTop、getRandomResult、updateFetch等等 sqltoy不走jooq全對象式、mybatis全sql式這種不是天就是地的極端路子,緊貼項目實戰發展起來的框架,讓各自技術以合理的方式應用於合理的地方!簡要舉例介紹(因篇幅問題部分舉例):
JPA式的CRUD,但規避了其不足,提供了默認的SqlToyCRUDService(簡單的則無需寫service方法) 和 SqlToyLazyDao(開發無需自己寫Dao,只需要寫Service業務邏輯),可以了解類似於update、updateAll、saveOrUpdate等內在邏輯,減少了資料庫交互,考慮了高並發和業務對象變更的特徵!@Autowired private SqlToyCRUDService sqlToyCRUDService; //基於對象保存 sqlToyCRUDService.save(staffInfo); //基於對象更新(欄位值為null的不會參與變更) sqlToyCRUDService.update(staffInfo); //深度變更,全部欄位都參與變更 sqlToyCRUDService.updateDeeply(staffInfo); //基於對象更新(制定強制修改的欄位) sqlToyCRUDService.update(staffInfo,new String[]{"staffName","onDuty"}); //基於對象更新 sqlToyCRUDService.saveOrUpdate(staffInfo); //加載對象 sqlToyCRUDService.load(new StaffInfoVO("S190715009")); //加鎖獲取對象 sqlToyCRUDService.load(new StaffInfoVO("S190715009"),LockMode.UPGRADE); //判斷對象是否唯一 sqlToyCRUDService.isUnique(staffInfo, "staffCode"); //delete\deleteAll\updateAll\loadAll 等等不一一寫完
//單表對象查詢,直接傳參模式List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class, EntityQuery.create().where("#[staffName like ?] #[ and status=?]").values("陳", 1).lock(LockMode.UPGRADE) .orderBy("staffName").orderByDesc("createTime"));//單表查詢,對象傳參模式List<StaffInfoVO> staffVOs = sqlToyLazyDao.findEntity(StaffInfoVO.class, EntityQuery.create().where("#[staffName like :staffName] #[ and status=:status]") .values(new StaffInfoVO().setStatus(1).setEmail("test3@aliyun.com")));//代碼中鏈式查詢並刪除Long deleteCount = sqlToyLazyDao.deleteByQuery(StaffInfoVO.class, EntityQuery.create().where("status=:status").values(new StaffInfoVO().setStatus(1)));//鏈式變更Long updateCount = sqlToyLazyDao.updateByQuery(StaffInfoVO.class, EntityUpdate.create().set("staffName", "張三").where("staffName like ? and status=?").values("陳", 1));
更強大的查詢,sqltoy強調複雜查詢建議放置於xml中跟代碼分離(但是可以寫在代碼中的),不要見xml就反,請深入了解之後再反!//sqltoy統一的規則就是直接傳遞sql語句或者對應的sqlId,並不是說sql只能寫在xml中(推薦但不絕對)findBySql(final String sqlOrSqlId, final String[] paramsNamed, final Object[] paramsValue, final Class<T> voClass)//嫌棄上面的格式化傳參也可以使用這樣鏈式查詢sqlToyLazyDao.findByQuery(new QueryExecutor("sqltoy_order_search").names("orderId", "authedOrganIds") .values(null, authedOrgans).resultType(DeviceOrderInfoVO.class));
我們對比一下mybatis的實現(很簡單的sql寫的如此讓人不願意寫!):
緩存翻譯,利用緩存減少關聯查詢,簡化sql同時大幅提升效率