# 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" : "管理员"
}
}'
```

## 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中增加一个脚本文件

脚本内容如下(格式必须如此,在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" : "管理员"
}
}'
```

## 数据库存储模式
### 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" : "管理员"
}
}'
```
