2016-06-01 7 views
0

javaで実際のデータベース接続がなくてもSQLを実行できますか? 例:javaで実際のデータベース接続を持たずにSQLを実行できますか?

SELECT CASE 
      WHEN :param = 1 THEN 'TEST1' 
      WHEN :param = 2 THEN 'TEST2' 
      WHEN :param = 3 THEN 'TEST3' 
     END 
      AS RESULT 
FROM DUAL 

は私が置き換えられます:Javaコードで実行中のparam ... はこれを行う方法はありますか?

私は、このリンクが見つかりました:How do I extract selected columns given an Oracle SQL String?

をしかし、何の迅速な解決を

は現在のことを考えて、このリンクで提供されていない: - ダミーHSQLDBの接続やSQLクエリを実行します。しかし、それはメモリ内の新しいデータベースにまたがる必要があります。

もっと良い点がありますか&クイックソルーション?私はケース式を実行し、データを取得したい

おかげ

+3

あなたは何を達成しようとしていますか?私は "データベース接続なしでSQLを実行する"とは何を理解しているのか分からない...あなたの目標は何ですか? – Kritner

+0

クエリを実行する必要があるデータはありますか?あなたがこれで達成したいことが私にはっきりしないのですが、あなたは明確にすることができますか? – JonasCz

+1

SQLデータベースを使用せずにSQLクエリを実行することはできません。クエリを処理することはできません。 – Jehy

答えて

0

は..私はJSQLParserにしようとしています。例えば、上記の出力

しかしあなたはそれをやろうとしている理由として「Test1を」を返す必要がありますか?あなたの質問を単体テストしようとしていますか?またはクエリを呼び出すコード?

データベースオブジェクトを単体テストしようとするなら、それをprocに入れて、データベースユニットテストフレームワークを利用する方がよいかもしれません。 Some info on oracle unit testing。私はデュアルに基づいてオラクルを仮定しています。

Javaコードをテストしようとしている場合は、テストしようとしているメソッドから直接クエリを引き出し、 "実際の"実装を提供できるインターフェイスにプログラミングすることを検討する必要があります。モックや偽の実装。この方法で、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を取り出してストアドプロシージャに入れ、ユニットテストフレームワークを使用して、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は選択の私の言語ではありません:)

関連する問題