{"id":37019175,"url":"https://github.com/pengweizhong/dynamic-sql","last_synced_at":"2026-01-14T02:03:48.541Z","repository":{"id":46559023,"uuid":"332001116","full_name":"pengweizhong/dynamic-sql","owner":"pengweizhong","description":"单表动态增删改查SQL","archived":true,"fork":false,"pushed_at":"2024-12-09T16:09:41.000Z","size":495,"stargazers_count":184,"open_issues_count":0,"forks_count":4,"subscribers_count":6,"default_branch":"dev","last_synced_at":"2025-07-27T22:26:28.387Z","etag":null,"topics":["java","mysql","oracle"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pengweizhong.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":"2021-01-22T16:27:14.000Z","updated_at":"2025-07-11T12:13:56.000Z","dependencies_parsed_at":"2023-10-16T03:24:59.573Z","dependency_job_id":"e2106ee1-6e06-4986-9365-8709b3c2aea8","html_url":"https://github.com/pengweizhong/dynamic-sql","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/pengweizhong/dynamic-sql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pengweizhong%2Fdynamic-sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pengweizhong%2Fdynamic-sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pengweizhong%2Fdynamic-sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pengweizhong%2Fdynamic-sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pengweizhong","download_url":"https://codeload.github.com/pengweizhong/dynamic-sql/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pengweizhong%2Fdynamic-sql/sbom","scorecard":{"id":727169,"data":{"date":"2025-08-11","repo":{"name":"github.com/pengweizhong/dynamic-sql","commit":"b2f6bf408c9f2096b529b4ad6d230327ae35c76c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during GetBranch(master): error during branchesHandler.query: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-4jrv-ppp4-jm57","Warn: Project is vulnerable to: GHSA-wxr5-93ph-8wr9","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-36p3-wjmg-h94x","Warn: Project is vulnerable to: GHSA-hh26-6xwr-ggv7","Warn: Project is vulnerable to: GHSA-6gf2-pvqw-37ph","Warn: Project is vulnerable to: GHSA-rfmp-97jj-h8m6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T13:10:13.397Z","repository_id":46559023,"created_at":"2025-08-22T13:10:13.397Z","updated_at":"2025-08-22T13:10:13.397Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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","mysql","oracle"],"created_at":"2026-01-14T02:03:47.809Z","updated_at":"2026-01-14T02:03:48.532Z","avatar_url":"https://github.com/pengweizhong.png","language":"Java","readme":"# Dynamic-SQL\n\n**注意：此项目已停止维护。**  \n**推荐使用新项目 `Dynamic-SQL2`，它包含了更丰富的功能和改进的性能！**\n\n### 停止维护的原因\n\n随着实际生产场景需求的变化，我决定将精力转向 [Dynamic-SQL2](https://github.com/pengweizhong/dynamic-sql2)，以更好地覆盖实际应用场景。  \n由于此项目的局限性、不合理的设计等原因，已不具备二次开发的价值。现有的代码仍然可以使用，但将不再提供更新或技术支持。\n如有需要，您仍可参考现有代码或提交问题，我看到时可能会提供帮助。\n\n**新项目亮点**  \n🌟 功能更全面：新项目新增了诸如拦截器、插件、现代化的分页等功能。  \n⚡ 性能更优：针对常见场景进行了深度优化。  \n🔄 更强的兼容性：支持更广泛的数据库提供商。\n  \n\n---\n\n---\n\n# 项目说明\n\n动态SQL基于JDBC，旨在简化开发人员在数据库访问层面的工作。基于此背景打造的低耦合的最小化依赖。  \n同时解决贴合项目中的自定义映射、字段解析、SQL拦截、自定义ID自增功能，可完美结合各个项目中的底层通用包使用而不依赖spring环境。  \n还可以根据不同的条件动态生成语句，更便捷的对数据库单表的增删改查，使得开发人员只需注重业务，提高代码的灵活性和可维护性。\n\n**主要特性：**\n\n1. 单表动态增删改查\n2. 不依赖其他框架环境，可单独启动\n3. 支持多数据源\n4. 支持事务（目前仅spring环境）\n5. 支持直接执行自定义SQL语句\n6. 支持`Mysql`,`Oracle`\n7. 提供了`spring-boot-starter`用于快速启动\n\n# 资源引入\n\n## Maven\n\n``` xml\n\t\u003c-- 单体项目 --\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003ecom.pengwz\u003c/groupId\u003e\n\t    \u003cartifactId\u003edynamic-sql\u003c/artifactId\u003e\n\t    \u003cversion\u003e2.1.8\u003c/version\u003e\n\t\u003c/dependency\u003e\n\t\n\t\u003c-- SpringBoot项目，已集成 Dynamic-SQL --\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003ecom.pengwz\u003c/groupId\u003e\n\t    \u003cartifactId\u003edynamic-sql-spring-boot-starter\u003c/artifactId\u003e\n\t    \u003cversion\u003e2.1.8\u003c/version\u003e\n\t\u003c/dependency\u003e\n```\n\n## Gradle\n\n```properties\nimplementation group: 'com.pengwz', name: 'dynamic-sql', version: '2.1.8'\n```\n\n--- \n\n# 快速开始\n\n\u003e 以下案例均可以在`test/java/com.pengwz.demo`测试包下找到。\n\n1. 配置数据源  \n   1.1 [使用`JDBC`创建数据源](#jdbcCreate)  \n   1.2 使用`Druid`创建数据源\n2. [配置实体类](#entityConfig)\n3. 新增  \n   3.1 [新增单条记录](#insertSingle)  \n   3.2 [有选择的新增](#insertByChoose)     \n   3.3 [新增多条记录](#insertBatch)  \n   3.4 [新增或更新](#insertOrUpdate)\n4. 查询  \n   4.1 [使用简单函数查询总数量](#selectByFunction)   \n   4.2 [根据主键查询](#selectByPrimaryKey)  \n   4.3 根据条件查询\n    - 4.3.1 [一般条件查询](#selectByCondition)\n    - 4.3.2 [分页查询](#selectByPages)\n    - 4.3.3 [嵌套查询](#selectHard)\n    - 4.3.4 [分割查询](#findInSet)\n5. 更新  \n   5.1 [根据条件更新](#updateByCondition)  \n   5.2 [根据主键更新](#updateByPrimaryKey)  \n   5.3 [有选择的更新](#updateByChoose)  \n   5.4 [批量更新](#updateBatch)\n6. 删除  \n   6.1 [根据条件删除](#deleteByCondition)  \n   6.2 [根据主键删除](#deleteByPrimaryKey)\n\n--- \n\n\u003e 准备些测试数据（mysql 8.x版本及以上，否则会执行报错，若使用的mysql8以下的版本，则删除新语法即可）\n\u003e 此处简单的准备了两个表，一张用户表，一张角色表。\n\n```sql\ndrop table if exists `t_user`;\nCREATE TABLE `t_user`\n(\n    `id`          bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',\n    `account_no`  varchar(50)         DEFAULT NULL COMMENT '账号',\n    `username`    varchar(50)         DEFAULT NULL COMMENT '用户名',\n    `password`    varchar(50)         DEFAULT NULL COMMENT '密码',\n    `email`       varchar(50)         DEFAULT NULL COMMENT '邮箱',\n    `birthday`    datetime            DEFAULT NULL COMMENT '生日',\n    `desc`        varchar(50)         DEFAULT NULL COMMENT '邮箱',\n    `is_delete`   tinyint(1)          DEFAULT NULL COMMENT '是否删除 true 已删除 false 未删除',\n    `create_date` timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n    `update_date` timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `t_user_UN` (`account_no`)\n) ENGINE = InnoDB COMMENT ='用户表';\n\ndrop table if exists `t_user_role`;\nCREATE TABLE `t_user_role`\n(\n    `uid`         varchar(50) NOT NULL COMMENT 'UUID主键',\n    `username`    varchar(50)          DEFAULT NULL COMMENT '用户名',\n    `role`        varchar(50)          DEFAULT NULL COMMENT '角色',\n    `create_date` timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n    `update_date` timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n    PRIMARY KEY (`id`)\n) ENGINE = InnoDB COMMENT ='用户和角色表';\n\n```\n\n---\n\n## 1. 配置数据源\n\n### 1.1 \u003cspan id=\"jdbcCreate\"/\u003e使用`JDBC`创建数据源\n\n创建一个实体类，实现`DataSourceConfig`接口，重写`getDataSource()`方法。此处命名为`DatabaseConfig`。\n\n```java\npublic class DatabaseConfig implements DataSourceConfig {\n    @Override\n    public DataSource getDataSource() {\n        MysqlDataSource ds = new MysqlDataSource();\n        ds.setUrl(\"jdbc:mysql://127.0.0.1:3306/dynamic?useUnicode=true\u0026rewriteBatchedStatements=true\u0026serverTimezone=GMT%2B8\u0026characterEncoding=utf-8\");\n        ds.setUser(\"root\");\n        ds.setPassword(\"pengwz\");\n        return ds;\n    }\n}\n```\n\n`DataSourceConfig`提供了两个方法：\n\n```java\n    DataSource getDataSource();\n\ndefault boolean defaultDataSource() {\n    return false;\n}\n```\n\n- `getDataSource`是用于获取数据源连接，可以使用jdbc自带的连接池，如`MysqlDataSource`。\n- `defaultDataSource` 是在多数据源情况下，用于指定默认数据源，默认值`false`\n  。该条件目前仅使用spring环境，其他环境目前即使重写该值，也是没有用的。（单体项目也许有解决办法，但是目前没想到。。。）\n\n### 1.2 \u003cspan id=\"druidCreate\"/\u003e使用`druid`创建数据源\n\n首先，在pom中引入druid的依赖：\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.alibaba\u003c/groupId\u003e\n    \u003cartifactId\u003edruid\u003c/artifactId\u003e\n    \u003cversion\u003e1.2.4\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n然后再配置类中构建连接参数：\n\n```java\npublic class DatabaseConfig implements DataSourceConfig {\n    @Override\n    public DataSource getDataSource() {\n        DruidDataSource ds = new DruidDataSource();\n        ds.setUrl(\"jdbc:mysql://127.0.0.1:3306/dynamic?useOldAliasMetadataBehavior=true\u0026useUnicode=true\u0026rewriteBatchedStatements=true\u0026serverTimezone=GMT%2B8\u0026characterEncoding=utf-8\");\n        ds.setUsername(\"root\");\n        ds.setPassword(\"pengwz\");\n        ds.setDriverClassName(\"com.mysql.cj.jdbc.Driver\");\n        ds.setInitialSize(3);\n        ds.setMaxActive(10);\n        ds.setMinIdle(5);\n        ds.setValidationQuery(\"select 1\");\n        ds.setTestOnBorrow(true);\n        ds.setTestOnReturn(false);\n        ds.setUseUnfairLock(true);\n        ds.setTestWhileIdle(true);\n        ds.setMinEvictableIdleTimeMillis(10 * 60 * 1000L);\n        ds.setTimeBetweenEvictionRunsMillis(5 * 60 * 1000L);\n        return ds;\n    }\n}\n\n```\n\n## 2. \u003cspan id=\"entityConfig\"/\u003e配置实体类\n\n执行完上面的SQL后，随后在项目中分别创建对应的实体类\n\n```java\n// 在spring环境下设置好默认数据源后，就无需在此处声明\n@Table(value = \"t_user\", dataSourceClass = DatabaseConfig.class)\npublic class UserEntity {\n    @Id\n    @GeneratedValue\n    private Long id;\n    private String username;\n    private String password;\n    private LocalDateTime createDate;\n    @Column(\"update_date\")\n    private LocalDateTime updateDate;\n    /** getter and setter **/\n    /** toString() **/\n}\n\n@Table(value = \"t_user\", dataSourceClass = DatabaseConfig.class)\npublic class UserRoleEntity {\n    @Id\n    @GeneratedValue\n    private Long id;\n    private String username;\n    private String role;\n    private LocalDateTime createDate;\n    @Column(\"update_date\")\n    private LocalDateTime updateDate;\n    /** getter and setter **/\n    /** toString() **/\n}\n```\n\n`@Table`注解用于维护数据表和实体类关系，该注解提供了两个属性:\n\n- value：表示对应数据库表名，必须提供该值\n- dataSourceClass：表示该表所属数据源，非spring环境必须提供\n\n`@Id`注解用于表示那个属性对应表主键，在实体类中标识该主键后，即可用于后续根据主键查询、更新等操作，该注解非强制添加，但建议使用  \n`@GeneratedValue`注解用于在新增数据后，返回主键值。该注解非强制添加，但建议使用  \n`@Column`注解用于维护表列和实体类属性的关系，对于该情况下有下列处理办法：\n\n- 当实体类属性标注了` @Column`注解，则以注解内value匹配表列；\n- 若没有` @Column`注解，则以实体类的属性，根据驼峰命名规则匹配表列，如：实体类属性`createDate`匹配表列`create_date`。\n\n\u003e `dymamic-sql` 对实体类类型映射进行了加强，比如日期类在实体类中可以使用`java.util.Date`\n\u003e 接收，或者使用`java.sql.Date`、`java.time.LocalDateTime`接收等等。\n\u003e **实体类属性必须使用引用类型，因为基本类型在任何时候都不等于null**\n\n## 3. 新增\n\n### 3.1 \u003cspan id=\"insertSingle\"/\u003e新增单条记录\n\n为`t_user`表新增一条数据\n\n```java\n\n@Test\npublic void insert() {\n    UserEntity entity = new UserEntity();\n    entity.setUsername(\"tom\");\n    entity.setCreateDate(LocalDateTime.now());\n    entity.setUpdateDate(LocalDateTime.now());\n    entity.setPassword(\"password\");\n    Integer insert = BraveSql.build(UserEntity.class).insert(entity);\n    //1\n    System.out.println(insert);\n}\n```\n\n执行结果：  \n[![gkU3LT.png](https://z3.ax1x.com/2021/04/29/gkU3LT.png)](https://imgtu.com/i/gkU3LT)  \n也可以对`UserEntity`原始对象进行输出，其自增ID已经映射到该实体类中，方便在业务中进行其他操作。此处便不再打印输出结果。\n\n### 3.2 \u003cspan id=\"insertByChoose\"/\u003e有选择的新增\n\n```java\n\n@Test\npublic void insertActive() {\n    UserEntity entity = new UserEntity();\n    entity.setUsername(\"jerry\");\n    entity.setPassword(\"password\");\n    Integer insert = BraveSql.build(UserEntity.class).insertActive(entity);\n    //1\n    System.out.println(insert);\n}\n```\n\n执行结果：  \n[![gkaPk4.png](https://z3.ax1x.com/2021/04/29/gkaPk4.png)](https://imgtu.com/i/gkaPk4)\n`BraveSql.build(UserEntity.class).insert(entity)`和`BraveSql.build(UserEntity.class).insertActive(entity)`区别在于`insert`\n插入值时，如果该属性为null，则插入null; `insertActive`插入值时，如果该属性为null，则使用数据库默认值。\n\n### 3.3 \u003cspan id=\"insertBatch\"/\u003e新增多条记录\n\n批量插入10条记录\n\n```java\n\n@Test\npublic void batchInsert() {\n    List\u003cUserEntity\u003e userEntities = new ArrayList\u003c\u003e();\n    for (int i = 0; i \u003c 10; i++) {\n        UserEntity entity = new UserEntity();\n        entity.setUsername(\"list_\" + i);\n        entity.setPassword(\"password_\" + i);\n        entity.setCreateDate(LocalDateTime.now());\n        entity.setUpdateDate(LocalDateTime.now());\n        userEntities.add(entity);\n    }\n    Integer insert = BraveSql.build(UserEntity.class).batchInsert(userEntities);\n    //10\n    System.out.println(insert);\n}\n```\n\n执行结果：  \n[![gkdkVS.png](https://z3.ax1x.com/2021/04/29/gkdkVS.png)](https://imgtu.com/i/gkdkVS)\n\n### 3.4 \u003cspan id=\"insertOrUpdate\"/\u003e新增或更新\n\n新增或更新，主要场景用于数据新增时，不确定数据是否存在，可以使用`insertOrUpdate`方法，避免插入前还需要查询数据是否存在。\n判断原始数据是否存在是以主键约束、唯一约束等等来决定数据是插入还是新增。  \n如：插入Id为1的数据（Id为1的数据表中已经存在）\n\n```java\n\n@Test\npublic void insertOrUpdate() {\n    UserEntity entity = new UserEntity();\n    entity.setId(1L);\n    entity.setUsername(\"tom_update\");\n    entity.setCreateDate(LocalDateTime.now());\n    entity.setUpdateDate(LocalDateTime.now());\n    entity.setPassword(\"password_update\");\n    Integer insert = BraveSql.build(UserEntity.class).insertOrUpdate(entity);\n    System.out.println(insert);\n}\n```\n\n执行结果：  \n[![gkw3OP.png](https://z3.ax1x.com/2021/04/29/gkw3OP.png)](https://imgtu.com/i/gkw3OP)\n\n## 4. 查询\n\n### 4.1 \u003cspan id=\"selectByFunction\"/\u003e使用简单函数查询\n\n```java\n\n@Test\npublic void test1() {\n    //查询总数量\n    Integer count = BraveSql.build(UserEntity.class).selectCount();\n    System.out.println(count);\n    //对所有ID求和\n    BigDecimal sum = BraveSql.build(UserEntity.class).selectSum(UserEntity::getId);\n    System.out.println(sum);\n    // ......\n}\n ```\n\n### 4.2 \u003cspan id=\"selectByPrimaryKey\"/\u003e根据主键查询\n\n```java\n\n@Test\npublic void test2() {\n    UserEntity userEntity = BraveSql.build(UserEntity.class).selectByPrimaryKey(1);\n    System.out.println(userEntity);\n}\n ```\n\n### 4.3 根据条件查询\n\n#### 4.3.1 \u003cspan id=\"selectByCondition\"/\u003e一般条件查询\n\n```java\n\n@Test\npublic void test3() {\n    //查询用户名=jerry的数据\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    //可以直接使用字段名进行查询，但是i推荐使用表达式\n    //dynamicSql.andEqualTo(\"username\",\"jerry\");\n    dynamicSql.andEqualTo(UserEntity::getUsername, \"jerry\");\n    List\u003cUserEntity\u003e entities = BraveSql.build(dynamicSql, UserEntity.class).select();\n    System.out.println(entities);\n}\n ```\n\n#### 4.3.2 \u003cspan id=\"selectByPages\"/\u003e分页查询\n\n```java\n\n@Test\npublic void test4() {\n    //按5个为一组分页，取第一页\n    PageInfo\u003cUserEntity\u003e pageInfo = BraveSql.build(UserEntity.class).selectPageInfo(1, 5);\n    Assert.assertEquals(1, (int) pageInfo.getPageIndex());\n    Assert.assertEquals(5, (int) pageInfo.getPageSize());\n    Assert.assertEquals(5, pageInfo.getResultList().size());\n}\n ```\n\n#### 4.3.3 \u003cspan id=\"selectHard\"/\u003e嵌套查询\n\n```java\n\n@Test\npublic void test5() {\n    //查询用户名为jerry的用户，或者Id等于5或者50的数据\n    //ID=50是不存在的，所以只会查询出2条数据\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    dynamicSql.andEqualTo(UserEntity::getUsername, \"jerry\");\n    //使用此方法创建组查询，此方法可以根据业务无限制嵌套\n    dynamicSql.orComplex(sql -\u003e sql.andEqualTo(UserEntity::getId, 5).orEqualTo(UserEntity::getId, 50)//.orComplex()：这里扔可以选择嵌套括号组\n    );\n    List\u003cUserEntity\u003e entities = BraveSql.build(dynamicSql, UserEntity.class).select();\n    System.out.println(entities);\n    System.out.println(entities.size());\n}\n ```\n\n#### 4.3.4 \u003cspan id=\"findInSet\"/\u003e分割查询\n\n```java\n\n/**\n *默认使用英文逗号对词组拆词进行查询\n */\n@Test\npublic void findInSet3() {\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    dynamicSql.orFindInSet(UserEntity::getUsername, \"世界\");\n    List\u003cUserEntity\u003e select = BraveSql.build(dynamicSql, UserEntity.class).select();\n    System.out.println(select);\n}\n\n/**\n *也可以自定义分隔符查询，例如空格、下划线等等\n */\n@Test\npublic void findInSet5() {\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    dynamicSql.orFindInSet(UserEntity::getUsername, \"世界\", \"-\");\n    List\u003cUserEntity\u003e select = BraveSql.build(dynamicSql, UserEntity.class).select();\n    System.out.println(select);\n}\n\n```\n\n## 5. 更新\n\n### 5.1 \u003cspan id=\"updateByCondition\"/\u003e根据条件更新\n\n```java\n\n@Test\npublic void test1() {\n    //将用户名 list_0 改为 tom\n    UserEntity userEntity = new UserEntity();\n    userEntity.setUsername(\"tom\");\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    dynamicSql.andEqualTo(UserEntity::getUsername, \"list_0\");\n    //这里会生成语句： update `t_user` set `username` = ? where `username` = ?\n    int updated = BraveSql.build(dynamicSql, UserEntity.class).updateActive(userEntity);\n    Assert.assertEquals(updated, 1);\n}\n ```\n\n### 5.2 \u003cspan id=\"updateByPrimaryKey\"/\u003e根据主键更新\n\n```java  \n\n@Test\npublic void test2() {\n    //将ID=3的用户名改为duck\n    UserEntity userEntity = new UserEntity();\n    userEntity.setUsername(\"duck\");\n    //设置主键值\n    userEntity.setId(3L);\n    userEntity.setCreateDate(LocalDateTime.now());\n    userEntity.setUpdateDate(LocalDateTime.now());\n    int updated = BraveSql.build(UserEntity.class).updateByPrimaryKey(userEntity);\n    Assert.assertEquals(updated, 1);\n}  \n```  \n\n### 5.3 \u003cspan id=\"updateByChoose\"/\u003e批量更新\n\n```java\n\n@Test\npublic void test3() {\n    //将所有用户的密码改为 123@abc\n    UserEntity userEntity = new UserEntity();\n    userEntity.setPassword(\"123@abc\");\n    BraveSql.build(UserEntity.class).updateActive(userEntity);\n}\n```\n\n## 6. 删除\n\n### 6.1 \u003cspan id=\"deleteByCondition\"/\u003e根据条件删除\n\n```java\n\n@Test\npublic void test1() {\n    //删除ID等于7、8、9的用户\n    DynamicSql\u003cUserEntity\u003e dynamicSql = DynamicSql.createDynamicSql();\n    dynamicSql.andIn(UserEntity::getId, Arrays.asList(7, 8, 9));\n    BraveSql.build(dynamicSql, UserEntity.class).delete();\n}\n```\n\n### 6.2 \u003cspan id=\"deleteByPrimaryKey\"/\u003e根据主键删除\n\n```java\n\n@Test\npublic void test2() {\n    //删除ID等于 10的用户\n    Integer deleted = BraveSql.build(UserEntity.class).deleteByPrimaryKey(10);\n    Assert.assertTrue(deleted == 1);\n}\n```\n\n\n\n\n\n\n\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpengweizhong%2Fdynamic-sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpengweizhong%2Fdynamic-sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpengweizhong%2Fdynamic-sql/lists"}