ホームページ >Java >&#&チュートリアル >JDBCとは何かを詳しく解説JDBCはどのように使用されますか?
この記事では、JDBC とは何かについて詳しく説明します。 JDBCはどのように使用されますか? 。困っている友人は参考にしていただければ幸いです。
JDBC とは
JDBC (Java Database Connectivity)、つまり Java データベース接続は、SQL ステートメントを実行するために使用される Java API です。 、複数のリレーショナル データベースへの同じアクセスを提供できます。これは、Java 言語で記述された一連のクラスとインターフェイスで構成されます。 JDBC は、より高度なツールやインターフェイスを構築できるベースラインを提供し、データベース開発者がデータベース アプリケーションを作成できるようにします。全体として、JDBC は次の 3 つのことを行います。
#データベースを操作するためのステートメントを送信します
#処理結果
次のコードは、次のコードを示します。 JDBC を悪用する方法は、データベースの要件を満たすいくつかのデータをクエリします。使用されるデータベースは MySql です。 1. データベースとテーブルを作成します。私の習慣は、SQL ステートメントを保存する .sql ファイルを作成することです。 MySQL接続。コードにハードコーディングするのではなく、なぜ .properties を作成するのでしょうか? これは Java 設計パターンの分類ではないため、詳細には触れません:
設計の観点から、コンテンツを記述します。構成内 コードcreate database school; use school; create table student ( studentId int primary key auto_increment not null, studentName varchar(10) not null, studentAge int, studentPhone varchar(15) ) insert into student values(null,'Betty', '20', '00000000'); insert into student values(null,'Jerry', '18', '11111111'); insert into student values(null,'Betty', '21', '22222222'); insert into student values(null,'Steve', '27', '33333333'); insert into student values(null,'James', '22', '44444444'); commit;3. テーブル フィールドに基づいてエンティティ クラスを作成します。
mysqlpackage=com.mysql.jdbc.Driver mysqlurl=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8 mysqlname=root mysqlpassword=root4. 外部データベース接続を提供するための DBConnection クラスを作成します。ここでは MySql を使用するため、mysqlConnection は 1 つだけです。Oracle も使用する場合は、もちろん、oracleConnection を外部から提供できます。これらの接続をグローバルにする場合にスレッドの安全性に問題があるのではないかと疑問に思う人もいるかもしれません。これは良い質問です。これは、PreparedStatement を接続から読み取るだけで、変更せずに読み取るだけなので、スレッド セーフティの問題は発生しません。さらに、Connection を静的に設定すると、メモリ内に Connection のコピーが 1 つだけ存在し、多くのリソースを占有しなくなります。使用するたびに close() メソッドを呼び出して閉じなくても問題ありません。
public class Student { private int studentId; private String studentName; private int studentAge; private String studentPhone; public Student(int studentId, String studentName, int studentAge, String studentPhone) { this.studentId = studentId; this.studentName = studentName; this.studentAge = studentAge; this.studentPhone = studentPhone; } public int getStudentId() { return studentId; } public String getStudentName() { return studentName; } public int getStudentAge() { return studentAge; } public String getStudentPhone() { return studentPhone; } public String toString() { return "studentId = " + studentId + ", studentName = " + studentName + ", studentAge = " + studentAge + ", studentPhone = " + studentPhone; } }5. データベースと対話するためのさまざまなメソッドを記述するツール クラスを作成します。この種のツール クラスはシングルトンにするのが最善です。そうすることで、毎回新しいものを作成する必要がなく (実際、新しいことの利点がわかりません)、リソースを節約できます
public class DBConnection { private static Properties properties = new Properties(); static { /** 要从CLASSPATH下取.properties文件,因此要加"/" */ InputStream is = DBConnection.class.getResourceAsStream("/db.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } } /** 这个mysqlConnection只是为了用来从里面读一个PreparedStatement,不会往里面写数据,因此没有线程安全问题,可以作为一个全局变量 */ public static Connection mysqlConnection = getConnection(); public static Connection getConnection() { Connection con = null; try { Class.forName((String)properties.getProperty("mysqlpackage")); con = DriverManager.getConnection((String)properties.getProperty("mysqlurl"), (String)properties.getProperty("mysqlname"), (String)properties.getProperty("mysqlpassword")); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } }6. 関数
package com.xrq.test11; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class StudentManager { private static StudentManager instance = new StudentManager(); private StudentManager() { } public static StudentManager getInstance() { return instance; } public List<Student> querySomeStudents(String studentName) throws Exception { List<Student> studentList = new ArrayList<Student>(); Connection connection = DBConnection.mysqlConnection; PreparedStatement ps = connection.prepareStatement("select * from student where studentName = ?"); ps.setString(1, studentName); ResultSet rs = ps.executeQuery(); Student student = null; while (rs.next()) { student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4)); studentList.add(student); } ps.close(); rs.close(); return studentList; } }7 のメイン呼び出しを作成します。実行結果を確認します。Success
List<Student> studentList = StudentManager.getInstance().querySomeStudents("Betty"); for (Student student : studentList) { System.out.println(student); }プレースホルダーを使用する理由。 "?" ポイント 5 を見てください。SQL ステートメントを記述するときに "?" プレースホルダーが使用されていることにお気づきでしょう。もちろん、コードを美しくするための要素もあります。プレースホルダは使用しないでください。結合パラメータには「 」を記述してください。結合するパラメータが多すぎると、コードの見栄えが悪く、可読性も低くなります。ただし、この理由に加えて、セキュリティ上の問題を回避するための
という別の重要な理由もあります。 SQL ステートメントを記述するためにプレースホルダーを使用しないと仮定すると、「querySomeStudents(String name) throws Exception」メソッドは次のように記述する必要があります。
studentId = 1, studentName = Betty, studentAge = 20, studentPhone = 00000000 studentId = 3, studentName = Betty, studentAge = 21, studentPhone = 22222222
上記の main 関数でも 2 つのデータを取得できますが、ここで問題が発生します。次のように呼び出したらどうでしょうか:
public List<Student> querySomeStudents(String studentName) throws Exception { List<Student> studentList = new ArrayList<Student>(); Connection connection = DBConnection.mysqlConnection; PreparedStatement ps = connection.prepareStatement("select * from student where studentName = '" + studentName + "'"); ResultSet rs = ps.executeQuery(); Student student = null; while (rs.next()) { student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4)); studentList.add(student); } ps.close(); rs.close(); return studentList; }
実行結果を見てください:
public static void main(String[] args) throws Exception { List<Student> studentList = new ArrayList<Student>(); studentList = StudentManager.getInstance().querySomeStudents("' or '1' = '1"); for (Student student : studentList) System.out.println(student); }
なぜですか?スプライシング後の SQL ステートメントを見ると、次のことがわかります。
studentId = 1, studentName = Betty, studentAge = 20, studentPhone = 00000000 studentId = 2, studentName = Jerry, studentAge = 18, studentPhone = 11111111 studentId = 3, studentName = Betty, studentAge = 21, studentPhone = 22222222 studentId = 4, studentName = Steve, studentAge = 27, studentPhone = 33333333 studentId = 5, studentName = James, studentAge = 22, studentPhone = 44444444
'1'='1' は常に true であるため、前のクエリ条件は役に立ちません。この種の問題には応用シナリオがあり、ただ漫然と書かれているわけではありません。 WebではJavaが使われることが多くなってきており、Webなのでクエリを行う際にユーザーが条件を入力し、バックグラウンドでクエリ条件を取得し、SQL文を繋ぎ合わせてクエリを実行する場面があります。経験豊富なユーザーは「' 」または「1' = '1」を入力して、ライブラリ内のすべてのデータを取得できます。
Statement と PreparedStatement の関係と違い。
関係: PreparedStatement の継承ステートメント、両方のインターフェイス
違い: PreparedStatement はプレースホルダーを使用でき、プリコンパイルされており、バッチ処理はステートメントより効率的ですJDBC ############取引############### トランザクションとは: トランザクションは、一連のデータベース操作 に対する一連の操作 です。一連の処理ステップがすべて実行されるか、まったく実行されない場合、再編成プロセスをトランザクションと呼びます。 トランザクションの基本特性: 原子性、一貫性、分離性、耐久性。 アトミック性: アトミック性とは、トランザクションが分割できない作業単位であり、トランザクション内のすべての操作が発生するか、まったく発生しないことを意味します。 一貫性: 一貫性とは、トランザクションの開始前およびトランザクションの終了後にデータベースの整合性制約に違反しないことを意味します。これは、データベース トランザクションがリレーショナル データの整合性やビジネス ロジックの一貫性を破壊できないことを意味します。 A が B に送金した場合、送金取引操作が成功したかどうかに関係なく、両者の預金総額は変わりません。 分離: 複数のトランザクションが同時にアクセスする場合、トランザクションは分離され、1 つのトランザクションが他のトランザクションの実行影響に影響を与えることはありません。 同時環境では、 異なるトランザクションが同じデータ を同時に操作する場合、各トランザクションは 独自の完全なデータ空間 # を持ちます。 ####。同時トランザクションによって行われた変更は、他の同時トランザクションによって行われた変更から分離する必要があります。トランザクションがデータ更新を表示する場合、データの状態は、別のトランザクションがデータを変更する前の状態、または別のトランザクションがデータを変更した後の状態のいずれかになります。トランザクションは、中間状態のデータを表示しません##。 #。 トランザクションにおける最も複雑な問題は、トランザクションの分離によって引き起こされます。完全な分離は非現実的です。完全な分離では、データベースは一度に 1 つのトランザクションのみを実行する必要があるため、パフォーマンスに重大な影響を与えます。 は、トランザクションが完了した後、トランザクションによってデータベースに加えられた変更がデータベース内に保持され、ロールロールが呼び戻されないことを意味します。 。 要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、Java ビデオ チュートリアル
以上がJDBCとは何かを詳しく解説JDBCはどのように使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。