##やりたかったこと
EclipseとOracleDB (11g Release2)を連携させて、Javaプログラムを使ってDB内の値を取得したい。
すでにMYSQLとの連携はできているので、データアクセス層当たりのコードいじるだけでできるはず。
##詰まったこと
・そもそもDBとの接続文字列に指定するものは何?
・SQL文がMYSQLを操作する際に使用していたものと同じでは、謎のエラーが出る。
・ResultSetを受け取ったあたりで謎の警告が出る。
特にSQL文のエラーは解決するのにだいぶ時間かかりました。。。
もしかしたら全く同じことでつまずく人がもしかしたらいるかもしれないので、メモとして残しておきます。
##そもそもOracleDBとの接続文字列に指定するものは何?
詰まった3つのことをすべて書くととても長くなりそうなので、今回は接続文字列についてのみ記事にします。
結論から言うと、jdbc:oracle:thin:@localhost:1521:XEで通りました。(OracleDB 11g Release2)
※OracleDBは最新だと19cとか出てますけど文献少なかったので今回はあきらめました。
試してみたコードはこちらです。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestConn {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Connection conn = null;
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "OracleDBに作成したID";//ここは適宜変更して下さい。
String password = "OracleDBに作成したpassword";//ここは適宜変更して下さい。
try {
//Driverのロード
Class.forName("oracle.jdbc.OracleDriver");
//コネクションの確立
conn = DriverManager.getConnection(url, user, password);
System.out.println("接続に成功しました");
PreparedStatement pre_statement
= conn.prepareStatement("SELECT PASSWORD from user_id where id = 123456");
//実行したいSQL文に変更してください
//SQL実行
ResultSet result_set = pre_statement.executeQuery();
System.out.println("取得しました");
result_set.next();
System.out.println(".next()実行しました");
System.out.println(result_set.getString("PASSWORD"));
} catch (ClassNotFoundException | SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
こんなかんじで出来ました。
(DB側のスクショ取り忘れましたが、取得したい値はpasswordであっているので、成功しています。)
この接続文字列についてですが
- ConnectionTypeが、jdbc:oracle
- Driverがthin(なんなんだthinて。。。)
- ホストの名前が今回はlocal環境で操作させているのでlocalhost
- JDBCポートが 1521
- SIDがXE(メモリの名称,自分がインストールしたOracleDBのフォルダの中をいじるとファイル名になってる。)
これをつなぎ合わせてるみたいですね。
社内研修ではおまじないのように使用していたので、これを機に勉強できてよかったです。
##最後に
残りの2つも随時記事にして自身の備忘録に出来たらなあと思っています。
乱文なので見ずらいかもしれませんが、ご了承ください。