{"id":20580142,"url":"https://github.com/michaelliao/warpdb","last_synced_at":"2025-04-05T17:06:16.825Z","repository":{"id":56058976,"uuid":"54755095","full_name":"michaelliao/warpdb","owner":"michaelliao","description":"DSL-driven RDBMS interface for Java.","archived":false,"fork":false,"pushed_at":"2024-12-02T21:44:37.000Z","size":578,"stargazers_count":96,"open_issues_count":2,"forks_count":19,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-29T16:06:29.655Z","etag":null,"topics":["java","jdbc","mysql","orm","spring6","warp"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michaelliao.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":"2016-03-26T00:32:51.000Z","updated_at":"2025-03-22T12:40:05.000Z","dependencies_parsed_at":"2024-01-23T11:48:57.710Z","dependency_job_id":"681fefd5-6d5c-468a-aff2-5998f7e366c0","html_url":"https://github.com/michaelliao/warpdb","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelliao%2Fwarpdb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelliao%2Fwarpdb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelliao%2Fwarpdb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelliao%2Fwarpdb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michaelliao","download_url":"https://codeload.github.com/michaelliao/warpdb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247369952,"owners_count":20927928,"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":["java","jdbc","mysql","orm","spring6","warp"],"created_at":"2024-11-16T06:20:50.379Z","updated_at":"2025-04-05T17:06:16.794Z","avatar_url":"https://github.com/michaelliao.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# warpdb\n\nDSL-driven RDBMS interface for Java:\n\n![DEMO](https://github.com/michaelliao/warpdb/raw/master/warpdb.gif)\n\n# Status:\n\n![Maven Central](https://img.shields.io/maven-central/v/com.itranswarp/warpdb) ![Github Workflow](https://github.com/michaelliao/warpdb/actions/workflows/maven.yml/badge.svg)\n\n### Design principles\n\n* JPA-annotation based configuration.\n* DSL-style API reads like English.\n* Support raw SQL for very complex query.\n* No \"attach/dettach\".\n* All entities are simple POJOs without proxy-ing.\n\n### Database Support\n\n* MySQL 5.x/8.x\n\n### Configuration\n\nMaven dependency:\n\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.itranswarp\u003c/groupId\u003e\n    \u003cartifactId\u003ewarpdb\u003c/artifactId\u003e\n    \u003cversion\u003e${warpdb.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nUse 5.x for Spring 5.x and 6.x for Spring 6.x.\n\nWarpdb is built on top of Spring-JDBC. JdbcTemplate or DataSource is required when build warpdb instance:\n\n```\n\u003cbean class=\"com.itranswarp.warpdb.WarpDb\" init-method=\"init\"\u003e\n    \u003cproperty name=\"basePackages\"\u003e\n        \u003clist\u003e\n            \u003cvalue\u003ecom.test.product.model\u003c/value\u003e\n            \u003cvalue\u003ecom.test.order.model\u003c/value\u003e\n        \u003c/list\u003e\n    \u003c/property\u003e\n    \u003cproperty name=\"jdbcTemplate\" ref=\"jdbcTemplate\" /\u003e\n\u003c/bean\u003e\n```\n\nOr using data source:\n\n```\n\u003cbean class=\"com.itranswarp.warpdb.WarpDb\" init-method=\"init\"\u003e\n    \u003cproperty name=\"basePackages\"\u003e\n        \u003clist\u003e\n            \u003cvalue\u003ecom.test.product.model\u003c/value\u003e\n            \u003cvalue\u003ecom.test.order.model\u003c/value\u003e\n        \u003c/list\u003e\n    \u003c/property\u003e\n    \u003cproperty name=\"dataSource\" ref=\"dataSource\" /\u003e\n\u003c/bean\u003e\n```\n\n# Basic Usage\n\n### Fully JPA Annotation Support\n\nEntities are configured with JPA annotation:\n\n```\n@Entity\n@Table(name=\"user\")\npublic class User {\n    @Id\n    String id;\n\n    @Column(nullable=false)\n    String name;\n}\n```\n\n### Query\n\nQuery by primary key:\n\n```\n// get user, or throw EntityNotFoundException if not found:\nUser user = warpdb.get(User.class, \"123\");\n\n// get user, or return null if not found:\nUser another = warpdb.fetch(User.class, \"456\");\n```\n\nYou have to provide multiple values if multiple id columns are defined:\n\n```\nProduct p = warpdb.get(Product.class, \"p123\", \"c456);\n```\n\nWarpdb supports criteria query and raw SQL query, both are type-safe:\n\n```\nList\u003cUser\u003e users = warpdb.from(User.class)\n        .where(\"name=?\", \"bob\")\n        .orderBy(\"updatedAt\").desc()\n        .list();\n```\n\nGet first result or null if not found:\n\n```\nUser user = warpdb.from(User.class)\n        .where(\"name=?\", \"bob\")\n        .orderBy(\"updatedAt\").desc()\n        .first();\n```\n\nQuery for update:\n\n```\nUser user = warpdb.selectForUpdate()\n        .where(\"id=?\", 123)\n        .first();\n```\n\nUsing raw SQL:\n\n```\nList\u003cUser\u003e users = warpdb.query(\"select * from User order by name limit 100\");\n```\n\n### Paged Query\n\nWarpdb supports paged query by specify page index and page size:\n\n```\n// page 3, 10 items per page:\nPagedResults\u003cUser\u003e pr = warpdb.from(User.class)\n        .orderBy(\"updatedAt\")\n        .list(3, 10);\nSystem.out.println(pr.page.pageIndex); // 3\nSystem.out.println(pr.page.itemsPerPage); // 10\nSystem.out.println(pr.page.totalPages); // 92\nSystem.out.println(pr.page.totalItems); // 912\nList\u003cUser\u003e list = pr.results; // current page items\n```\n\nA paged query will generate 2 SQLs when execute `list(pageIndex, pageSize)`:\n\n```\nSELECT COUNT(*) FROM User;\nSELECT * FROM User ORDER BY updatedAt limit 20, 10\n```\n\n### Insert\n\nUsing `insert()` to insert one or more entities:\n\n```\nUser user = new User();\nuser.setId(...);\nuser.setName(...);\nProduct product = new Product();\nproduct.setId(...);\nproduct.setName(...);\nwarpdb.insert(user, product);\n```\n\n### Batch insert\n\nUsing `insert(List\u003cT\u003e)` to do batch save entities.\n\n### Update\n\nUsing `update()` to update one or more entities:\n\n```\nUser user = ...\nuser.setName(...);\nProduct product = ...\nproduct.setName(...);\nwarpdb.update(user, product);\n```\n\n### Batch update\n\nUsing `update(List\u003cT\u003e)` to do batch update entities.\n\n### Remove\n\nUsing `remove()` to remove one or more entities:\n\n```\nUser user = ...\nProduct product = ...\nwarpdb.remove(user, product);\n```\n\n### Batch remove\n\nUsing `remove(List\u003cT\u003e)` to do batch remove entities.\n\n# Misc\n\n### Enum Support\n\nEnum is stored as `VARCHAR(50)` in database:\n\n```\n@Entity\npublic class User {\n    RoleEnum role;\n}\n```\n\n### Attribute Converter\n\nValues used in Java and db can be converted by attribute converter:\n\n```\n@Entity\npublic class User {\n    // stored as \"DATE\" in db:\n    @Convert(converter = LocalDateConverter.class)\n    @Column(columnDefinition = \"date\")\n    public LocalDate birth;\n}\n```\n\n### Listeners\n\nListeners must be added as entity method with annotation `PostLoad`, `PrePersist`, `PostPersist`, `PreUpdate`, `PostUpdate`, `PreRemove`, `PostRemove`:\n\n```\n@Entity\npublic class User {\n    @Id\n    String id;\n\n    long createdAt;\n\n    @PrePersist()\n    public void prePersist() {\n        if (this.id == null) {\n            this.id = nextId();\n        }\n        this.createdAt = System.currentTimeMillis();\n    }\n}\n```\n\n### Schema Export\n\nUsing `getDDL()` to export schema:\n\n```\nString ddl = warpdb.getDDL();\n```\n\nor get schema for one entity:\n\n```\nString ddl = warpdb.getDDL(User.class);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelliao%2Fwarpdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichaelliao%2Fwarpdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelliao%2Fwarpdb/lists"}