SimpleDAO - 企業(yè)級數據訪問的革命

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 框架的全方位對比、常見質疑的深度反駁,以及“不添亂即大善”的設計哲學,可查看:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容