{"id":18854808,"url":"https://github.com/noear/wood","last_synced_at":"2025-04-14T10:50:44.645Z","repository":{"id":63252340,"uuid":"551711520","full_name":"noear/wood","owner":"noear","description":"noear::微型ORM框架（支持：java sql，xml sql，annotation sql；事务；缓存；监控；等...）","archived":false,"fork":false,"pushed_at":"2024-12-04T09:13:02.000Z","size":613,"stargazers_count":16,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-28T00:04:11.234Z","etag":null,"topics":["orm"],"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/noear.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}},"created_at":"2022-10-15T00:03:11.000Z","updated_at":"2025-03-01T11:43:21.000Z","dependencies_parsed_at":"2024-07-12T06:27:47.075Z","dependency_job_id":"8a107a60-6ebb-4177-ab51-a3964b5f23e2","html_url":"https://github.com/noear/wood","commit_stats":{"total_commits":54,"total_committers":3,"mean_commits":18.0,"dds":0.03703703703703709,"last_synced_commit":"b56bdd5afd243e6c11ee8c93124a5ac1dceabc3c"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fwood","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fwood/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fwood/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fwood/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noear","download_url":"https://codeload.github.com/noear/wood/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248868826,"owners_count":21174754,"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":["orm"],"created_at":"2024-11-08T03:51:52.575Z","updated_at":"2025-04-14T10:50:44.633Z","avatar_url":"https://github.com/noear.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\" style=\"text-align:center;\"\u003e\n  Wood\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n微型ORM框架（支持：java sql，xml sql，annotation sql；事务；缓存；监控；等...），无依赖！\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca target=\"_blank\" href=\"https://search.maven.org/search?q=org.noear%20wood\"\u003e\n        \u003cimg src=\"https://img.shields.io/maven-central/v/org.noear/wood.svg?label=Maven%20Central\" alt=\"Maven\" /\u003e\n    \u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://www.apache.org/licenses/LICENSE-2.0.txt\"\u003e\n\t\t\u003cimg src=\"https://img.shields.io/:license-Apache2-blue.svg\" alt=\"Apache 2\" /\u003e\n\t\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html\"\u003e\n\t\t\u003cimg src=\"https://img.shields.io/badge/JDK-8-green.svg\" alt=\"jdk-8\" /\u003e\n\t\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html\"\u003e\n\t\t\u003cimg src=\"https://img.shields.io/badge/JDK-11-green.svg\" alt=\"jdk-11\" /\u003e\n\t\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html\"\u003e\n\t\t\u003cimg src=\"https://img.shields.io/badge/JDK-17-green.svg\" alt=\"jdk-17\" /\u003e\n\t\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html\"\u003e\n\t\t\u003cimg src=\"https://img.shields.io/badge/JDK-21-green.svg\" alt=\"jdk-21\" /\u003e\n\t\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003ca target=\"_blank\" href='https://gitee.com/noear/wood/stargazers'\u003e\n\t\t\u003cimg src='https://gitee.com/noear/wood/badge/star.svg' alt='gitee star'/\u003e\n\t\u003c/a\u003e\n    \u003ca target=\"_blank\" href='https://github.com/noear/wood/stargazers'\u003e\n\t\t\u003cimg src=\"https://img.shields.io/github/stars/noear/wood.svg?style=flat\u0026logo=github\" alt=\"github star\"/\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://jq.qq.com/?_wv=1027\u0026k=kjB5JNiC\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/QQ交流群-22200020-orange\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n#### 特点和理念：\n* 跨平台：可以嵌入到JVM脚本引擎（js, groovy, lua, python, ruby）及GraalVM支持的部分语言。\n* 很小巧：0.2Mb（且是功能完整，方案丰富；可极大简化数据库开发）。\n* 有个性：不喜欢反射（主打弱类型）、不喜欢配置（除了连接，不需要其它配置）。\n* 其它的：支持缓存控制和跨数据库事务。\n\n#### 支持数据库：\n\nH2, Db2, MySql, Oracle, PostrgeSQL, SqlLite, SqlServer, Phoenix, Presto\n\n#### 核心对象和功能：\n\n* 上下文：DbContext db\n* 四个接口：db.mapper(), db.table(), db.call(), db.sql()\n\n```java\n//BaseMapper 接口\ndb.table(User.class).selectById(1);\n\n//BaseMapper 接口，lambda 条件查询\ndb.table(User.class).selectList(mq-\u003emq\n        .whereLt(User::getGroup,1)\n        .andEq(User::getLabel,\"T\"));\n\n\n//Table 接口\ndb.table(\"user u\")\n  .innerJoin(\"user_ext e\").onEq(\"u.id\",\"e.user_id\")\n  .whereEq(\"u.type\",11)\n  .limit(100,20)\n  .selectList(\"u.*,e.sex,e.label\", User.class);\n\ndb.table(\"user u\")\n  .innerJoin(\"user_ext e\").onEq(\"u.id\",\"e.user_id\")\n  .whereEq(\"u.type\",11)\n  .limit(100,20)\n  .selectAsCmd(\"u.*,e.sex,e.label\"); //构建查询命令（即查询语句）\n\n//Table 接口，拼装条件查询（特别适合管理后台）\ndb.table(logger)\n  .where(\"1 = 1\")\n  .andIf(TextUtils.isNotEmpty(trace_id), \"trace_id = ?\", trace_id)\n  .andIf(TextUtils.isNotEmpty(tag), \"tag = ?\", tag)\n  .andIf(TextUtils.isNotEmpty(tag1), \"tag1 = ?\", tag1)\n  .andIf(TextUtils.isNotEmpty(tag2), \"tag2 = ?\", tag2)\n  .andIf(TextUtils.isNotEmpty(tag3), \"tag3 = ?\", tag3)\n  .andIf(log_date \u003e 0, \"log_date = ?\", log_date)\n  .andIf(log_id \u003e 0, \"log_id \u003c= ?\", log_id)\n  .andIf(level \u003e 0, \"level=?\", level)\n  .orderBy(\"log_fulltime desc\")\n  .limit(size)\n  .selectList(\"*\", LogModel.class);\n```\n\n\n\n#### 组件列表： \n\n| 组件                  | 说明                          |\n|---------------------|-----------------------------|\n| org.noear:wood      | 主框架（没有任何依赖）                 |\n| org.noear:wood.plus | 增强框架（支持 Mapper 和 XmlMapper） |\n\n\n| 可选组件 | 说明                     |\n| --- |------------------------|\n| org.noear:wood-maven-plugin| Maven插件，用于生成 XmlMapper |\n| |                        |\n| org.noear:wood.cache.memcached| 基于 Memcached 适配的扩展缓存服务 |\n| org.noear:wood.cache.redis| 基于 Redis 适配的扩展缓存服务     |\n| org.noear:wood.cache.ehcache| 基于 ehcache 适配的扩展缓存服务   |\n| org.noear:wood.cache.j2cache| 基于 j2cache 适配的扩展缓存服务   |\n\n\n\n\n\n#### Meven配置：\n\n```xml\n\u003c!-- 框架包 --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.noear\u003c/groupId\u003e\n    \u003cartifactId\u003ewood\u003c/artifactId\u003e\n    \u003cversion\u003e1.3.16\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003c!-- 可选：maven 插件，用于生成Xml sql mapper接口 --\u003e\n\u003cplugin\u003e\n    \u003cgroupId\u003eorg.noear\u003c/groupId\u003e\n    \u003cartifactId\u003ewood-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e1.3.16\u003c/version\u003e\n\u003c/plugin\u003e\n```\n\n\n\n#### 入门示例：\n```java\n/** 1.1.实例化上下文 */\n//DbContext db  = new DbContext(properties); //使用Properties配置的示例\n//DbContext db  = new DbContext(map); //使用Map配置的示例\n//DbContext db  = new DbContext(\"user\",\"proxool.xxx_db\"); //使用proxool线程池配置的示例\n//DbContext db  = new DbContext(\"user\",\"jdbc:mysql://x.x.x:3306/user\",\"root\",\"1234\");\nDbContext db  = new DbContext(\"user\",new HikariDataSource(...)); //使用DataSource配置的示例\n\n//如果是动态创建，临时用的。用完要关掉\ndb.close();\n\n\n/** 1.2.配置事件，执行后打印sql */\npublic class DemoApp {\n    public static void main(String[] args) {\n        //或者使用 WoodConfig.onExecuteBef 事件\n        WoodConfig.onExecuteAft(cmd -\u003e { \n            System.out.println(\"[Wood]\" + cmd.text + \"\\r\\n\" + cmd.paramMap());\n        });\n    }\n}\n\n/** 1.3.多实例切换 */\nnew DbContext(...).nameSet(\"a\");\nnew DbContext(...).nameSet(\"b\");\nDbContext.use(\"a\").table(\"user\").limit(1).selectItem(\"*\", User.class);\n\n\n/** 2.1.Mapper用法 */\n@Namespace(\"demo.dso.db\")\npublic interface UserDao extends BaseMapper\u003cUserModel\u003e{\n    @Sql(\"select * from user where id=@{id} limit 1\")\n    UserModel getUser(int id);\n  \n    @Sql(\"select * from user where id=? limit 1\")\n    UserModel getUser2(int id);\n\n    void addUser(UserModel user); //没注解，需要配xml\n}\n\nUserDao userDao = db.mapper(UserDao.class);\n//调用 BaseMapper 方法\nuserDao.selectById(12); \n\n//调用 @Sql 方法\nUserModel user = userDao.getUser(2); \n\n//调用 Xml sql\nuserDao.addUser(user); \n\n//调用Template sql\nStatModel stat = userDao.userStat(20201010);\n\n\n\n/** 2.2.Table用法 */\n//增::\ndb.table(\"user\").setEntity(user).insert();\ndb.table(\"user\").setMap(map).insert();\ndb.table(\"user\").setMap(map).insertAsCmd(); //构建查询命令（即查询语句）\n//删::\ndb.table(\"user\").whereEq(\"id\",2).delete();\n//改::\ndb.table(\"user\").set(\"sex\",1).whereEq(\"id\",2).update();\ndb.table(\"user\").setInc(\"level\",1).whereEq(\"id\",2).update(); //字段自+1\n//查::\ndb.table(\"user u\")\n  .innerJoin(\"user_ext e\").onEq(\"u.id\",\"e.user_id\")\n  .whereEq(\"u.id\",1001)\n  .selectItem(\"u.*,e.sex,e.label\", User.class);\n\n//查++（折开来拼接条件）::\nvar tb = db.table(\"user u\");\nif(test.a){\n  tb.innerJoin(\"user_ext e\").onEq(\"u.id\",\"e.user_id\");\n}\n\nif(test.b){\n  tb.whereEq(\"u.id\",1001);\n}\n\ntb.selectItem(\"u.*,e.sex,e.label\", User.class);\n\n//查++2（通过构建函数拼接条件）::\ndb.table(\"user u\")\n  .build(tb-\u003e{\n    if(test.a){\n      tb.innerJoin(\"user_ext e\").onEq(\"u.id\",\"e.user_id\"); \n    }\n       \n    if(test.b){\n      tb.whereEq(\"u.id\",1001);\n    }\n  }).selectItem(\"u.*,e.sex,e.label\", User.class);\n\n/** 2.3.Call用法 */\n//调用存储过程\ndb.call(\"user_get_list_by\").set(\"_type\",12).getList(User.class);\n\n//调用xml sql\ndb.call(\"@demo.dso.db.user_get\").set(\"id\",1001).getItem(User.class);\n\n\n/** 2.4.Sql用法 */\n//快速执行SQL语句\ndb.sql(\"select * from user id=?\",12).getDataItem();\ndb.sql(\"select name from user id=?\",12).getValue();\n\n\n/** 3.1.事件用法（全局配置事件可用 WoodConfig） */\n//出异常时\ndb.onException((cmd,err)-\u003e{});\n//命令构建时\ndb.onCommandBuilt((cmd)-\u003e{});\n//命令执行前\ndb.onExecuteBef((cmd)-\u003e{});\n//命令执行中\ndb.onExecuteStm((cmd,stm)-\u003e{});\n//命令执行后\ndb.onExecuteAft((cmd)-\u003e{});\n```\n\n\n\n#### 附：语法参考：\n\n##### （一）Xml sql 语法\n* 示例\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003c!DOCTYPE mapper PUBLIC \"-//noear.org//DTD Mapper 3.0//EN\" \"http://noear.org/dtd/wood-mapper.dtd\"\u003e\n\u003cmapper namespace=\"wood_demo.xmlsql2\"\n        import=\"demo.model.*\"\n        baseMapper=\"UserModel\"\u003e\n    \u003csql id=\"getUser\" return=\"UserModel\" remarks=\"获取用户信息\"\u003e\n        SELECT * FROM user WHERE id = @{id:int}\n    \u003c/sql\u003e\n\u003c/mapper\u003e\n```\n\n* 具体参考：[《WOOD XML 语法》](WOOD_mapper_XML_语法.md)\n\n##### （二）Table 语法\n\n* 条件操作（与Mapper共享）\n\n| 方法 | 效果说明 |\n| --- | --- |\n| where, whereIf |  |\n| whereEq, whereNeq | ==, != |\n| whereLt, whereLte | \\\u003c, \\\u003c= |\n| whereGt, whereGte | \\\u003e, \\\u003e= |\n| whereLk, whereNlk | LIKE, NOT LIKE |\n| whereIn, whereNin | IN(..), NOT IN(..) |\n| whereBtw, whereNbtw | BETWEEN, NOT BETWEEN |\n| and系统方法 | 同where |\n| or系统方法 | 同where |\n| begin | \\( |\n| end | \\) |\n\n* 表操作（Table独占）\n\n| 方法 | 效果说明 |\n| --- | --- |\n| set, setIf | 设置值 |\n| setMap, setMapIf | 设置值 |\n| setEntity, setEntityIf | 设置值 |\n| table | 主表 |\n| innerJoin, leftJoin, rightJoin | 关联表 |\n| on, onEq | 关联条件 |\n| orderBy, orderByAsc, orderByDesc | 排序 |\n| groupBy | 组 |\n| having | 组条件 |\n| limit | 限制范围 |\n| select | 查询（返回IQuery） |\n| count | 查询快捷版，统计数量 |\n| exists | 查询快捷版，是否存在 |\n| update | 更新 |\n| insert | 插入 |\n| delete | 删除 |\n\n* 更多参考：[《WOOD JAVA 接口字典》](WOOD_JAVA_接口字典.md)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fwood","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoear%2Fwood","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fwood/lists"}