ネットワークプログラミング論 平成 27 年 12 月 14 日 第11章.SQL によるデータベースの操作 【学習のねらい】 ① SQL を用いて、データベースの編集(挿入・変更・削除)や検索などを行う方法を学 習する。 ② Java アプリケーションから SQL を用いてデータベース編集・検索を行う方法を学習 する。 <先週の復習> 講義で示された【基礎課題 11-1】に解答して下さい。 11-1.SQL によるデータベースの基本操作 SQL(Structured Query Language)はリレーショナルデータベースの操作を行うため の言語の一種です。ここでは、SQL を使ってデータベースの作成や編集などの基本操作を 行う方法を学習します。 最初に次の MySQL サービスの起動確認を行ってから【基礎課題 11-2】を行ってくださ い。 <My SQL サービスの起動・停止> ① MySQL が Windows サービスとして起動しているかどうかを確認します。これが停止 していると MySQL を使用できないからです。 Windows7 の場合、「スタート」→「コンピュータ」メニューを右クリックし下のよう に「管理」を選択してください。 Windows8 の場合、画面左下隅を、マウスを右クリック してください。そこで現れる「管理メニュー」から右の ように「コンピュータの管理」を選択します。 ② 次の「コンピュータの管理」画面で「サービスとアプリケーション」を選択します。 153 ネットワークプログラミング論 平成 27 年 12 月 14 日 ③ 次の画面で「サービス」を選択します。 ④ すると、Windows サービスのリストが表示されるので、その中から「MySQL57」を 選択します。 ⑤ 次の画面で、 [開始]を選択します。すでに開始となっている場合はこの画面を閉じて 結構です。 なお、MySQL サービスを停止 する場合は、ここで[停止] を選択します。パソコンに余 計な負荷をかけないようにす るため、MySQL を使用しない 場合は、停止させておいた方 が良いです。 154 ネットワークプログラミング論 平成 27 年 12 月 14 日 【基礎課題 11-2】 データベースおよびテーブル(表)の作成 ① 【基礎課題 10-2】でやった要領で MySQL を起動してください。起動後、次のように 「create database SampleDB;」と入力して[Enter]キーを押してください(大 文字小文字の個別はありません)。 「create database データベース名;」の形で指定したデータベースを作成するこ とができます。 ② きちんと作成できたかどうかを確認するために、次のように「show databases;」 を入力し[Enter]キーを押してください。すると、今作成したデータベースがリス トに表示されているはずです。これから、このデータベース「sampleDB」の中にテー ブル(表)を作成します。 ③ 次に(これからの)操作対象となるデータベースを「sampledb」に指定します。 「use sampldb;」と入力して[Enter]キーを押してください。 ④ 続いて次のように入力してテーブル(表)を作成します。 改行しながら 1 行ずつ入力する。 155 ネットワークプログラミング論 平成 27 年 12 月 14 日 ※ もしタイプミスなどにより途中で誤って入力した場合は、 「¥c」を入力して[Enter] キーを押すと、入力が取り消されます。そこで、もう一度最初から入力をやり直 してください。 これにより次のような形のテーブル(の枠組み)が作成されます。 ID Name Money Integer(整数型) Varchar(100)(文字型:100 文字) Integer(整数型) 口座番号 主キー 氏名 預金額 ・・・ ・・・ ・・・ 主キーとは、レコード(表の 1 行分)を特定するためのキーで、これにより表の中で 重複するレコードがないようにします。 ⑤ 作成したテーブルを確認してみましょう。「show tables;」と入力して[Enter]キ ーを入力してください。すると次ページのように「account」が存在している事が分か ります。 ⑤の結果を確認できたら、 「 「sampledb」というデータベース内に「account」というテー ブルを作成しました。 」と記述して提出してください。 【基礎課題 11-3】 レコードの追加と全件検索 上で作成したテーブルはまだ空っぽの状態です。そこで、このテーブルにレコードを追 加しましょう。 ① 次のように「insert into account values(1,’伊達直人’,10000);」と入力 し、 [Enter]キーを押してください。 一般に「insert into テーブル名 values(列1の値,列2の値,・・・);」の形で、 指定したテーブルに、レコード(1行分のデータ)を入力することができます。上の 例では、「ID=1、Name=’伊達直人’、Money=10000」が1行目のデータとして入力さ れたことになります。 156 ネットワークプログラミング論 平成 27 年 12 月 14 日 ② 続いて次の通りレコードを追加してください (命令を 2 行分入力しています) 。これで、 3 レコード(3 行)になりました。 ③ ここで、テーブルのデータを確認しましょう。「select * from account;」と入 力し[Enter]キーを押してください。次のように表示されます。 一般に「select * from テーブル名;」の形で、当該テーブルの全レコードが取り 出され表示されます。 ③の表示を確認できたら、 「テーブル「account」に3つのレコードを追加しました。 」と 記述して提出してください。 【基礎課題 11-4】 部分検索(条件検索) 上の③では、テーブル内のレコードを全て取り出しましたが、今度は一部分、あるいは 条件を満たすものだけを抽出してみましょう。 ① 特定の列の値のみを取り出しましょう。次のように「select Name from account;」 と入力し[Enter]キーを押してください。すると Name 欄のみが表示されます。 157 ネットワークプログラミング論 平成 27 年 12 月 14 日 ② 今度は Name 欄と Money 欄を抽出しましょう。「 select Name,Money from account;」と入力し[Enter]キーを押してください。このように、select 文を使 えば指定した列を取り出すことができます。 ③ 今度は、ある条件を満たすレコードのみを取り出してみましょう。各結果を確認して ください。 <完全一致>「select * from account where Name=’鮎原こずえ’;」 <前方一致>「select * from account where Name like ’鮎原%’;」 「鮎原・・・」という名前のレコードを抽出。 158 ネットワークプログラミング論 平成 27 年 12 月 14 日 <後方一致>「select * from account where Name like ’%こずえ’;」 「・・・こずえ」という名前のレコードを抽出。 <部分一致>「select * from account where Name like ’%原%’;」 氏名に「原」と言う文字が含まれるレコードを抽出。 <大小の条件>「select * from account where Money>10000;」 預金額が 10000 円を超えるレコードを抽出。 上の検索結果を確認できたら、 「完全一致、前方一致、後方一致、部分一致、大小の条件 による検索結果を確認しました。 」と記述して提出してください。 【基礎課題 11-5】 データの更新 今度はテーブルの中のデータを更新してみましょう。 ① Money(預金額)を 1000 に変更します。「update account set Money=1000;」 と入力し、 [Enter]キーを押してください。 159 ネットワークプログラミング論 平成 27 年 12 月 14 日 一般に「update テーブル名 set 列 1=値 1, 列 2=値 2,・・・;」の形で、指定した 列の値を変更できます。 ② ここで「select * from account;」を入力して[Enter]キーを押すと次のよう に、Money 欄の変更を確認できます。 ③ 次に「ID=3」の人のみの預金額を変更してみましょう。「 update account set Money=2000 where ID=3;」と入力して[Enter]キーを押してください。 ④ 変更を確認してみましょう。「 select * from account;」と入力し[Enter]キ ーを押すと、次ページのように、ID=3(鮎原こずえ)の Money が 2000 に変わってい ることを確認できます。 上の結果を確認できたら、 「update 文を使って、テーブル内のデータを変更できることを 確認しました。 」と記述して提出してください。 160 ネットワークプログラミング論 平成 27 年 12 月 14 日 【基礎課題 11-6】 レコードの削除 最後に、レコードの削除の仕方を確認しましょう。 ① 「delete from account where Name=’鮎原こずえ’;」と入力して[Enter] キーを押してください。これにより、「鮎原こずえ」さんのレコードが削除されます。 ② その後、 「select * from account;」と入力し、 [Enter]キーを押してください。 すると、下のように「鮎原こずえ」さんのレコードが削除されていることを確認でき ます。 削除できたことを確認したら「delete 文により、レコードを削除できることを確認しま した。 」と記述して提出してください。 161 ネットワークプログラミング論 平成 27 年 12 月 14 日 11-2.Java プログラムからのデータベース操作 上で作成したデータベース「sampledb」内のテーブル「account」に対する(SQL を用 いた)操作を、Java アプリケーションから行いましょう。 ① 10-3 節で作成した DBManager.java を次のように修正してください。修正箇所は下線 部で示した通り、接続するデータベースを「sampledb」に変更した部分のみです。 <DBManager.java> package dbsample; import java.sql.Connection; import java.sql.DriverManager; public class DBManager { 10-1 節 で 指 定 し た public static Connection getConnection() { try{ MySQL のパスワード Class.forName("com.mysql.jdbc.Driver"); Connection con=DriverManager.getConnection( "jdbc:mysql://localhost/sampledb","root","*****" ); return con; 修正部分 } catch (Exception e) { throw new IllegalStateException(e); } } public static void main(String[] args) throws Exception { Connection con=getConnection(); System.out.println("con="+con); con.close(); } } ② パッケージ「dbsample」内に、新しいクラスをクラス 名「DBOperate.java」として作成してください。 162 ネットワークプログラミング論 平成 27 年 12 月 14 日 ③ 「DBOperate.java」を次のように作成してください。これは、テーブル「account」 内のデータをコンソール画面に表示するプログラムです。 <DBOperate.java> package dbsample; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DBOperate { public static void main(String[] args) throws Exception{ ① Connection con =DBManager.getConnection(); ② Statement smt=con.createStatement(); String sql; sql="select * from account"; ③ ResultSet rs= smt.executeQuery(sql); ④ while(rs.next()) { ⑤ System.out.println("ID="+rs.getInt("ID") +", 氏名="+rs.getString("Name") +", 貯蓄額="+rs.getInt("Money") ); } ⑥ smt.close(); con.close(); ※ ①などの番号部分に対する説明は、下の解説参照 } } ④ 作成したこのプログラムを実行してください。コンソール画面に次のように、テーブ ル「account」の全レコード(今の場合 2 件)が表示されます。 【解説】 ① この部分で、データベース「sampledb」に接続した Connection オブジェクトを取得 する。データベースの利用は、当該データベースに接続した Connection オブジェクト を得ることから始まる。 ② 当該 Connection オブジェクト (ここでは con)にある Statement オブジェクトを得る。 Statement オブジェクトは SQL 命令を発行する際に必要になる。 ③ Statement オブジェクト(ここでは smt)にある executeQuery(SQL 文)メソッドに 163 ネットワークプログラミング論 平成 27 年 12 月 14 日 より、「select」命令を発行することが可能になる。今の場合、「select * from account」という SQL 文を発行していることになる。 その SQL を(当該データベースに対して)発行した場合の結果が、ResultSet オブジ ェクトに格納される。今の場合 ResultSet オブジェクト「rs」には、 【基礎課題 11-6】 の②で表示させた結果が格納されていると思えば良い。 ④ while(rs.next()) { ・・・ } の形で、当該 ResultSet オブジェクト内のレコードの数だけ「・・・」部分の処理を行 う。つまり、next()メソッドが実行される毎に表を 1 行ずつ下って行く。 ID Name Money 1 伊達直人 1000 2 金田正太郎 1000 ResultSet オブジェ クト(rs)の中身 ⑤ レコード(行)毎に、各列の値を取得している。その値が整数型であれば getInt(“列 名”)、文字列型であれば、getString(“列名”)というように、型に合わせてメソッドを 用いるようになっている。 ⑥ Connection オブジェクトを閉じる前に、必ず Statement オブジェクトも閉じなければ ならない。 【基礎課題 11-7】 上の結果を確認できたら、 「Java アプリケーションからデータベース「sampledb」に接 続し、テーブル「account」内のデータを表示させることができました。」と記述して提出 してください。 【基礎課題 11-8】 データの追加 今度は、テーブルにレコードを追加しましょう。「DBOperatet.java」に次のように点線 枠内を追加してください。 164 ネットワークプログラミング論 平成 27 年 12 月 14 日 <DBOperate.java> package dbsample; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DBOperate { public static void main(String[] args) throws Exception{ Connection con =DBManager.getConnection(); Statement smt=con.createStatement(); String sql; sql="insert into account values(3,'早川みどり',3000)"; smt.executeUpdate(sql); sql="select * from account"; ResultSet rs= smt.executeQuery(sql); while(rs.next()) { System.out.println("ID="+rs.getInt("ID") +", 氏名="+rs.getString("Name") +", 貯蓄額="+rs.getInt("Money") ); } smt.close(); con.close(); } } 【解説】 smt.executeUpdate(sql); データベースを更新する命令(insert,update,delete など)を含む SQL を発行する場合、 executeUpdate()メソッドを用います。 作成したら実行してください。今度は次のようにコンソールに表示されるはずです。 上の実行結果を確かめたら、 「Java アプリケーションからレコードを追加することができ ました。 」と記述して提出してください。 165 ネットワークプログラミング論 平成 27 年 12 月 14 日 【基礎課題 11-9】 レコードの修正 今度は、レコードを修正してみましょう。具体的には、結果表示が次のようになるよう に、3 番目のレコードを修正しましょう。 「DBOperate.java」を次のように修正してください。修正箇所は下線部で示した SQL 文の定義部分です。 <DBOperate.java> package dbsample; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DBOperate { public static void main(String[] args) throws Exception{ Connection con =DBManager.getConnection(); Statement smt=con.createStatement(); String sql; sql="update account set Name='金田一耕助', Money=5000 where ID=3"; smt.executeUpdate(sql); sql="select * from account"; ResultSet rs= smt.executeQuery(sql); while(rs.next()) { System.out.println("ID="+rs.getInt("ID") +", 氏名="+rs.getString("Name") +", 貯蓄額="+rs.getInt("Money") ); } smt.close(); con.close(); } } 作成し結果を確認したら、 「Java アプリケーションから、レコードを修正することができま した。 」と記述して提出してください。 166 ネットワークプログラミング論 平成 27 年 12 月 14 日 【応用課題 11-A】 テーブルに、上の【基礎課題 11-9】で示したような 3 名のレコードが格納されている状 態で、DBOperate.java を修正して実行すると次のような結果が表示されました。 このとき、空欄にはどのような SQL が入りますか?それを記述して提出してください。 package dbsample; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DBOperate { public static void main(String[] args) throws Exception{ Connection con =DBManager.getConnection(); Statement smt=con.createStatement(); String sql; sql=" "; ResultSet rs= smt.executeQuery(sql); while(rs.next()) { System.out.println("ID="+rs.getInt("ID") +", 氏名="+rs.getString("Name") +", 貯蓄額="+rs.getInt("Money") ); } smt.close(); con.close(); } } 167
© Copyright 2024 ExpyDoc