コンテンツにスキップ

JDBC

PetraDBにはJVMアプリケーション用のJDBC 4ドライバーが含まれています。ドライバーはJava ServiceLoaderメカニズムにより自動登録されます。推移的な依存関係のない単一のファットjarとして配布されます。

Maven:

<dependency>
<groupId>io.github.edadma</groupId>
<artifactId>petradb-jdbc</artifactId>
<version>1.5.0</version>
</dependency>

Gradle:

implementation 'io.github.edadma:petradb-jdbc:1.5.0'

sbt:

libraryDependencies += "io.github.edadma" % "petradb-jdbc" % "1.5.0"

またはMaven Centralからjarを直接ダウンロードできます。

Connection conn = DriverManager.getConnection("jdbc:petradb:memory");

各接続は独立したインメモリデータベースを作成します。

Connection conn = DriverManager.getConnection("jdbc:petradb:file:/path/to/database.petra");

既存のデータベースを開くか、新しいデータベースを作成します。サポートされるファイル拡張子:

拡張子バックエンド
.petra永続ページストア
.ptxtテキストベースストア
その他永続ページストア(デフォルト)
Properties props = new Properties();
props.setProperty("user", "username");
props.setProperty("password", "password");
Connection conn = DriverManager.getConnection("jdbc:petradb://localhost:5480", props);
Statement stmt = conn.createStatement();
// クエリ
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 更新
int rowCount = stmt.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");
// 汎用実行
boolean hasResults = stmt.execute("SELECT 1");

?パラメータプレースホルダーを使用します。

PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE id = ? AND active = ?");
ps.setInt(1, 42);
ps.setBoolean(2, true);
ResultSet rs = ps.executeQuery();

サポートされるsetterメソッド:

メソッドSQL型
setInt(index, value)INT
setLong(index, value)BIGINT
setFloat(index, value)FLOAT
setDouble(index, value)DOUBLE
setBigDecimal(index, value)NUMERIC
setString(index, value)TEXT
setBoolean(index, value)BOOLEAN
setDate(index, value)DATE
setTimestamp(index, value)TIMESTAMP
setNull(index, sqlType)NULL
setObject(index, value)自動検出
Statement stmt = conn.createStatement();
stmt.addBatch("INSERT INTO users (name) VALUES ('Alice')");
stmt.addBatch("INSERT INTO users (name) VALUES ('Bob')");
int[] counts = stmt.executeBatch();
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO users (name, email) VALUES (?, ?)");
ps.setString(1, "Alice");
ps.setString(2, "alice@example.com");
ps.addBatch();
ps.setString(1, "Bob");
ps.setString(2, "bob@example.com");
ps.addBatch();
int[] counts = ps.executeBatch();

前方のみ、読み取り専用のResultSetです。

ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
// rs.wasNull()で最後に読み取った値がNULLかチェック
}
rs.close();

インデックス(1ベース)または名前でカラムにアクセスできます。

rs.getInt(1); // 位置で
rs.getString("name"); // ラベルで

デフォルトでオートコミットが有効です。明示的なトランザクション制御には無効にします。

conn.setAutoCommit(false);
try {
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
conn.commit();
} catch (SQLException e) {
conn.rollback();
}
DatabaseMetaData meta = conn.getMetaData();
// テーブル一覧
ResultSet tables = meta.getTables(null, null, null, null);
while (tables.next()) {
String tableName = tables.getString("TABLE_NAME");
}
// カラム一覧
ResultSet cols = meta.getColumns(null, null, "users", null);
while (cols.next()) {
String name = cols.getString("COLUMN_NAME");
String type = cols.getString("TYPE_NAME");
boolean nullable = cols.getInt("NULLABLE") == DatabaseMetaData.columnNullable;
}
// 主キー
ResultSet pks = meta.getPrimaryKeys(null, null, "users");
// 外部キー
ResultSet fks = meta.getImportedKeys(null, null, "orders");
// インデックス
ResultSet idxs = meta.getIndexInfo(null, null, "users", false, false);

getColumns()は各カラムの型と精度/スケールに基づいてCOLUMN_SIZEDECIMAL_DIGITSCHAR_OCTET_LENGTHを返します。

カラム型COLUMN_SIZEDECIMAL_DIGITSCHAR_OCTET_LENGTH
VARCHAR(n) / CHAR(n)nnulln * 4
TEXT2147483647null2147483647
INT / SERIAL100null
BIGINT / BIGSERIAL190null
NUMERIC(p,s)psnull
BOOLEAN1nullnull
PetraDB型JDBC型Java型
INT / SERIALTypes.INTEGERInteger
BIGINT / BIGSERIALTypes.BIGINTLong
DOUBLETypes.DOUBLEDouble
NUMERICTypes.NUMERICBigDecimal
TEXT / VARCHAR / CHARTypes.VARCHARString
BOOLEANTypes.BOOLEANBoolean
DATETypes.DATEjava.sql.Date
TIMESTAMPTypes.TIMESTAMPjava.sql.Timestamp
UUID / ENUMTypes.VARCHARString