2016-06-01 12 views
0

Können wir SQL ausführen, ohne eine echte Datenbankverbindung in Java zu haben? Beispiel:Können wir SQL ausführen, ohne eine echte Datenbankverbindung in Java zu haben?

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

I ersetzt: param in Laufzeit in Java-Code ... Gibt es eine Möglichkeit, dies zu tun?

fand ich diesen Link: How do I extract selected columns given an Oracle SQL String?

aber keine schnelle Lösung ist in diesem Link

Derzeit denken an zur Verfügung gestellt: - Verbindung Dummy hsqldb und SQL-Abfrage auszuführen. Aber es erfordert eine neue im Speicher db zu spannen.

Gibt es eine bessere & Schnelle Lösung?

Dank

+3

Was versuchen Sie zu erreichen? Ich bin mir nicht sicher, ob ich verstehe, was "SQL ohne Datenbankverbindung ausführen" bedeutet ... was ist Ihr Ziel? – Kritner

+0

Für welche Art von Daten müssen Sie Ihre Abfrage ggf. ausführen? Es ist mir nicht klar, was du damit erreichen willst, könntest du das klären? – JonasCz

+1

Sie können keine SQL-Abfrage ohne SQL-Datenbank ausführen. Nichts kann die Abfrage verarbeiten. – Jehy

Antwort

0

Ich will Fall Ausdruck auszuführen und Daten zu erhalten .. Ich mit JSQLParser versuchen. Im obigen Beispiel sollte „Test1“ Rückkehr als Ausgang

aber warum versuchen Sie, das zu tun? Möchten Sie Ihre Abfrage testen? oder der Code, der die Abfrage aufruft?

Wenn Sie versuchen, Datenbankobjekte in einem Unit-Test zu testen, ist es besser, sie in einen Proc zu schreiben und ein Framework zum Testen von Datenbankeinheiten zu verwenden. Some info on oracle unit testing. Ich nehme an, dass Orakel auf Dual basiert.

Wenn Sie versuchen, Ihren Java-Code zu testen, müssen Sie darüber nachdenken, die Abfrage direkt aus der Methode, die Sie testen möchten, zu ziehen und auf eine Schnittstelle zu programmieren, auf die Sie "echte" Implementierung bereitstellen können. und eine falsche oder falsche Implementierung. Auf diese Weise testen Sie unabhängig vom db-Aufruf selbst.

Ein Beispiel dessen, was ich in Code bedeuten, und sorry das wird ein wenig rau sein, wie ich bin weniger vertraut mit Java im Vergleich zu C#

Sie zu sagen haben:

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? 
    } 
} 

So , wie oben erwähnt, wenn Sie die SQL selbst testen möchten, sollten Sie wahrscheinlich das SQL-Literal herausziehen, es in eine gespeicherte Prozedur einfügen und ein Unit-Test-Framework verwenden, um das Ergebnis des Proc unter mehreren Szenarien wie param value = zu testen 1, 2 und 3.

Aber, wenn Sie die Umgebung // Do stuff und/oder // potentially do some other stuff? testen möchten, ohne von der Datenbankkonnektivität abhängig zu sein, müssen Sie ein relativ einfaches Refactoring durchführen.

Die Methode hat eine Abhängigkeit von der Datenbank, die wir über eine Schnittstelle abstrahieren müssen, um die Methode testen zu können, ohne auf eine echte Datenbankverbindung angewiesen zu sein.

die etwa wie folgt aussehen könnte:

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

Ich habe die oben sein eine Darstellung dessen, was die Abfrage darstellt definiert.Die Abfrage erfordert einen Parameter (param1) und gibt eine skalare Zeichenfolge zurück (Ergebnis aus Ihrer Abfrage).

diese Schnittstelle gegeben, können Sie Ihre ursprüngliche Klasse Refactoring mehr wie folgt aussehen:

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? 
    } 
} 

In der oben können Sie sehen, dass die Methode myMethodThatNeedsTesting jetzt nicht mehr auf eine Datenbankverbindung direkt abhängig, aber eher eine Schnittstelle. Damit können wir nun zu Testzwecken a mock, stub, or fake bereitstellen.

könnte ein Beispiel gefälscht sein:

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"; 
    } 

Jetzt mit der oben Fälschung, Sie in der falschen Umsetzung in Ihrem Konstruktor übergeben, und Sie können myMethodThatNeedsTesting testen auf einer Datenbank-Verbindung, ohne sie.

Der obige Refactor kann als dependency injection definiert werden, und ist sehr nützlich für lose Kopplung, die unter anderem zu leichter zu testenden Code führt.

Sorry, wenn ich irgendwelche Syntax in der oben vermasselt, wieder Java ist nicht meine Sprache der Wahl :)