drools项目中dmn文件调用自定义的java类来访问数据库

博客探讨了在规则引擎中不直接访问数据库的原则,但为了解决 Drools 内部依赖冲突,采用了一个例外。作者展示了如何使用较旧的 MySQL 驱动来避免与 Drools 的冲突,并实现了一个简单的数据库查询示例。通过调整 JSON 请求的字段名称,解决了名称冲突问题,确保了 DMN 规则引擎能正确解析数据。后续计划优化代码,如引入连接池,以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说一点,规则引擎里,典型的, 是不访问数据库的.青理解好这个概念和他的原因

这里只是在上个文章的基础上验证一个技术可行性而已.
上代码
这是个maven项目

package zzz;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Test{
	public static String url = "jdbc:mysql://xxxxx/mxxxtest?useSSL=false&useUnicode=yes&characterEncoding=utf8";
	public static String user = "xx";//用户名
	public static String passssword = "xxssx";//密码
	public static Driver driver = null;	
	public static void init() {
		try {
			driver = new com.mysql.jdbc.Driver();
			//设置用户名和密码
			Properties props = new Properties();
			props.setProperty("user", user);
			props.setProperty("pas34sword", pass4word);
			Connection conn = driver.connect(url, props);
		    String queyrSql = 
		    		"select providerId from xxx where id = '2' ";
		    Statement stmt = conn.createStatement();//获取statement
		    System.out.println(conn.isClosed() );
		    ResultSet rs = stmt.executeQuery(queyrSql);
		    while (rs.next()) {
		    	String szData = rs.getString(1);
			    System.out.println(szData );
			}
			rs.close();
			stmt.close();  
		    conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] s) {
		System.out.println("1111111");
		t2(1);
	}
	
	public static String t1() {
		System.out.println("222");
		return "222";
	}
	
	public static String t2(int c) {
		System.out.println("333333");
		init();
		
		return "222"+c;
	}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>yyy</groupId>
  <artifactId>forDMN2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.48</version>
    </dependency>
  </dependencies>
</project>

前者Test.java 后者pom.xml
为什么用老的mysql驱动,因为8.0之后都依赖了com.google.protobuf的protobuf-java,which跟drools内部某个依赖冲突了,导致处理postman发送的json请求时,解析json报错. 看了下本地maven库,只有5.几的就用了

然后就跟上个文章类似了, install, upload jar, restart server. drools的后台就可以打印出数据库里拿到的值了.
当然有很多可优化的地方. 可以把static语句块作为构造函数. 放一个连接池进去. 之类的
下一步考察是否可以得到一个对象.这样就真的完全无缝了就.
虽然按第一句话来说,这属于邪魔外道

09/19更新

在这里插入图片描述
在这里插入图片描述

查询得到结构完全ok .基本上可以为所欲为了

09/23更新
jar冲突的问题解决了.原因是发送的报文里有一个结构的属性名是"Type" ,报错说是跟spring-core里的某个类同名了,按spring-core来解析这个字段报了错,实际这个字段只是个dmn里定义的跟spring没关系,后来报文里改了下属性名就访问成功了. 也就是说解析json确实有名字的问题. 彻底的解决是dmn里的变量名字必须按规范来,首字母消息驼峰命名 不许有空格, 对象名也是这样, 结构名暂时看来不会放到报文里(报文里是结构对应的对象名)就按java类名的命名规范.
这样mysql 8.x的驱动也可以用了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值