# mybatis-plus-jpa-drools **Repository Path**: mybatis-plus-jpa/mybatis-plus-jpa-drools ## Basic Information - **Project Name**: mybatis-plus-jpa-drools - **Description**: 将Drools脚本存储到数据库中或项目文件中或nacos中并暴露为Web接口,同时利用Drools的特点来解决业务规则频繁变动的问题。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-07 - **Last Updated**: 2025-10-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 介绍 将Drools脚本存储到数据库中或项目文件中或nacos中并暴露为Web接口,同时利用Drools的特点来解决业务规则频繁变动的问题。 > drools本身比较适合做决策类和事件类单一场景的业务,业务场景比较复杂的情况推荐使用[mybatis-plus-jpa-script](https://gitee.com/mybatis-plus-jpa/mybatis-plus-jpa-script),基于Groovy的动态编译能力实现。 # maven引用 ## 1. 同时使用三种存储模式(文件模式为默认支持) ```xml com.xiaoyudeguang mybatis-plus-jpa-boot 1.0.12 com.xiaoyudeguang mybatis-plus-jpa-drools com.alibaba.nacos nacos-client 2.4.2 ``` ## 2. 只使用数据库存储模式(文件模式为默认支持) ```xml com.xiaoyudeguang mybatis-plus-jpa-boot 1.0.12 com.xiaoyudeguang mybatis-plus-jpa-drools com.mysql mysql-connector-j 8.0.33 runtime com.alibaba druid-spring-boot-starter 1.2.16 ``` 或 ```xml org.springframework.boot spring-boot-starter-parent 3.3.3 com.xiaoyudeguang mybatis-plus-jpa-drools 1.0.12 com.baomidou mybatis-plus-spring-boot3-starter 3.5.7 com.mysql mysql-connector-j 8.0.33 runtime com.alibaba druid-spring-boot-starter 1.2.16 ``` ## 3. 只使用nacos存储模式(文件模式为默认支持) ```xml org.springframework.boot spring-boot-starter-parent 3.3.3 com.xiaoyudeguang mybatis-plus-jpa-drools 1.0.12 com.alibaba.nacos nacos-client 2.4.2 ``` # 使用说明 ## 文件模式(默认支持) ### 1. 在项目的resources目录下新增rule目录,新增sysUser.drl文件,将下面的脚本复制并保存 ``` package com.xiaoyudeguag.drools.rules; import com.xiaoyudeguang.util.JsonObject; import com.xiaoyudeguang.request.RequestDto; import com.xiaoyudeguang.response.ResultDto; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.util.List; global jakarta.servlet.http.HttpServletRequest request; global jakarta.servlet.http.HttpServletResponse response; global org.slf4j.Logger log; rule "testeee" when $result : ResultDto() $body : RequestDto() eval($methodName.equals("testeee")) then $result.setData("2134"); end ``` ### 2. 启动服务后将下面的curl复制到postman中调用接口 ``` curl --location 'http://127.0.0.1:9999/sysUser/testeee' \ --header 'app_id: 1001' \ --header 'Content-Type: application/json' \ --data '{ "data": { "roleNo": "admin", "roleName" : "管理员" } }' ``` ![输入图片说明](%E5%9B%BE%E7%89%871.png) ## nacos存储模式(推荐) ### 1. 在yml中增加nacos配置 ```yml spring: cloud: nacos: discovery: server-addr: ${NACOS_HOST:nacos-server}:${NACOS_PORT:8848} namespace: ${命名空间} metadata: management.context-path: ${management.endpoints.web.base-path:/actuator} health.path: /health config: server-addr: ${spring.cloud.nacos.discovery.server-addr} namespace: ${spring.cloud.nacos.discovery.namespace} file-extension: yml ``` ### 2. 在nacos中增加一个脚本文件 ![输入图片说明](image1.png) 脚本内容如下(格式必须如此,在doService方法中可以编写实现逻辑): ``` package com.xiaoyudeguag.drools.rules; import com.xiaoyudeguang.util.JsonObject; import com.xiaoyudeguang.request.RequestDto; import com.xiaoyudeguang.response.ResultDto; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.util.List; global jakarta.servlet.http.HttpServletRequest request; global jakarta.servlet.http.HttpServletResponse response; global org.slf4j.Logger log; rule "testeee" when $result : ResultDto() $body : RequestDto() eval($methodName.equals("testeee")) then $result.setData("2134"); end ``` ### 3. 将下面的curl复制到postman中调用接口 ``` curl --location 'http://127.0.0.1:9999/sysUser/testeee' \ --header 'app_id: 1001' \ --header 'Content-Type: application/json' \ --data '{ "data": { "roleNo": "admin", "roleName" : "管理员" } }' ``` ![输入图片说明](%E5%9B%BE%E7%89%871.png) ## 数据库存储模式 ### 1. 启动类上增加下面的注解: ```yml @EntityScan(basePackages = {"com.**.model"}) @MapperScan(basePackages = {"com.**.mapper"}) ``` ### 2. yml中增加下面的配置 ``` spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource username: root password: 123456 url: jdbc:mysql://mysql-server:3306/demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true jpa: hibernate: ddl-auto: update properties: hibernate: enable_lazy_load_no_trans: true schema_update: unique_constraint_strategy: RECREATE_QUIETLY ``` ### 3. 在数据库中执行下面的sql: ```sql DROP TABLE IF EXISTS `dr_script`; CREATE TABLE `dr_script` ( `id` bigint NOT NULL COMMENT '主键id', `app_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '应用id', `created` datetime DEFAULT NULL COMMENT '创建时间', `creator` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `modified` datetime DEFAULT NULL COMMENT '修改时间', `modifier` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', `sort` int NOT NULL DEFAULT '100000' COMMENT '排序', `status` bigint DEFAULT '0' COMMENT '状态', `tenant_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '租户id', `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '脚本名称', `permission` text COLLATE utf8mb4_bin COMMENT '接口权限', `script` text COLLATE utf8mb4_bin COMMENT '脚本内容', `script_key` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '脚本唯一标识', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of dr_script -- ---------------------------- BEGIN; INSERT INTO `demo`.`dr_script` (`id`, `app_id`, `created`, `creator`, `modified`, `modifier`, `sort`, `status`, `tenant_id`, `name`, `permission`, `script`, `script_key`) VALUES (1, NULL, NULL, NULL, NULL, NULL, 100000, 0, NULL, '动态脚本', NULL, 'package com.xiaoyudeguag.drools.rules;\n\nimport com.xiaoyudeguang.util.JsonObject;\nimport com.xiaoyudeguang.request.RequestDto;\nimport com.xiaoyudeguang.response.ResultDto;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport java.util.List;\n\nglobal jakarta.servlet.http.HttpServletRequest request;\nglobal jakarta.servlet.http.HttpServletResponse response;\nglobal org.slf4j.Logger log;\n\nrule \"testeee\"\n when\n eval($methodName.equals(\"testeee\"))\n $result : ResultDto()\n $body : RequestDto()\n then\n $result.setData(\"2134\");\nend', '/sysUser/testeee'); COMMIT; SET FOREIGN_KEY_CHECKS = 1; ``` ### 4. 将下面的curl复制到postman中调用接口 ``` curl --location 'http://127.0.0.1:9999/sysUser/testeee' \ --header 'app_id: 1001' \ --header 'Content-Type: application/json' \ --data '{ "data": { "roleNo": "admin", "roleName" : "管理员" } }' ``` ![输入图片说明](%E5%9B%BE%E7%89%871.png)