{"id":18385675,"url":"https://github.com/yiding-he/hydrogen-dao","last_synced_at":"2025-06-23T00:04:48.527Z","repository":{"id":45139907,"uuid":"144979440","full_name":"yiding-he/hydrogen-dao","owner":"yiding-he","description":"A Lightweight JDBC Access Framework","archived":false,"fork":false,"pushed_at":"2025-04-18T02:48:39.000Z","size":5432,"stargazers_count":16,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"6.0.0-jdk17","last_synced_at":"2025-04-18T15:29:23.622Z","etag":null,"topics":["dao","java","jdbc"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yiding-he.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-08-16T11:36:38.000Z","updated_at":"2025-04-10T10:27:35.000Z","dependencies_parsed_at":"2024-01-15T10:35:18.572Z","dependency_job_id":"7ee01f48-88f7-4907-bc47-942871b01b78","html_url":"https://github.com/yiding-he/hydrogen-dao","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/yiding-he/hydrogen-dao","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiding-he%2Fhydrogen-dao","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiding-he%2Fhydrogen-dao/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiding-he%2Fhydrogen-dao/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiding-he%2Fhydrogen-dao/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yiding-he","download_url":"https://codeload.github.com/yiding-he/hydrogen-dao/tar.gz/refs/heads/6.0.0-jdk17","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yiding-he%2Fhydrogen-dao/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261386724,"owners_count":23150869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dao","java","jdbc"],"created_at":"2024-11-06T01:18:36.834Z","updated_at":"2025-06-23T00:04:43.509Z","avatar_url":"https://github.com/yiding-he.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp\u003e\n  \u003ca href=\"https://github.com/996icu/996.ICU/blob/master/LICENSE\"\u003e\n    \u003cimg alt=\"996icu\" src=\"https://img.shields.io/badge/license-NPL%20(The%20996%20Prohibited%20License)-blue.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0\"\u003e\n    \u003cimg alt=\"code style\" src=\"https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\n# hydrogen-dao\n\nhydrogen-dao 是一个 Java 的轻量级的数据库访问库，依赖标准的 JDBC 接口。主要功能有：\n\n* 执行带参数的查询和更新；\n* 查询结果自动转为 Java Bean；\n* 根据参数值来动态组装 SQL 语句；\n* 简化数据库事务；\n* 简化分页查询和批处理；\n* 连接池管理，状态查看。\n\n使用方法参考源码下的 `docs` 目录。\n\n分支版本：\n- `6.X` 基于 Java 17 开发，ArtifactId 为 `hydrogen-dao-j17`；\n- `4.X` 基于 Java 11 开发；\n- `3.X` 及以下版本基于 Java 8 开发。\n\n同一个项目中只能使用一个版本，不能多版本同时存在。\n\n## 添加依赖关系\n\n请在 pom.xml 的 `\u003cdependencies\u003e` 元素当中添加下面的内容：\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.yiding-he\u003c/groupId\u003e\n    \u003cartifactId\u003ehydrogen-dao-j17\u003c/artifactId\u003e\n    \u003cversion\u003e${hydrogen-dao.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 示例\n\n### 初始化\n\n```java\n// 初始化 DataSource 对象\nDataSource dataSource = ...\n\n// 将 DataSource 对象注册到 DataSources\ncom.hyd.dao.DataSources.getInstance().setDataSource(\"default\", dataSource);\n\n// 获得针对某个数据源的 DAO 对象\nDAO dao = new DAO(\"default\");\n```\n\n### Spring Boot 自动初始化\n\n如果你的项目是基于 Spring Boot，那么可以简化上面的过程。首先添加下面的依赖关系：\n\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.github.yiding-he\u003c/groupId\u003e\n\t\u003cartifactId\u003espring-boot-starter-hydrogen-dao\u003c/artifactId\u003e\n\t\u003cversion\u003e${hydrogen-dao.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n然后在 `application.properties` 中配置数据源：\n\n```properties\nspring.datasource.url = [JDBC URL]\nspring.datasource.driver-class-name = [JDBC Driver]\nspring.datasource.username = [USERNAME]\nspring.datasource.password = [PASSWORD]\n```\n\n这样就可以在代码中直接获取 DAO 对象了，例如：\n\n```java\n@Controller\npublic class HomeController {\n\n  @Autowired\n  private DAO dao;  // 直接获取 DAO 对象\n}\n```\n\n### 查询记录\n\n```Java\nList\u003cUser\u003e userList = dao.query(\n        User.class,                                         // 包装类（可选）\n        \"select * from USER where NAME like ? and ROLE=?\",  // 语句\n        \"admin%\", 3);                                       // 参数（可选）\n\nuserList.forEach(user -\u003e {\n    System.out.println(\"user name: \" + user.getName());\n});\n```\n\n### 执行带参数名的 SQL\n\n```Java\nMappedCommand cmd =\n    new MappedCommand(\"update USERS set ROLE=#role# where ID in(#userid#)\")\n    .setParam(\"role\", \"admin\")\n    .setParam(\"userid\", 1, 2, 3, 4);  // 数组或 List 都可以\ndao.execute(cmd);\n```\n\n\u003e `MappedCommand` 并非用字符串替换来生成最终 SQL，而仍然使用 PreparedStatement 并设置每个参数，以保证安全性。\n\n### 构造动态查询条件\n\n```Java\ndao.query(SQL\n    .Select(\"ID\", \"NAME\", \"DESCRIPTION\")\n    .From(\"USERS\")\n    .Where(\"ID in ?\", 10, 22, 135)                 // 会自动扩展为 \"ID in (?,?,?)\"。也可以用 List 作为参数\n    .And(disabled != null, \"DISABLED=?\", disabled) // 仅当变量 disabled 值不为 null 时才会加入该查询条件\n    .AndIfNotEmpty(\"DISABLED=?\", disabled)         // 效果同上\n);\n```\n\n### 执行事务\n\n```Java\nfinal DAO dao = getDAO();\n\nDAO.runTransaction(() -\u003e {  // 所有事务都以 Runnable 的方式执行，简单明了\n    dao.execute(\"insert into USER(id,name) values(?,?)\", 1, \"user1\");\n    throw new RuntimeException();    // 之前的 insert 将会回滚，同时抛出该异常\n});\n```\n\n## 更新\n\n#### 2022-06-12\n* 版本号更新到 6.0.0，要求 JDK 版本 17\n* artifact-id 改为 hydrogen-dao-j17\n\n#### 2021-10-19\n* 版本号更新到 4.0.2 并正式发布到 Maven\n* 修复若干BUG\n\n#### 2021-10-09\n* 版本号更新到 4.0.0 并正式发布到 Maven\n* 修复自 4.0.0-SNAPSHOT 以来的一些小问题\n\n#### 2020-10-31\n* 版本号更新到 4.0.0-SNAPSHOT；\n* Page 类不再继承 ArrayList，因为序列化出来的 JSON 内容缺少分页属性；\n* DataSources 类现在是单例模式，节省其在 Spring 或其他 IoC 容器中初始化的步骤；\n* SQL 类支持 Join 语法。\n\n#### 2020-07-25\n\n* 版本号更新到 3.5.1；\n* 删除对 fastjson 的依赖；\n* 修复若干 BUG。\n\n#### 2019-10-11\n\n* 版本号更新到 3.5.0；\n* 用 Swing 重写代码生成工具；\n* 删除之前的基于 JavaFX 的代码生成工具；\n\n#### 2019-10-02\n\n* 将 Spring Boot 自动初始化移到单独的模块独立发布\n\n#### 2019-10-01\n\n* hydrogen-dao 版本 3.3.0 发布到了 Maven 中心库。\n\n#### 2019-08-12\n\n* Spring Boot 自动配置现在只支持单数据源，因为 Spring JDBC 本身只支持这么做。\n\n#### 2019-03-11\n\n* 版本号升级到 3.3.0-SNAPSHOT\n* 允许自定义数据库字段名和类属性名之间的映射规则，参见 `DataSources.setColumnNameConverter()`\n\n#### 2019-01-17\n\n* 修改 Spring Boot 自动配置部分的[相关文档](docs/09-spring-boot-autoconfig.md)\n\n#### 2018-07-09\n\n* 实现基于 JavaFX 的代码生成工具，在 Maven 目录结构下生成 Pojo、Repository\n及对应的单元测试代码。[视频演示](https://www.bilibili.com/video/av22590671/)\n* 修复若干 BUG，详见日志\n\n#### 2018-04-21\n\n* 删除对 Apache commons-lang3 的依赖关系\n* 修复 Spring Boot Auto Configuration 的问题\n* 自动配置时根据 JDBC URL 来猜测 Driver 类，无需手动指定\n* 自动配置当没有找到可用的连接池时，使用 com.hyd.dao.database.NonPooledDataSource\n\n#### 2018-04-07\n\n* 版本号升级到 3.0.0 开发版\n* 添加 Spring Boot Auto Configuration，使用 spring.datasource 配置来自动创建 DAO 对象\n\n#### 2017-12-22:\n\n* 修复了 insert 对象的时候无法正确映射父类成员的问题。\n\n#### 2017-12-20:\n\n* 版本号升级到 2.6.0-SNAPSHOT\n* Java 依赖版本更新到 8.0\n* RowIterator 新增 setRowPreProcessor() 方法，用于返回 Row 对象前进行预处理。\n* DAO.queryIterator() 方法新增 Consumer\u003cRow\u003e 类型的参数。\n\n#### 2017-04-12:\n\n* 修复了 MySQL 下插入对象时表的字段名如果是 MySQL 保留关键字的话会执行失败的问题\n\n#### 2017-01-01:\n\n* commons-lang 依赖关系升级到 commons-lang3\n* commons-dbcp 依赖关系升级到 commons-dbcp2\n* Java 最低要求升级到 1.7\n* 版本号升级到 2.5.0-SNAPSHOT\n\n#### 2016-10-19:\n\n* 添加对 H2 数据库的支持\n\n#### 2015-12-27:\n\n* 修复 Page 类计算总页数不正确的 BUG\n\n#### 2015-05-28:\n\n* 修复了一个对 SQL.Generatable 对象调用多次 toCommand() 方法返回的内容不一致的 BUG\n\n#### 2015-03-22:\n\n* 将数据库差异集中到 CommandBuilderHelper 的子类中去，去掉 DefaultExecutor 的子类。\n* 添加对 HSQLDB 分页查询的支持\n\n#### 2015-03-20:\n\n* 以自适应的方式支持 logback/log4j/log4j2 三种日志输出框架。使用 hydrogen-dao 的项目可以自行选择。\n* 版本升级到 2.3.0-SNAPSHOT。\n\n## 文档\n\n具体的文档都在源代码 docs 目录下。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyiding-he%2Fhydrogen-dao","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyiding-he%2Fhydrogen-dao","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyiding-he%2Fhydrogen-dao/lists"}