SQL-First · 簡潔高效 · 非ORM框架
[圖片上傳失敗...(image-270bb4-1770531152273)]
[圖片上傳失敗...(image-8eb8f5-1770531152273)]
[圖片上傳失敗...(image-2aae63-1770531152273)]
[圖片上傳失敗...(image-cd1d80-1770531152273)]
?? 源碼下載
?? 立即實操:SimpleDAO 快速開始(跑通完整案例)
?? 內容導航
?? 我們不一樣:為什么拋棄傳統(tǒng)ORM?
如果你也受夠了這些:
- ? MyBatis 的 XML 配置地獄、Mapper 接口冗余、OGNL 表達式調試困難
- ? JPA/Hibernate 的黑盒 SQL、N+1 查詢、復雜聯(lián)表的手足無措
- ? MyBatis Plus 的單表/多表 API 割裂、動態(tài) SQL 維護噩夢
- ? 所有 ORM 在單表到聯(lián)表時的思維切換和性能失控
那么,SimpleDAO 就是你一直在尋找的答案。
? 核心理念:大道至簡
// 單表操作:繼承 BaseDao,零代碼
@Repository
public class UserDao extends BaseDao<User> {
// 空類獲得所有 CRUD 能力
// save()/update()/delete()/page()/list() 等 20+ 方法
}
// 聯(lián)表查詢:原生 SQL,直接高效
private static final String JOIN_SQL = """
SELECT u.*, d.dept_name, r.role_name
FROM user u
LEFT JOIN dept d ON u.dept_id = d.id
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
""";
// 同樣的 API,統(tǒng)一的體驗
public Page<UserVO> pageJoin(UserCond cond) {
return page(JOIN_SQL, cond, UserVO.class);
}
?? 五大維度,全方位企業(yè)級痛點解決方案
一、開發(fā)效率:砍掉冗余,極致提效(9條)
?? 1. 終結 XML 配置地獄
@Table("sys_user")
public class User {
@Id("snow") // 雪花主鍵
private Long id;
private String userName; // 自動映射為 user_name
// 添加字段?直接改 Java 代碼,SQL 自動適配
}
對比 MyBatis:無需 XML、ResultMap、association/collection 標簽
?? 2. 統(tǒng)一單表/多表 API
// 單表
userDao.page(userCond);
// 多表(同樣的 API)
userDao.page(joinSql, userCond, UserVO.class);
對比 MyBatis Plus:告別 BaseMapper/XML 兩套思維的割裂
?? 3. 類型安全的動態(tài) SQL
private Byte[] refundBillTypeIn;
......
@Override
protected void addCondition() {
and("signup_code LIKE", signupCode, 3); // 主表模糊
and("consume_count >", consumeCount); // 主表大于小于
and("finish =", finish);// 主表等值
add("AND r.refund_type IN ", refundBillTypeIn); // 關聯(lián)表、主表集合
add("AND s.student_name LIKE ?", studentName, 3); // 關聯(lián)表模糊
add("AND (t.war_start_date = DATE(NOW()) OR t.start_date = DATE(NOW()))", YesNo.yes(waitInSchool)); // SQL片斷,布爾表達式
add("AND t.grade_id IN (SELECT distinct grade_id FROM exam_signup WHERE dr=0)"); // SQL片斷
}
對比 MyBatis:告別 <if test=""> 嵌套和 OGNL 表達式錯誤
?? 4. 分頁標準化(一行代碼)
Page<User> page = userDao.page(cond);
// 自動包含:dataList、rowCount、pageInfo
// 智能 COUNT SQL 解析,避免子查詢性能問題
?? 5. 靈活的更新策略
// 非空字段更新(90%場景)
userDao.update(user);
// 全字段更新(含 null)
userDao.updateNull(user);
// 條件更新(精準控制)
userDao.update(user, condition);
?? 7. 高性能批處理
// 批量插入(一次網絡交互)
userDao.saveBatch(userList);
// 批量替換(MySQL Upsert)
userDao.replaceBatch(userList);
// 底層使用 NamedParameterJdbcTemplate.batchUpdate
?? 8. 自動審計字段
userDao.save(user); // 自動設置:id、createTime、createBy、dr=0
userDao.update(user); // 自動設置:updateTime、updateBy
// 零配置,硬編碼匹配公共字段名
?? 9. SQL 風格統(tǒng)一化
// Sql.wash() 自動處理:
// 1. 去除多余空格/換行
// 2. 規(guī)范逗號位置
// 3. 統(tǒng)一關鍵字大小寫
// 日志輸出整潔 SQL,調試一目了然
二、數據安全:從源頭構建防線(6條)
??? 10. 根治 SQL 注入
全鏈路參數化查詢 + BeanPropertyRowMapper 類型映射
從 Java 到數據庫的類型安全通道,徹底杜絕注入風險。
??? 11. 標準化軟刪除
userDao.delete(1, 2, 3); // 自動判斷:
// 有 dr 字段 → UPDATE SET dr=1
// 無 dr 字段 → DELETE FROM
// 告別每個表手寫 SET dr=1 的邏輯
??? 12. 便捷行鎖控制
// 不加鎖(默認)
User user = userDao.findById(1);
// 加行鎖(FOR UPDATE)
User user = userDao.findById(1, true);
// 僅按需開啟,不影響其他查詢性能
??? 13. 應用層外鍵約束
// 微服務無物理外鍵?我們來補!
userDao.checkRef = true; // 開啟引用檢查
// 刪除時自動查詢 sys_table_ref 配置
// 有引用記錄 → BusinessException("存在關聯(lián)數據")
// 無引用記錄 → 正常刪除
??? 14. 防止全表誤操作
// BaseJdbc.update() 執(zhí)行前強制檢查:
// 1. 必須有 WHERE 關鍵字
// 2. 不能是空 WHERE(如 WHERE 1=1)
// 違規(guī)直接拋異常熔斷,保護生產數據
三、生產適配:復雜場景的優(yōu)雅方案(3條)
?? 16. 奇葩數據庫兼容
痛點:阿里 OceanBase 不支持 DELETE 語句帶表別名
解法:BaseJdbc.update() 自動識別并移除 t. 別名,業(yè)務無感適配。
?? 17. 分布式主鍵一體化
@Id("snow")
private Long id; // 自動生成分布式唯一 ID
// 支持反向解析
Long timestamp = SnowflakeId.reverseId(id);
// 問題排查:根據 ID 追蹤生成時間
?? 18. 架構分層強制約束
public abstract class BaseDao<T> {
// 核心方法均為 protected
protected Page<T> page(Condition cond) { ... }
// 從語法層面強制 Service 層作為中間層
// 杜絕 Controller 直調 DAO 的反模式
}
四、Spring 生態(tài)原生集成(5條)
?? 19. 零整合成本
// 基于 Spring JdbcTemplate 構建
// 無需 mybatis-spring 等適配層
@Autowired
private JdbcTemplate jdbcTemplate; // Spring 原生組件
?? 20. 事務無縫對接
@Transactional // 直接用 Spring 注解
public void businessMethod() {
userDao.save(user);
orderDao.save(order);
// 100% 兼容 Spring 事務管理
}
?? 21. 多數據源原生支持
// Spring 多數據源直接使用
@Primary
@Bean
public DataSource masterDataSource() {
return DataSourceBuilder.create()...;
}
@Bean
public DataSource slaveDataSource() {
return DataSourceBuilder.create()...;
}
// SimpleDAO 自動適配,無需額外配置
?? 22. Spring Cache 無縫集成
@Service
public class UserService {
@Cacheable("users")
public User getUser(Long id) {
return userDao.findById(id); // DAO 是標準 Spring Bean
}
// 無需修改 DAO 層,直接享受 Spring Cache 能力
}
?? 23. AOP 無侵入擴展
@Aspect
@Component
public class LogAspect {
@Around("@annotation(com.simpledao.annotation.BusinessAuth)")
public Object authCheck(ProceedingJoinPoint joinPoint) {
// 基于 Spring AOP,無侵入增強 DAO 方法
return joinPoint.proceed();
}
}
五、工程提效:全鏈路代碼生成(2條)
? 24. 全棧代碼生成器
生成內容(開箱即用):
- ? 后端:Entity + DAO + Service + Controller + Condition + VO
- ? 前端:列表頁 + 表單頁 + 樹形組件 + 彈窗(Vue + Element ui)
- ? 文檔:Swagger 注解 + API 文檔
- ? 測試:單元測試模板
效率提升 80%,重復 CRUD 代碼從此消失。
? 25. 白盒化低代碼(對比黑盒平臺)
| 維度 | 傳統(tǒng)低代碼平臺 | SimpleDAO 生成器 |
|---|---|---|
| 可控性 | ?黑盒,生成代碼不可見 | ? 模板完全開源,可定制 |
| 擴展性 | ? 受平臺限制 | ? 基于標準 Java,無限擴展 |
| 調試體驗 | ? 困難 | ? 標準 Java 調試 |
| 團隊規(guī)范 | ? 難統(tǒng)一 | ? 模板按團隊規(guī)范定制 |
| 技術棧綁定 | ? 強綁定 | ? 支持任意技術棧 |
// 生成的是標準 Java 代碼,不是黑盒魔法
// 你可以:
// 1. 修改 Freemarker 模板,適應團隊規(guī)范
// 2. 添加自定義模板(數據權限/導出模板)
// 3. 對接任意技術棧(Vue/React/Redis/MQ)
// 4. 版本控制、Code Review,所有標準流程
?? 性能對比:數據說話
| 操作類型 | SimpleDAO | MyBatis | JPA | 優(yōu)勢 |
|---|---|---|---|---|
| 單表插入 1000 條 | 125 ms | 210 ms (+68%) | 350 ms (+180%) | ?? 快 68-180% |
| 單表分頁查詢 | 45 ms | 80 ms (+78%) | 120 ms (+167%) | ? 快 78-167% |
| 5 表聯(lián)表分頁 | 110 ms | 180 ms (+64%) | 250 ms (+127%) | ?? 快 64-127% |
| 復雜報表查詢 | 200 ms | 350 ms (+75%) | 500 ms (+150%) | ?? 快 75-150% |
測試環(huán)境:MySQL 8.0,100 萬數據量,Spring Boot 應用,JDK 17
?? 快速開始
1. 添加依賴
<dependency>
<groupId>com.simpledao</groupId>
<artifactId>simple-dao-core</artifactId>
<version>1.0.0</version>
</dependency>
2. 創(chuàng)建實體
@Table("sys_user")
public class User {
@Id("snow") // 雪花主鍵
private Long id;
private String name;
private Integer age;
// 自動映射駝峰與下劃線
private Date createTime;
// Lombok 或其他 getter/setter
}
3. 創(chuàng)建 Dao(就這么簡單)
@Repository
public class UserDao extends BaseDao<User> {
// 單表操作已全部擁有
// 需要聯(lián)表?直接寫 SQL 方法
}
4. 使用示例
@Autowired
private UserDao userDao;
// 分頁查詢
UserCond cond = UserCond.builder()
.name("張")
.ageMin(18)
.build();
Page<User> page = userDao.page(cond);
// 聯(lián)表查詢
public Page<UserVO> pageWithDept(UserCond cond) {
String sql = """
SELECT u.*, d.name as dept_name
FROM user u LEFT JOIN dept d ON u.dept_id = d.id
""";
return userDao.page(sql, cond, UserVO.class);
}
?? 核心價值總結
SimpleDAO 通過 25 個精準的痛點解決方案,實現了五個維度的降維打擊:
1. 效率革命
- 代碼量減少 60-80%
- 開發(fā)時間縮短 50%
- 學習成本:2 小時 vs 傳統(tǒng)框架的 2 天
2. 安全體系
- 從 SQL 注入到誤刪數據的全方位防護
- 編譯時檢查 + 運行時驗證的雙重保障
3. 生產就緒
- 兼容各種"奇葩"數據庫
- 分布式、大數據量、高并發(fā)場景全覆蓋
- 零額外適配代碼
4. 生態(tài)融合
- 100% Spring 原生生態(tài)
- 擴展上限 = Spring 的上限
- 無需學習第三方整合
5. 工程賦能
- 全鏈路代碼生成,效率提升 80%
- 白盒化設計,兼顧效率與靈活性
- 團隊規(guī)范一鍵固化
?? 設計哲學
1. 不是 ORM,而是 SQL 增強工具
我們不試圖替代 SQL,而是讓 SQL 寫得更爽。
不包裝、不扭曲、不隱藏 SQL。
相信 SQL 是關系數據庫經過 50 年驗證的最佳查詢語言。
2. 簡潔比復雜更需要勇氣
敢于不提供"高級特性"(因為它們很少被用到)
敢于讓用戶直接寫 SQL(因為他們本來就會)
敢于只解決 90% 的常見場景(剩下的 10% 用原生方式)
3. 開發(fā)者時間是最寶貴的資源
每增加一個特性,就問:這為開發(fā)者節(jié)省了多少時間?
每增加一層抽象,就問:這真的有必要嗎?
我們的目標:讓開發(fā)者每天早下班 1 小時。
?? 常見問題
Q: SimpleDAO 和 MyBatis Plus 有什么區(qū)別?
A: MP 是"半ORM"——單表用對象操作,多表退回 XML。SimpleDAO 是"SQL-First"——單表/多表都用 SQL 思維,API 完全統(tǒng)一。
Q: 需要學習新語法嗎?
A: 不需要。你會 SQL 和 Java,就會用 SimpleDAO。沒有 XML、OGNL、JPQL 等額外語法。
Q: 適合微服務架構嗎?
A: 特別適合。輕量級(核心僅3類)、無外部依賴、與 Spring Cloud 生態(tài)完美融合。
Q: 從 MyBatis 遷移成本高嗎?
A: 極低。保持 SQL 不變,只需將 Mapper 改為 Dao,XML 中的 SQL 移到 Java 中。
?? 加入我們
SimpleDAO 正在改變開發(fā)者與數據庫交互的方式。如果你:
- ? 厭倦了復雜框架的折磨
- ? 相信簡單就是美
- ? 重視開發(fā)效率和生活質量
- ? 愿意分享和貢獻
歡迎:
- ? Star 我們的項目
- ?? 閱讀 貢獻指南
- ?? 報告 Issue 或提交 PR
- ?? 加入 討論群組
?? 許可證
MIT License - 你可以自由地使用、修改、分發(fā) SimpleDAO。
?? 最后的話
SimpleDAO 不是為了成為又一個流行的框架,而是為了證明一件事:
技術可以更簡單,開發(fā)可以更愉快,程序員可以早下班。
如果你也受夠了復雜框架的折磨,歡迎嘗試 SimpleDAO。
如果你覺得"這太簡單了,不夠高級",沒關系——我們本來就不是為你設計的。
我們?yōu)槟切?/p>
- 想要高效完成工作的人
- 想要早點回家陪家人的人
- 相信簡單比復雜更有力量的人
而存在。
SimpleDAO: SQL-First, 簡潔高效。
把時間留給生活,而不是框架。
SimpleDAO 已在生產環(huán)境穩(wěn)定運行 3年+,支撐日均百萬級請求,服務十余家企業(yè)客戶。
?? 深度閱讀
如果想了解 SimpleDAO 的底層設計邏輯、與 ORM 框架的全方位對比、常見質疑的深度反駁,以及“不添亂即大善”的設計哲學,可查看: