JavaでMySQLにJDBC接続してデータ更新するサンプルと説明です。
(確認環境:Java8,XAMPP 7.2.8,Windows 10,Eclipse 4.8)
目次
SQLのサンプル | insertのサンプル |
説明 | 接続情報 / プレースホルダ / 接続とtry-with-resources構文 |
コミットモードの設定 / パラメータ(値)のセット | |
SQLの実行とコミットとロールバック / updateの場合 / deleteの場合 | |
ドライバ | JDBCドライバを取得する |
環境 | 接続先のデータベースとテーブルと文字コード |
insertのサンプル
MySQLにJDBC接続してインサートを実行するサンプルです。
package test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Test1 {
public static void main(String[] args) {
final String URL
= "jdbc:mysql://localhost:3306/testphp?serverTimezone=JST";
final String USER = "root";
final String PASS = "";
final String SQL = "insert into employee (name,romaji) VALUES (?,?)";
try(Connection conn =
DriverManager.getConnection(URL, USER, PASS)){
conn.setAutoCommit(false);
try(PreparedStatement ps = conn.prepareStatement(SQL)){
ps.setString(1,"竹田");
ps.setString(2,"takeda");
ps.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
System.out.println("rollback");
throw e;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("処理が完了しました");
}
}
}
接続情報
final String URL
= "jdbc:mysql://localhost:3306/testphp?serverTimezone=JST";
final String USER = "root";
final String PASS = "";
9~12行目は、MySQLへ接続する情報です。3306はポート番号です。testphpはデータベース名です。
finalは再代入不可になります。
Java finalのサンプル(定数として使用/継承不可)
プレースホルダ
final String SQL = "insert into employee (name,romaji) VALUES (?,?)";
13行目は、SQLのinsert文です。クエスチョンマーク(?)は、プレースホルダです。パラメータで値を設定します。
入力される不正な文字を抑止できるのでSQLインジェクション対策になります。
固定文字列のSQLの部分がプリコンパイルされるので実行速度が上がります。
place=場所、holder=入れものです。
プレースホルダは、バインド変数とも呼ばれます。
接続とtry-with-resources構文
try(Connection conn =
DriverManager.getConnection(URL, USER, PASS)){
15行目のtryの後に続くかっこ()はリソースを自動でクローズします。try-with-resources構文と呼ばれます。Java7で導入されました。
Java リソースを自動でクローズ(try-with-resources文)
16行目は、DriverManagerクラスのgetConnectionメソッドで接続しています。変数の型はConnectionインターフェースです。
以下はOracleのJava8のConnectionインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Connection.html
コミットモードの設定
conn.setAutoCommit(false);
18行目は、setAutoCommitメソッドで引数はfalseです。手動コミットするようにしています。デフォルトは自動コミットモードです。自動コミットモードは、SQLを実行する毎にコミットされます。
パラメータ(値)のセット
try(PreparedStatement ps = conn.prepareStatement(SQL)){
ps.setString(1,"竹田");
ps.setString(2,"takeda");
20行目は、prepareStatementのインスタンスを生成しています。プリコンパイルされたSQL文を扱うオブジェクトです。引数に上記のSQLを指定しています。
Prepared=準備された、Statement=文です。
以下はOracleのJava8のPreparedStatementインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/PreparedStatement.html
21,22行目は、プレースホルダに値をセットしています。1つめの引数はプレースホルダの位置です。2つめの引数は値です。
SQLの実行とコミットとロールバック
ps.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
System.out.println("rollback");
throw e;
}
24行目は、executeUpdateメソッドでSQLを実行しています。
SQLの処理が成功した場合、25行目のCommitメソッドで確定されます。
ここでエラーがあった場合は、25行目は実行されず、26行目のcatchに処理が移動し27行目のrollbackメソッドでデータをロールバックします。例えばinsert文を2つ発行したとして一つは成功しもう一つは失敗した場合、2つともデータ更新はしません。
updateの場合
= "update employee set name = ? ,romaji = ? where id = ?";
updeteを行う場合は、13行目のSQL文を変更し、
21,22行目のパラメータの箇所で、nameとromajiとidをセットします。
deleteの場合
= "delete from employee where id = ?";
deleteを行う場合は、13行目のSQL文を変更し、
21,22行目のパラメータの箇所で、idのみをセットします。余分な行は削除します。
JDBCドライバを取得する
1.MySQLのJDBC ドライバを取得します。
以下のMySQLのサイトにアクセスします。
https://dev.mysql.com/downloads/connector/j/
2.Select Operating SystemでPlatform Independentを選択するとダウンロードボタンが表示されます。ZIP Archiveの「Download」ボタンを押します。
Connector/Jは、JDBC Driver for MySQLの別名です。
3.「No thanks,just start my download.」をクリックするとダウンロードが始まります。
4.ダウンロードしたzipを展開し以下のファイルを任意の場所に配置します。
mysql-connector-java-8.0.12.jar
JDBCドライバをクラスパス(ビルドパス)に追加する
mysql-connector-java-8.0.12.jarをクラスパスに追加します。
クラスパスに追加する手順は、以下を参照願います。
Eclipse jarファイルをクラスパスに設定する方法
接続先のデータベースとテーブルと文字コード
XAMPPのMySQLを使用しています。
XAMPPのインストール方法は以下を参照願います。
文字コードのメモ
MySQLのテーブルの文字コードはutf8mb4に設定しました。
Eclipseの文字コードをUTF8(※)に設定した場合、上記サンプルの日本語は文字化け無しで登録できました。
※Test1.javaの文字コードがUTF8になります。
Eclipseの文字コードをMS932(※)に設定した場合も上記サンプルの日本語は文字化け無しで登録できました。ドライバが変換している?
※Test1.javaの文字コードがsjisになります。
関連の記事
Java MySQLに接続してselectするサンプル
Java 大量データを登録/更新する(addBatch)
DaoとDtoとDBの関係をJavaコードで確認