我们可以在java中没有真正的数据库连接的情况下执行SQL吗?

时间:2016-06-01 12:26:25

标签: java sql evaluation sql-parser tsql-parser

我们可以在java中没有真正的数据库连接的情况下执行SQL吗? 例如:

select IQID, NAME from TABLE_FILES where...

我将在java代码中替换运行时的param。 有没有办法做到这一点?

我找到了这个链接:How do I extract selected columns given an Oracle SQL String?

但此链接中未提供快速解决方案

目前正在考虑:虚拟hsqldb连接并执行SQL查询。但它需要跨越一个新的内存db。

有没有更好的&快速解决方案?

2 个答案:

答案 0 :(得分:0)

  

我想执行case表达式并获取数据..我正在尝试使用JSQLParser。以上示例应返回" Test1"作为输出

为什么你想这样做?您打算对您的查询进行单元测试吗?或调用查询的代码?

如果您正在尝试对数据库对象进行单元测试,那么最好将其放入proc并使用数据库单元测试框架。 Some info on oracle unit testing。我假设基于双重的oracle。

如果您正在尝试测试Java代码,则需要考虑直接从您尝试测试的方法中提取查询,并编程到您可以提供的接口&# 34;实"实现,以及模拟或虚假实现。这样您就可以独立于db调用本身进行测试。

我在代码中的意思的一个例子,抱歉这会有点粗糙,因为我对java不太熟悉与c#

相比

说你有:

public class ClassINeedToTest {
    public void myMethodThatNeedsTesting(int param1) {
        // do some stuff

        // implementation of sql code ... not real since I don't know how to call SQL from java
        SELECT CASE
          WHEN :param = 1 THEN 'TEST1'
          WHEN :param = 2 THEN 'TEST2'
          WHEN :param = 3 THEN 'TEST3'
        END
          AS RESULT
        FROM DUAL

        // potentially do some other stuff?
    }
}

所以,如上所述,如果您的目的是测试SQL本身,您应该将文字SQL拉出来,将其放入存储过程中,并使用单元测试框架在多个场景下测试proc的结果像param value = 1,2和3。

但是,如果您想在不依赖数据库连接的情况下测试周围的// Do stuff和/或// potentially do some other stuff?,那么您需要进行一些相对简单的重构。

方法myMethodThatNeedsTesting依赖于数据库,我们需要通过使用接口来抽象出来,以便能够在不依赖真实数据库连接的情况下测试方法myMethodThatNeedsTesting

看起来像这样:

public interface ISomeInterface {
    string getInfo(int param1);
}

我已将上述内容定义为查询所代表的内容。查询需要一个参数(param1)并返回一个标量字符串(查询结果)。

有了这个界面,你可以重构你的原始类看起来更像这样:

public interface ISomeInterface {
    string getInfo(int param1);
}

public class MySomeInterfaceImpl implements ISomeInterface {
    @override
    public string getInfo(int param1) {
        // implementation of sql code ... not real since I don't know how to call SQL from java
        SELECT CASE
          WHEN :param = 1 THEN 'TEST1'
          WHEN :param = 2 THEN 'TEST2'
          WHEN :param = 3 THEN 'TEST3'
        END
          AS RESULT
        FROM DUAL
    }
}

public class ClassINeedToTest {

    private ISomeInterface _myInterface;

    public ClassINeedToTest(ISomeInterface iSomeInterface) {
        _myInterface = iSomeInterface;
    }

    public void myMethodThatNeedsTesting(int param1) {
        // do some stuff

        _myInterface.getInfo(param1);

        // potentially do some other stuff?
    }
}

在上面,您可以看到方法myMethodThatNeedsTesting现在不再直接依赖于数据库连接,而是依赖于接口。有了这个,我们现在可以提供测试目的,a mock, stub, or fake

假的例子可能是:

public class MySomeInterfaceFake implements ISomeInterface {
    @override
    public string getInfo(int param1) {
        if (param1 == 1)
            return "TEST1";
        if (param1 == 2)
            return "TEST2";
        if (param1 == 3)
            return "TEST3";
    }

现在有了上面的假设,你在构造函数中传递了伪实现,你可以在不依赖数据库连接的情况下测试myMethodThatNeedsTesting

上面的重构可以定义为dependency injection,对于松散耦合非常有用,这导致更容易测试的代码等等。

很抱歉,如果我搞砸了上面的任何语法,那么java不是我选择的语言:)

答案 1 :(得分:0)

正如您提到的JSqlParser:表达式评估有一个非常简单的例子。 (https://github.com/JSQLParser/JSqlParser/wiki/Example-of-expression-evaluation

您可以扩展它以构建适合您需求的解释器。由于JSqlParser只是一个解析器,这将是一项非常重要的任务。