SimpleDAO - 企业级数据访问的革命

SQL-First · 简洁高效 · 非ORM框架
[图片上传失败...(image-270bb4-1770531152273)]
[图片上传失败...(image-8eb8f5-1770531152273)]
[图片上传失败...(image-2aae63-1770531152273)]
[图片上传失败...(image-cd1d80-1770531152273)]

📋 内容导航

🎯 我们不一样:为什么抛弃传统ORM?

如果你也受够了这些:

  • MyBatis 的 XML 配置地狱、Mapper 接口冗余、OGNL 表达式调试困难
  • JPA/Hibernate 的黑盒 SQL、N+1 查询、复杂联表的手足无措
  • MyBatis Plus 的单表/多表 API 割裂、动态 SQL 维护噩梦
  • ❌ 所有 ORM 在单表到联表时的思维切换和性能失控

那么,SimpleDAO 就是你一直在寻找的答案。

✨ 核心理念:大道至简

// 单表操作:继承 BaseDao,零代码
@Repository
public class UserDao extends BaseDao<User> {
    // 空类获得所有 CRUD 能力
    // save()/update()/delete()/page()/list() 等 20+ 方法
}

// 联表查询:原生 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,统一的体验
public Page<UserVO> pageJoin(UserCond cond) {
    return page(JOIN_SQL, cond, UserVO.class);
}

🚀 五大维度,全方位企业级痛点解决方案

一、开发效率:砍掉冗余,极致提效(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. 统一单表/多表 API

// 单表
userDao.page(userCond);
// 多表(同样的 API)
userDao.page(joinSql, userCond, UserVO.class);

对比 MyBatis Plus:告别 BaseMapper/XML 两套思维的割裂

🔥 3. 类型安全的动态 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); // 关联表、主表集合
    add("AND s.student_name LIKE ?", studentName, 3); // 关联表模糊
    
    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 风格统一化

// Sql.wash() 自动处理:
// 1. 去除多余空格/换行
// 2. 规范逗号位置  
// 3. 统一关键字大小写
// 日志输出整洁 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("存在关联数据")
// 无引用记录 → 正常删除

🛡️ 14. 防止全表误操作

// BaseJdbc.update() 执行前强制检查:
// 1. 必须有 WHERE 关键字
// 2. 不能是空 WHERE(如 WHERE 1=1)
// 违规直接抛异常熔断,保护生产数据

三、生产适配:复杂场景的优雅方案(3条)

🏭 16. 奇葩数据库兼容

痛点:阿里 OceanBase 不支持 DELETE 语句带表别名
解法BaseJdbc.update() 自动识别并移除 t. 别名,业务无感适配。

🏭 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 生态原生集成(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. 白盒化低代码(对比黑盒平台)

维度 传统低代码平台 SimpleDAO 生成器
可控性 ❌黑盒,生成代码不可见 ✅ 模板完全开源,可定制
扩展性 ❌ 受平台限制 ✅ 基于标准 Java,无限扩展
调试体验 ❌ 困难 ✅ 标准 Java 调试
团队规范 ❌ 难统一 ✅ 模板按团队规范定制
技术栈绑定 ❌ 强绑定 ✅ 支持任意技术栈
// 生成的是标准 Java 代码,不是黑盒魔法
// 你可以:
// 1. 修改 Freemarker 模板,适应团队规范
// 2. 添加自定义模板(数据权限/导出模板)
// 3. 对接任意技术栈(Vue/React/Redis/MQ)
// 4. 版本控制、Code Review,所有标准流程

📊 性能对比:数据说话

操作类型 SimpleDAO MyBatis JPA 优势
单表插入 1000 条 125 ms 210 ms (+68%) 350 ms (+180%) 🚀 快 68-180%
单表分页查询 45 ms 80 ms (+78%) 120 ms (+167%) 快 78-167%
5 表联表分页 110 ms 180 ms (+64%) 250 ms (+127%) 🔥 快 64-127%
复杂报表查询 200 ms 350 ms (+75%) 500 ms (+150%) 💎 快 75-150%

测试环境: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. 创建实体

@Table("sys_user")
public class User {
    @Id("snow") // 雪花主键
    private Long id;
    private String name;
    private Integer age;
    // 自动映射驼峰与下划线
    private Date createTime;
    // Lombok 或其他 getter/setter
}

3. 创建 Dao(就这么简单)

@Repository
public class UserDao extends BaseDao<User> {
    // 单表操作已全部拥有
    // 需要联表?直接写 SQL 方法
}

4. 使用示例

@Autowired
private UserDao userDao;

// 分页查询
UserCond cond = UserCond.builder()
    .name("张")
    .ageMin(18)
    .build();
Page<User> page = userDao.page(cond);

// 联表查询
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%
  • 开发时间缩短 50%
  • 学习成本:2 小时 vs 传统框架的 2 天

2. 安全体系

  • 从 SQL 注入到误删数据的全方位防护
  • 编译时检查 + 运行时验证的双重保障

3. 生产就绪

  • 兼容各种"奇葩"数据库
  • 分布式、大数据量、高并发场景全覆盖
  • 额外适配代码

4. 生态融合

  • 100% Spring 原生生态
  • 扩展上限 = Spring 的上限
  • 无需学习第三方整合

5. 工程赋能

  • 全链路代码生成,效率提升 80%
  • 白盒化设计,兼顾效率与灵活性
  • 团队规范一键固化

📚 设计哲学

1. 不是 ORM,而是 SQL 增强工具

我们不试图替代 SQL,而是让 SQL 写得更爽。
不包装、不扭曲、不隐藏 SQL。
相信 SQL 是关系数据库经过 50 年验证的最佳查询语言。

2. 简洁比复杂更需要勇气

敢于不提供"高级特性"(因为它们很少被用到)
敢于让用户直接写 SQL(因为他们本来就会)
敢于只解决 90% 的常见场景(剩下的 10% 用原生方式)

3. 开发者时间是最宝贵的资源

每增加一个特性,就问:这为开发者节省了多少时间?
每增加一层抽象,就问:这真的有必要吗?
我们的目标:让开发者每天早下班 1 小时

🤔 常见问题

Q: SimpleDAO 和 MyBatis Plus 有什么区别?
A: MP 是"半ORM"——单表用对象操作,多表退回 XML。SimpleDAO 是"SQL-First"——单表/多表都用 SQL 思维,API 完全统一。

Q: 需要学习新语法吗?
A: 不需要。你会 SQL 和 Java,就会用 SimpleDAO。没有 XML、OGNL、JPQL 等额外语法。

Q: 适合微服务架构吗?
A: 特别适合。轻量级(核心仅3类)、无外部依赖、与 Spring Cloud 生态完美融合。

Q: 从 MyBatis 迁移成本高吗?
A: 极低。保持 SQL 不变,只需将 Mapper 改为 Dao,XML 中的 SQL 移到 Java 中。

🤝 加入我们

SimpleDAO 正在改变开发者与数据库交互的方式。如果你:

  • ✅ 厌倦了复杂框架的折磨
  • ✅ 相信简单就是美
  • ✅ 重视开发效率和生活质量
  • ✅ 愿意分享和贡献

欢迎:

  • Star 我们的项目
  • 📚 阅读 贡献指南
  • 🐛 报告 Issue 或提交 PR
  • 💬 加入 讨论群组

📄 许可证

MIT License - 你可以自由地使用、修改、分发 SimpleDAO。

🎯 最后的话

SimpleDAO 不是为了成为又一个流行的框架,而是为了证明一件事:

技术可以更简单,开发可以更愉快,程序员可以早下班。

如果你也受够了复杂框架的折磨,欢迎尝试 SimpleDAO。
如果你觉得"这太简单了,不够高级",没关系——我们本来就不是为你设计的。

我们为那些:

  • 想要高效完成工作的人
  • 想要早点回家陪家人的人
  • 相信简单比复杂更有力量的人

而存在。


SimpleDAO: SQL-First, 简洁高效。
把时间留给生活,而不是框架。


SimpleDAO 已在生产环境稳定运行 3年+,支撑日均百万级请求,服务十余家企业客户。

📚 深度阅读

如果想了解 SimpleDAO 的底层设计逻辑、与 ORM 框架的全方位对比、常见质疑的深度反驳,以及“不添乱即大善”的设计哲学,可查看:
📄 SimpleDAO 全场景碾压ORM框架白皮书
📄 源码下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容