この記事では、JDBC の基本的な知識とスキルを例とともに説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
1.JDBCとは何ですか?
平たく言えば、JDBC テクノロジは Java プログラムを使用して SQL ステートメントをデータベースに送信し、データベースは SQL ステートメントを受信した後に実行し、結果を管理のために Java プログラムに返します。
2. JDBC を使用するための条件は何ですか?
A) ターゲットデータベースホストのアドレス
B) ホスト上のデータベース ソフトウェアが占有するポート番号
C) データベースへのログインに使用するユーザー名
D) そのユーザー名のパスワード
E) データベースに接続する
3.JDBCテクノロジーの原理
データベースにはさまざまな種類があり、メーカーごとにデータベースの規格や仕様が異なることがわかっています。現時点で、JAVA コードを使用して SQL ステートメントを送信する場合、さまざまなデータベースに応じて一連のセットを作成する必要があります。一連のオペレーションコードはプログラム開発者にとって莫大な開発コストとなるため、SU N 社が JDBC テクノロジを開発したとき、データベース メーカーは、この一連のインターフェイスを実装するためのドライバーを提供する必要があり、プログラム開発者は開発中にデータベースのドライバーを使用する必要があります。開発するには、さまざまなデータベースに適応するためのコードのセットを作成する必要はありません。
4. JDBC のコア API
|- ドライバー: ドライバー クラスによって実装されるインターフェイス。
|-Connection connect(String url, Properties info) -- データベースに接続し、接続オブジェクトを取得するために使用されます。
プロパティで設定する必要があるパラメータ:
url: データベース接続の URL 文字列。プロトコル+データベース サブプロトコル+ホスト+ポート+データベース
ユーザー: データベースのユーザー名
パスワード: ユーザーのパスワード
|-Connection: データベースに接続するためのインターフェイス
|- Statement createStatement() -- SQL ステートメントを送信するための Statement オブジェクトを作成します。
|- PreparedStatement prepareStatement(String sql) - プリコンパイルされた SQL ステートメントを送信するための PreparedStatement オブジェクトを作成します
|-CallableStatement prepareCall(String sql) -- ストアド プロシージャを呼び出すための CallableStatement オブジェクトを作成します。
|-Statement: 静的 SQL ステートメントを実行するために使用されます。
|-intexecuteUpdate(String sql) -- 更新操作を実行します (DDL+DML)
|-ResultSetexecuteQuery(String sql) -- クエリ操作 (DQL) を実行します。
|- PreparedStatement: プリコンパイルされた SQL ステートメントを実行するために使用されます。
|- intexecuteUpdate() -- 更新操作を実行します
|- ResultSetexecuteQuery() -- クエリ操作を実行します。
|- CallableStatement: ストアド プロシージャの実行に使用される SQL
|- ResultSetexecuteQuery() -- ストアド プロシージャを呼び出します。
|- ResultSet: 結果セット。データベースのクエリ データをカプセル化するために使用されます
|- boolean next() -- レコード カーソルを次の行に移動します。
|- Object getObject(int columnIndex) -- フィールドの値を取得します。
APIを理解したら、JDBCを使ってSQL文を送信してみましょう~
5. Statement オブジェクトを使用してデータベースを操作する
DDL および DML 操作
ステップ1
パッケージをインポートします。MySQL データベースを使用しているため、JDBC テクノロジを使用するには、MySQL データベースの製造元が提供するデータベース ドライバーを使用する必要があります。そのため、最初のステップは、データベース ドライバー パッケージをプロジェクトにインポートすることです。
使用されるパッケージ名: mysql-connector-java-5.1.7-bin.jar
ステップ2
通常のクラスを作成し、その中にメソッドを追加し、次のようにメソッド内のコードをコピーします。 //URL
プライベート文字列 URL = "jdbc:mysql://localhost:3306/vmaxtam";
//ユーザー
プライベート文字列ユーザー = "ルート";
//パスワード
プライベート文字列パスワード = "root";
public void testDDL()throws 例外{
//1.ドライバーの登録
Class.forName("com.mysql.jdbc.Driver");
//2.接続を取得します。
接続 conn = DriverManager.getConnection(url, ユーザー, パスワード);
//3. Statement オブジェクトを作成します。
ステートメント stmt = conn.createStatement();
//4.SQL文を準備します。
文字列 sql = "CREATE TABLE Student(sid INT PRIMARY KEY,sname VARCHAR(20),age INT)";
//5. ステートメント オブジェクトを通じて SQL ステートメントを送信し、実行結果を返します。
int カウント = stmt.executeUpdate(sql);
//6.実行結果を出力する
System.out.println("影響を受ける "+count+" レコード");
}
//7. リソースを閉じる
if(ステートメント!=null)
{
ステートメント.close();
}
if(conn!=null)
{
conn.close();
}
DQL および DDL 操作を実行する場合は、SQL ステートメントを作成し、そのステートメントの executlUpdate メソッドを呼び出してデータベースに対して SQL ステートメントを実行します。このメソッドは、データベース内の影響を受ける行数を示す整数値を返します。
上記のプログラムを変更せずに再度データベースにSQL文を発行したい場合は、再度接続するプログラムを書かなければならず、操作後に文オブジェクトと接続オブジェクトを閉じる必要があり、非常に面倒です。 。そのため、接続処理とオブジェクトの解放処理をツールクラスに抽出するのが一般的です。ツールクラスのコードは次のとおりです。
次のようにコードをコピーします。 public class sqlUtil {
private static String url = "jdbc:mysql://localhost:3306/vmaxtam";
プライベート静的文字列ユーザー = "ルート";
プライベート静的文字列パスワード = "root";
// 接続を取得する
パブリック静的接続 getconnection() {
接続 conn = null;
試す {
// 1. ドライバーを登録します
Class.forName("com.mysql.jdbc.Driver");
// 2. 接続を取得します
conn = DriverManager.getConnection(url, ユーザー, パスワード);
// 3. ステートメントオブジェクトを取得します
ステートメント ステートメント = conn.createStatement();
} catch (例外 e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
コンを返します。
}
// 7. リソースを閉じる
public static void close(ステートメントステートメント、Connection接続) {
{
試す {
if (ステートメント != null)
ステートメント.close();
if (接続 != null) {
connection.close();
}
} キャッチ (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
考慮すべき点は次のとおりです。
1) ユーザーはドライバーを 1 回登録するだけで済みます。データベースに接続するたびにドライバーを登録する必要はないため、ドライバーを登録するプロセスを静的コード ブロックに記述します。
2) URL、ユーザー名、パスワード、ドライバー クラス名はプログラム内でハードコーディングされており、コードを変更せずにデータベースまたはユーザーを変更できるようにするために、通常はこの情報を構成ファイルに書き込みます。
構成ファイルはプロジェクトの src ディレクトリに書き込まれ、db.properties という名前が付けられます。
次のようにコードをコピーします: url=jdbc:mysql://localhost:3306/vmaxtam
ユーザー=ルート
パスワード=root
driverClass=com.mysql.jdbc.Drive
次に、sqlUtil で構成ファイルを読み取り、最後に次のコードに最適化します。 public class sqlUtil {
プライベート静的文字列 URL = null;
プライベート静的文字列ユーザー = null;
プライベート静的文字列パスワード = null;
プライベート静的文字列 driverClass = null;
静的{
試す {
//1.バイトコードオブジェクトを取得します。
クラスクラズ = sqlUtil.class;
//2. getResourceAsStream を呼び出してパスを取得します。
入力ストリーム inputStream = clazz.getResourceAsStream("/db.properties");
プロパティ pro = new Properties();
pro.load(inputStream);
//3.パラメータを読み込む
url=pro.getProperty("url");
パスワード=pro.getProperty("パスワード");
user=pro.getProperty("ユーザー");
driverClass=pro.getProperty("driverClass");
Class.forName(ドライバークラス);
} catch (例外 e) {
e.printStackTrace();
System.out.println("登録に失敗しました!" + e.getMessage());
新しい RuntimeException(e) をスローします。
}
}
// 接続を取得する
パブリック静的接続 getconnection() {
接続 conn = null;
試す {
// 接続を取得する
conn = DriverManager.getConnection(url, ユーザー, パスワード);
// ステートメントオブジェクトを取得
ステートメント ステートメント = conn.createStatement();
} catch (例外 e) {
e.printStackTrace();
}
コンを返します。
}
// リソースを閉じる
public static void close(Statement ステートメント、Connection 接続) {
{
試す {
if (ステートメント != null)
ステートメント.close();
if (接続 != null) {
connection.close();
}
} キャッチ (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
DQL操作
では、JDBC を使用してデータベース内のデータをクエリするにはどうすればよいでしょうか?
次のようにコードをコピーします: @Test
public void testdsl() は例外をスローします {
//接続を取得する
cnn2=sqlUtil.getconnection();
ステートメント ステートメント = cnn2.createStatement();
//SQL文の準備
文字列 sql = "件名から * を選択";
//executeQuery を呼び出してクエリ ステートメントを実行します
ResultSet res = ステートメント.executeQuery(sql);
//クエリが完了した後、res はテーブル ヘッダーを指します。データを取得したい場合は、クエリ結果の次の行を指し続ける必要があります。次の行のデータがない場合は 0 が返されます。
while(res.next())
{
//クエリ結果のフィールド「sjid」の値を取得し、型が明確であることを確認します
int id = res.getInt("sjid");
//クエリ結果のフィールド「sjname」の値を取得します。タイプは明確である必要があります
文字列名 = res.getString("sjname");
System.out.println("ID:" + id + "NAME:" + 名前);
}
sqlUtil.close(ステートメント, cnn2);
}
以上がStatementオブジェクトを使ってデータベースを操作する方法です~
6. PreparedStatementを使用してデータベースを操作する
PreparedStatement オブジェクトは、実際には SQL ステートメントをプリコンパイルできる特別な Statement オブジェクトです。パラメーターを設定すると、SQL ステートメントを実行できます。
DDL および DML 操作のコピー コードは次のとおりです。
java.sql.Connectionをインポートします。
インポートjava.sql.PreparedStatement;
org.junit.Test をインポートします。
パブリック クラス PreparedStatementTest {
接続接続 = null;
@テスト
public void ddldmlTest() が例外をスローする {
// 1. 接続を取得します
接続 = sqlUtil.getconnection();
// 2. SQL ステートメント、プリコンパイル済みステートメント、パラメーターを準備しますか?数字のプレースホルダー
文字列 sql = "サブジェクト値に挿入(?,?)";
// 3. オブジェクトを取得する
PreparedStatement 準備されたステートメント = connection.prepareStatement(sql);
/*
* 4. SQL パラメータを設定するには、パラメータ番号とその型を知る必要があります。以下の最初の文は、SQL ステートメントの最初のパラメータが int 型で、パラメータ値が 3 に設定されていることを示しています。の上。
*/
準備済みステートメント.setInt(1, 3);
prepareStatement.setString(2, "英語");
// 5. SQL を実行するためにデータベースに渡します
int num = prepareStatement.executeUpdate();
System.out.println("影響を受けるレコードがあります" + num + "レコードがあります");
sqlUtil.close(preparedStatement, connection);
}
}
上記は、PreparedStatement オブジェクトを使用して挿入ステートメントを送信することです。同様に、DDL ステートメントと DML ステートメントをこの方法で送信できます。
PreparedStatement プリコンパイルの利点:
PreparedStatement のプリコンパイルを使用すると、データベース側でさまざまなパラメーターを設定することによってさまざまなターゲットをクエリできます。プリコンパイルされたステートメントのみが保存されますが、Statement を使用してステートメントを送信すると、ステートメントが送信されるたびに 1 つが保存されます。データベース。大量のメモリを消費する可能性があります。
DQL 操作のコピー コード コードは次のとおりです: @Test
public void dqlTest() が例外をスローする {
// 1. 接続を取得します
接続 = sqlUtil.getconnection();
// 2. SQL ステートメント、プリコンパイル済みステートメント、パラメーターを準備しますか?数字のプレースホルダー
String sql = "sjid=? または sjname=? の件名から * を選択";
// 3. オブジェクトを取得する
PreparedStatement 準備されたステートメント = connection.prepareStatement(sql);
/*
* 4. SQL パラメータを設定するには、パラメータ番号とその型を知る必要があります。以下の最初の文は、SQL ステートメントの最初のパラメータが int 型で、パラメータ値が 3 に設定されていることを示しています。の上。
*/
準備されたステートメント.setInt(1, 2);
prepareStatement.setString(2, "中国語");
// 5. SQL を実行するためにデータベースに渡します
ResultSet rst = prepareStatement.executeQuery();
//6.結果セットを反復処理する
while(rst.next())
{
int id = rst.getInt("sjid");
文字列名 = rst.getString("sjname");
System.out.println("ID:" + id + "NAME:" + 名前);
}
//7. 接続を閉じます。
sqlUtil.close(preparedStatement, connection);
}
また、executeQuery() メソッドを呼び出して、結果セットを取得した後に出力を繰り返すこともできます。
StatementとPreparedStatementは非常に似ているので、メリットとデメリットを比較してみましょう~
Statement と PreparedStatement の違い:
1. 文法が異なる
ステートメントは静的コンパイルのみをサポートしており、SQL ステートメントはハードコーディングされています。
PreparedStatement はプリコンパイルをサポートしています。使用しますか?来て席に座ってください。
2. 効率の違い
ステートメントは毎回 SQL ステートメントを送信し、キャッシュをサポートしていないため、実行効率が低くなります。
PreparedStatement はプリコンパイルをサポートしており、パラメータを送信するだけでデータベースにキャッシュされるため、実行効率が高速です。
3. 異なるセキュリティ
ステートメントは簡単に挿入されます。
インジェクション: 巧妙な要素は、データベースを侵害する特別な SQL ステートメントを作成する可能性があります。
例: 特定のユーザーの情報を照会する場合
一般的な状況: SELECT * FROM user_list where username=xxx、password=xxx (ここの xxx にはユーザー自身のユーザー名とパスワードを入力する必要があります)
挿入状況: SELECT * FROM user_list where username='abc' または 1=1 --password=xxx;
このように、1=1が等しいことになり、パスワードの前に「--」記号が追加され、以下の内容はコメントとなり実行されなくなります。つまり、パスワードなしですべてのユーザー情報を照会できます。
PreparedStatement は SQL ステートメント内でパラメータを指定するため、インジェクションを防ぐことができます。
結論: より高速で安全な PreparedStatement を使用することをお勧めします。
7. CallableStatement を使用してストアド プロシージャを実行する
CallableStatement を使用すると、ストアド プロシージャが実行されるだけです。ストアド プロシージャを作成するには、データベース内にストアド プロシージャを作成する必要があります。
ステップ1
これで、データベースにストアド プロシージャが作成されました。
次のようにコード code をコピーします: DELIMITER $
CREATE PROCEDURE pro_add(IN a INT , IN b VARCHAR(20),OUT c INT)
始める
SELECT * FROM SUBJECT WHERE sjid=a OR sjname=b;
SET c=a+a+a+a;
終了 $
ステップ2
Java コードを使用して実行し、出力パラメーターを取得します。次のようにコードをコピーします。
public void CalaST() が例外をスローする {
//接続を取得する
接続= sqlUtil.getconnection();
//SQL文の準備
文字列 sql = "CALL pro_add(?,?,?)";
// callableStatement オブジェクトを取得する
CallableStatement cbs = connection.prepareCall(sql);
//preparedStatement と同様に入力パラメータを設定します
cbs.setInt(1, 3);
cbs.setString(2, "数学");
/*では、出力パラメータを設定するにはどうすればよいでしょうか?
※出力パラメータの登録が必要です!
*/
cbs.registerOutParameter(3, java.sql.Types.INTEGER);//パラメータの型を設定するには組み込みオブジェクトを使用する必要があります
//SQL文を実行する
cbs.executeQuery();
// getXXX メソッドを使用して、対応する位置の出力パラメータを取得します
整数 num= cbs.getInt(3);
System.out.println("a*4 は " + num);
// リソースを閉じる
sqlUtil.close(cbs, 接続);
}
この記事が皆さんの Java プログラミングに役立つことを願っています。