100本ノック
JDBCとNIO.2は、Java Gold試験において「暗記」と「コードの読み取り能力」の両方が試される分野です。特にJDBCのメソッド名や、NIO.2のPath計算は1問のミスが合否を分ける重要ポイントです。
各50項目、合計100個のチェックポイントを整理しました。
1. JDBC:データベース連携 (1-50)¶
JDBCの基本構造と接続 (1-10)¶
- JDBC URL:
jdbc:subprotocol:subnameの形式(例:jdbc:derby:zoo)。 - DriverManager: 接続管理。
getConnection(url, user, pass)でConnectionを取得。 - Connection: DBへのセッション。
try-with-resourcesでのクローズが必須。 - Statement: SQLを実行する器。
- ResultSet:
SELECTの実行結果を保持する表形式のデータ。 - SQLException: ほぼ全てのJDBCメソッドが投げるチェック例外。
- ドライバのロード: JDBC 4.0以降、
Class.forName()は原則不要。 - SQLインジェクション: 変数を直接文字列連結してSQLを作ることの危険性。
- クローズ順序:
ResultSet→Statement→Connection(開いたのと逆順)。 -
リソース管理:
try(Connection c; Statement s; ResultSet r)のようにセミコロンで区切って記述可能。SQLの実行と結果の取得 (11-25)¶
-
executeQuery():SELECT文に使用。ResultSetを返す。 executeUpdate():INSERT/UPDATE/DELETEに使用。更新された「行数(int)」を返す。execute(): 任意のSQL。戻り値はboolean(ResultSetが得られればtrue)。rs.next(): カーソルを一行進める。データがあればtrue。- カーソルの初期位置: 「1行目の前」(Before First)。
- カラムの指定: インデックスは 1から始まる(0ではない)。
- データ型:
rs.getInt(),rs.getString(),rs.getObject()など。 - PreparedStatement: SQLを事前コンパイル。パラメータは
?で指定。 ps.setXxx(index, value):?への値セット。これもインデックスは1から。- セキュリティ:
PreparedStatementはSQLインジェクション対策の基本。 - CallableStatement: ストアドプロシージャの呼び出しに使用。
cs.registerOutParameter(): プロシージャの出力値を登録。wasNull(): 直前に読み込んだ値がSQLのNULLだったか判定。- DB型とJava型:
DATE→java.sql.Date,TIMESTAMP→java.sql.Timestamp。 -
日付の扱い:
java.util.Dateではなくjava.sql.Dateを使う。スクロールと更新可能ResultSet (26-40)¶
-
TYPE_FORWARD_ONLY: 前方にのみ進める(デフォルト)。 TYPE_SCROLL_INSENSITIVE: 前後移動可。実行中のDB変更は反映されない。TYPE_SCROLL_SENSITIVE: 前後移動可。実行中のDB変更が反映される。CONCUR_READ_ONLY: 読み取り専用(デフォルト)。CONCUR_UPDATABLE: ResultSet経由でDBを更新できる。rs.absolute(int): 指定した行へ移動(負の数は末尾から)。rs.relative(int): 現在地から相対的に移動。rs.previous(): 一つ前に戻る。- **
rs.beforeFirst()/rs.afterLast()**: 両端への移動。 - **
rs.last()/rs.first()**: 最終行/先頭行への移動。 rs.updateString(col, val): ResultSet内の値を変更(DB未反映)。rs.updateRow(): 変更をDBに反映させる。rs.cancelRowUpdates():updateRow()前なら変更を取消可能。rs.moveToInsertRow(): 新規行挿入のための待機場所へ移動。-
rs.insertRow(): 新規行をDBに挿入。トランザクション管理 (41-50)¶
-
AutoCommit: デフォルトはtrue(一文ごとに即確定)。
setAutoCommit(false): トランザクションの開始。commit(): 全ての変更を確定。rollback(): 最後のコミット以降の変更を取消。- 分離レベル:
TRANSACTION_READ_COMMITTEDなど。 - Savepoint: トランザクション内の特定地点への目印。
conn.setSavepoint(): セーブポイント作成。conn.rollback(savepoint): 特定地点まで戻す。conn.releaseSavepoint(savepoint): セーブポイントの破棄。-
例外時のロールバック:
catchブロック内で明示的に呼ぶのが基本。2. NIO.2:ファイル操作 (51-100)¶
** Pathインターフェースの基本 (51-65)**
-
Path: ファイルやディレクトリの位置を表す。実体があるとは限らない。 Paths.get(): Pathの生成。Path.of(): Java 11以降のPath生成メソッド。normalize():.や..を解消したパスにする。relativize(): あるパスから別のパスへの相対パスを計算。resolve(): 2つのパスを結合する。getNameCount(): パス要素の数。getName(index): 指定した位置の要素を取得。subpath(begin, end): パスの一部を切り出す。- **
getParent()/getFileName()/getRoot()**: 階層情報の取得。 - **
isAbsolute()/toAbsolutePath()**: 絶対パス判定と変換。 toRealPath(): リンク等を解決した「本当の」絶対パスを取得(存在確認も行う)。Pathの反復処理:for(Path p : path)で要素ごとにループ可能。- 比較:
equals()はパス文字列を比較する(物理的な同一性は見ない)。 -
ファイルシステム:
FileSystems.getDefault()。Filesクラス(静的メソッド) (66-85)¶
-
Files.exists(path): 存在確認。 Files.isSameFile(p1, p2): 物理的に同じファイルを指しているか(存在確認を伴う)。Files.createDirectory(path): 1階層作成。Files.createDirectories(path): 親階層含めて作成。Files.copy(src, target): コピー。Files.move(src, target): 移動またはリネーム。Files.delete(path): 削除(存在しないと例外)。Files.deleteIfExists(path): 削除(なくても例外なし)。REPLACE_EXISTING: コピー/移動時の上書きオプション。COPY_ATTRIBUTES: 属性も含めてコピーするオプション。Files.readAllLines(path): 全行をList<String>で取得。Files.lines(path): ファイルを Streamとして取得(メモリ効率が良い)。 Files.newBufferedReader(path): Readerの取得。Files.size(path): ファイルサイズ(byte)取得。- 基本属性:
readAttributes(path, BasicFileAttributes.class)。 BasicFileAttributes:creationTime,lastModifiedTime,size,isDirectory等。FileTime: NIO.2で時間を表すクラス。Files.setAttribute(): 特定の属性を更新。PosixFileAttributes: UNIX系独自の属性(パーミッション等)。-
Files.isSymbolicLink(): シンボリックリンク判定。ファイルの探索と再帰処理 (86-100)¶
-
Files.list(path): 指定ディレクトリ直下の要素をStreamで返す。 Files.walk(path): サブディレクトリ含め再帰的に全要素をStreamで返す(深さ優先)。Files.find(path, depth, BiPredicate): 条件に合うファイルを再帰的に探す。- Streamのクローズ:
walk等はtry-with-resourcesで閉じるべき。 FileVisitor: 再帰処理の各工程を制御するインターフェース。SimpleFileVisitor: FileVisitorの全メソッドを空実装したクラス。preVisitDirectory: ディレクトリに入る前の処理。visitFile: ファイル到達時の処理。visitFileFailed: アクセス失敗時の処理。postVisitDirectory: ディレクトリから出る時の処理。FileVisitResult.CONTINUE: 探索を継続。FileVisitResult.TERMINATE: 探索を即座に終了。FileVisitResult.SKIP_SUBTREE: そのディレクトリ下の探索を中止。FileVisitResult.SKIP_SIBLINGS: 同じ階層の残りの探索を中止。PathMatcher:glob:*.javaなどのパターンでファイル名を判定。
💡 試験合格へのアドバイス¶
- JDBC:
rs.next()を呼ばずにrs.get...()を呼んでいるコードはエラーです。また、SQLExceptionがtry-catchされているかを必ず確認してください。 - NIO.2:
p1.relativize(p2)の計算(p1からp2へどう行くか)を紙に書いて練習してください。ルートが違うパス同士のrelativizeは例外を投げます。
次は、JDBCの 「PreparedStatementの詳細な使い方」 か、NIO.2の 「Path計算のシミュレーション問題」 を深掘りしますか?
なお、各種アプリのすべての機能を使用するには、Gemini アプリ アクティビティを有効にする必要があります。