JavaのWindows認証でSQLServerにJDBC接続してinsert/update/deleteするサンプルです。
(確認環境:Java 8,SQL Server 2019 Express Edition)
目次
SQLのサンプル | insertのサンプル |
updateの場合 | |
deleteの場合 | |
文字コードの設定 |
insertのサンプル
SQL ServerにJDBC接続してインサートを実行するサンプルです。
package test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test1 {
public static void main(String[] args) {
final String URL = "jdbc:sqlserver://localhost\\SQLEXPRESS;"
+ "Database=testDB1;integratedSecurity=true;";
final String SQL =
"insert into syain (id,name,romaji) VALUES (?,?,?)";
try (Connection conn = DriverManager.getConnection(URL)){
conn.setAutoCommit(false);
try(PreparedStatement ps = conn.prepareStatement(SQL)){
ps.setInt(1, 1);
ps.setString(2,"竹田");
ps.setString(3,"takeda");
ps.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
System.out.println("rollback");
throw e;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("処理が完了しました");
}
}
}
接続情報
11,12行目は、SQL Serverへ接続する情報です。finalは再代入不可になります。
プレースホルダ
14行目は、SQLのinsert文です。クエスチョンマーク(?)は、プレースホルダです。パラメータで値を設定します。
入力される不正な文字を抑止できるのでSQLインジェクション対策になります。
固定文字列のSQLの部分がプリコンパイルされるので実行速度が上がります。
プレースホルダは、バインド変数とも呼ばれます。
接続とtry-with-resources構文
16行目のtryの後に続くかっこ()はリソースを自動でクローズします。try-with-resources構文と呼ばれます。Java7で導入されました。
Java リソースを自動でクローズ(try-with-resources文)
コミットモードの設定
conn.setAutoCommit(false);
18行目は、setAutoCommitメソッドで引数はfalseです。手動コミットするようにしています。デフォルトは自動コミットモードです。自動コミットモードは、SQLを実行する毎にコミットされます。
パラメータ(値)のセット
20行目は、prepareStatementのインスタンスを生成しています。プリコンパイルされたSQL文を扱うオブジェクトです。引数に上記のSQLを指定しています。
Prepared=準備された、Statement=文です。
21~23行目は、プレースホルダに値をセットしています。1つめの引数はプレースホルダの位置です。2つめの引数は値です。
SQLの実行とコミットとロールバック
25行目は、executeUpdateメソッドでSQLを実行しています。
SQLの処理が成功した場合、26行目のCommitメソッドで確定されます。
ここでエラーがあった場合は、26行目は実行されず、catchに処理が移動しrollbackメソッドでデータをロールバックします。例えばinsert文を2つ発行したとして一つは成功しもう一つは失敗した場合、2つともデータ更新はしません。
updateの場合
= "update syain set name = ? ,romaji = ? where id = ?";
updeteを行う場合は、14行目のSQL文と21~23行目のパラメータの設定を修正します。
ps.setString(1, "竹田test2");
ps.setString(2,"takedatest2");
ps.setInt(3,1);
deleteの場合
= "delete from syain where id = ?";
deleteを行う場合も14行目のSQL文と21~23行目のパラメータの設定を修正します。
ps.setInt(1,1);
文字コードの設定
上記サンプル(SQLServer)のテーブルの日本語の列の文字コードはcp932(sjis)を設定しました。
Eclipseの文字コードをMS932(※)に設定した場合、上記サンプルの日本語は文字化け無しで登録できました。
※Test1.javaの文字コードがsjisになります。
Eclipseの文字コードをUTF8(※)に設定した場合も上記サンプルの日本語は文字化け無しで登録できました。ドライバが変換している?
※Test1.javaの文字コードがutf8になります。
関連の記事