drools-对象增删改查

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/82152093

容器

    这东西现在也大致有个了解了,不讲究细节,大致来看也就是
    规则  + 数据
    好比算法 + 数据  = 程序,抛去执行流程,规则也就是固定的算法,所以
    drools = rule + fact
    如果说程序要有一个运行环境,那么,drools也需要有一个环境来执行这个操作
    这个容器(环境)中,有rule和fact
    
    从代码执行顺序,我们大致也能有一点感觉

  1.    加载规则
  2.    创建会话
  3.    插入数据

    这个所谓会话,也就是我们需要的容器
    从数据角度,这东西也相当于一个数据库,支持增删改查
    只不过,这数据可以被操作,不一定就是死板的记录数据

增insert

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;

rule "find"
	when
		$person:Person(name == "godme")
	then
		Person person = new Person();
		person.setName("son");
		insert(person);
end

代码插入不用说了吧

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

删retract

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;

rule "find"
	when
		$person:Person(name == "godme")
	then
		// 从容器中移除指定对象 
		retract($person);
end

代码修改的话就没必要了,不需要就别插入了

改update-modify

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;

rule "find"
	when
		$person:Person(name == "godme")
	then
		$person.setName("fucker");
        // update是直接更新对象,可以看做是移除之后再插入
        // 具体的操作是在外部,和modify区分
		update($person);
end
package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;

rule "find"
	when
		$person:Person(name == "godme")
	then
		modify($person){
			setName("fucker"),
			setAge(99)
		}
		// modify两点
		// 1. 方法
		//     modify中可以省略对象调用部分,直接调用方法
		//     $person.setName()  ==>  setName() 
		//     内部带对象会报错
		// 2. 分隔符号
		//     多个方法之间,使用逗号分隔
		//     可以写分号,但是只能作为结尾符,不能作为分隔符
		//     不可以没有分隔符
		//     以上错误,都会报错
end

无参

drl

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;

query "find_godme"
	$person:Person(name == "godme")
end

rule "find"
	when
		$person:Person(name == "godme")
	then
		System.out.println("print: " + $person.getName());
end

java

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            QueryResults find_godme_result = ksession.getQueryResults("find_godme");
            for(QueryResultsRow row : find_godme_result){
            	Person p = (Person)row.get("$person");
            	System.out.println("find_godme : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

有参

drl

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;


query "find_Person"(String person_name)
	$person:Person(name == person_name)
end


rule "find"
	when
		$person:Person(name == "godme")
	then
		System.out.println("print: " + $person.getName());
end

java

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            QueryResults find_person_result = ksession.getQueryResults("find_Person", "judas");
            for(QueryResultsRow row : find_person_result){
            	Person p = (Person)row.get("$person");
            	System.out.println("find_person_result : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

查询主体来说,注意两点

  1. 查询编写
  2. 外部代码

查询编写

  1. 结构
  2. 参数
  3. 查询
package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;




// 1. 声明 :query "name" (type param)
//    1. query 关键字必须
//    2. name必须唯一 
//    3. 无参(type param)可省略,或者() 
// 2. 查询主体
//    1. 一般的过滤条件,需要有对应接收对象$person
//    2. 可以再查询语句中编写多个查询
// 3. end
//    1.结束标记

query "find_Person"(String person_name)
	$person:Person(name == person_name)
end

外部代码

  1. 名称
  2. 参数
  3. 结果集
  4. 单行取数
    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            // 会话指定名称查询,同时变参传入参数
            QueryResults find_person_result = ksession.getQueryResults("find_Person", "judas");
            // 遍历结果集,去除单行
            for(QueryResultsRow row : find_person_result){
            	// 通过规则内部定义的接收名称获取对象
            	Person p = (Person)row.get("$person");
            	System.out.println("find_person_result : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

查询比较繁琐,但是也是后面的主流。

可能是

     逻辑全部集中在"规则"当中,外部只需插入数据。

这种先入为主的观念在作祟,会使得我们对外部逻辑反而有些排斥了。

但是逼近是程序猿,怎么能够讨厌代码呢。

复杂的业务也必定不是单一的。就是这样了

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/82152093