gikoha’s blog

個人的メモがわり

kotlinでoracle database access

  • kotlinでの oracle db access test

    • maven を使ってjava libを自動ダウンロードさせる
    • fatJarを作って実行 を目標とする
  • IntelliJのメニューから New Projectを選択

  • 左の欄からKotlinを選ぶ

    • Name : kotlintest
    • Project Template: Console Application
    • Build System: Gradle Groovy
    • Project JDK: JDK1.8
  • oracle maven repoにアクセスするため ~/.gradle/gradle.properties に以下を追加

otn_user=XXXX
otn_password=XXXX
  • build.gradle を変更
    • shadowJarを使ってパッケージングしたい
    • plugins { } の中に以下を追加
id 'com.github.johnrengelman.shadow' version '5.0.0'
id 'java'
  • repositories { } の中に以下を追加
  maven {
      url "https://www.oracle.com/content/secure/maven/content"
      credentials {
          username otn_user
          password otn_password
      }
  }
  • dependencies { } を追加
dependencies {
    implementation 'com.oracle.database.jdbc:ojdbc8:19.6.0.0'
    implementation 'com.oracle.database.jdbc:ucp:19.6.0.0'
}
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.Statement
import java.sql.Connection

fun main(args: Array<String>) {
    var conn: Connection? = null
    var statement: Statement? = null
    var resultSet: ResultSet? = null

    try {
        conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XEPDB1", "user", "password")
        statement = conn?.createStatement()
        val sqlstring = "select sysdate from dual"
        println("SQL: $sqlstring")
        resultSet = statement?.executeQuery(sqlstring)
        while(resultSet?.next() ?: false) {
            println(resultSet!!.getString(1))
        }

    } catch (e: Exception) {
        println(e)
    } finally {
        resultSet?.close()
        statement?.close()
        conn?.close()
    }
}
  • 画面右端の Gradle タブから
    • application > run でビルド&実行
    • shadow > shadowJar で build/libs/に 実行可能jarが作られる
java -jar build/libs/kotlintest-1.0-SNAPSHOT-all.jar 
SQL: select sysdate from dual
2021-01-09 13:56:15
  • なぜkotlin (JavaVM) ですか
    • Apple M1用のaarch64 instant clientが配布されていないため M1 Macoracleアクセスするにはいまんとこ javaか すべてx86 Rosettaしかないから
[MBP-M1:~/DevelopM1/ocilib/demo] % gcc conntest.c -o conntest -locilib -L /opt/oracle/instantclient_19_8 -L/usr/local/lib -lclntsh
ld: warning: ignoring file /opt/oracle/instantclient_19_8/libclntsh.dylib, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
あらら無視されちゃったよ
  • さすがにx86ライブラリとarm64ライブラリを混ぜて使うことはできないらしい
  • Javaなら Zulu Java がすでにaarch64対応
    • JavaFXOpenGLに依存、これはMetalのみのM1ではサポートされず.