Javaのインタビュー4.11 Javaデータベース操作 - Javaプログラマ書かれたインタビュー集

JDBC経由でデータベースにアクセスする方法4.11.1

データベース操作を実装するために使用するJavaデータベース接続(Javaデータベース接続性、JDBC)は、アクセスにさまざまなデータベースをSQL文、メソッドの実行を提供するJavaプログラムで機能、および異なるデータベースの様々な、Javaのための統一されたユーザー・インターフェースを提供します。 SQLパッケージには、すべてのJDBCデータベースの操作が含まれています。一般がアクセスするJDBCデータベースには、以下のステップがあります。

1)JDBCドライバをロードします。JDBCドライバデータベースは、通常はWEB-INF / libににコピーされたターゲット・データベース製品のJDBCドライバを作り、JavaEEのウェブアプリケーション開発プロセスに基づいて、クラスパスにロードされます。

2)JDBCドライバをロードし、そしてにDriverManagerに登録。通常の反射にClass.forName(文字列DRIVENAME)。

3)データベース接続を確立し、接続オブジェクトを取得します。典型的には、URL文字列は、データベースへの接続を表すたDriverManager.getConnection(URL、ユーザ名、passwdの)実行される方法により、ユーザ名、ユーザ名のデータベース接続は、データベース接続コードがpasswdのを表します。

PreparedStatementのステートメントオブジェクトまたはオブジェクトの4)設立。

5)SQL文を実行します。

6)結果セットResultSetオブジェクトにアクセスします。

7)Connectionオブジェクトがクローズされ、PreparedStatementの、ResultSetの、ステートメントを回し、)例えばrs.closeとして解放されたリソースを、(占有、(con.close)など。なぜ我々はそれを行う必要がありますか?その理由は、それが最も頻繁に底のネットワークIOを介して送信JDBCドライバのSQLコマンドやデータを達成しています。

Javaデータベース・アクセス機能パッケージを提供するために、3)が(です。

A.java.sql B.java.awt C.java.lang D.java.swing

答え:A. java.sqlパッケージのすべてのクラスのデータベース操作。


どのような方法4.11.2 JDBCトランザクション処理

トランザクションは、トランザクション内のすべての操作が正しく完成実行された場合にのみからなるデータベース操作に対して1つ以上のSQL文からワークの不可分単位であり、全体のトランザクションがデータベースに提出されます。JDBCは、典型的には、トランザクションのコミット()メソッドまたはrollback()オペレーションの方法を最後まで。トランザクションの完了を示すためにコミット()メソッドが送信され、トランザクションの完了を示すのROLLBACK()メソッドは、ロールバックされ、そしてより多くの異常が、トランザクションの処理中に発生した場合のために、これらの2つの方法は、のjava.sql.Connectionクラスです。操作が成功した後、一般的には、デフォルトのアクションは自動的にトランザクションを提出することで、すなわち、システムが自動的にそれ以外の場合は、ロールバック()メソッドを呼び出し、commit()メソッドを呼び出します。

もちろんJDBC、だけでなく、にsetAutoCommit(false)を呼び出すことによって無効にすることができる方法を自動的に提出し、その後、あなたがトランザクションとして、複数のデータベース操作の表現を置くことができ、操作が完了した後、コールが(コミット)全体の提出を達成するための方法、1つが表現操作は失敗し、それがcommit()メソッドを呼び出すことなく、例外がスローされます。このケースでは、ロールバックのコードブロックの異常撮影したトランザクションでロールバック()メソッドを呼び出すことができます。データベース上の複数の操作は、この方法によって維持することができた後に、データは一貫したままです。

拡張:JDBCどのようなトランザクション分離レベルは?

しばしば互いに分離開くためにロックとの間の取引に、関連する問題「複数のスレッドが同じデータを要求」解決するために。今日では、ほとんどの主要なデータベースはロックの種類をサポートしています。したがって、JDBC APIは、Connectionオブジェクトによって割り当てられるか決定されるトランザクションの種類をサポートします。JDBCでは、我々は、トランザクション分離レベルの次の5つの種類を定義します。

1)TRANSACTION_NONE JDB。これは、トランザクションをサポートしていません。

2)TRANSACTION_READ_UNCOMMITTED。コミットされていないお読みください。説明Aトランザクションが提出する前に、別のトランザクションの変化を見ることができます。このような読み取り「汚い」データ、反復不能読み取りとファントム読み取りは許可されています。

3)TRANSACTION_READ_COMMITTED。コミット読みます。説明データが許可されていませんコミットされていないお読みください。このレベルはまだ非反復読み取りとファントムが生成さ読み取ることができます。

4)TRANSACTION_REPEATABLE_READ。反復可能読み取り。説明情勢は、同じデータが失敗せずに再び読み込むことができるようにしますが、ファントムはまだ発生し読み込みます。

5)TRANSACTION_SERIALIZABLE。Serializableを。非反復可能読み取りとファントム読み取り、防止は「汚い」データを読むことを最高のトランザクション・レベルです。

(注:.①取引データに「ダーティ」データを読み込むには、クエリに、トランザクションAトランザクションBはまだ読んだときに更新され、トランザクションAとBのトランザクションを同時に実行する場合、例えば、別のトランザクションがまだ提出していない読み込まれていますデータは、この時間は、ロールバック取引、取引データBは無効リード「ダーティ」データである.②非反復読み出す。つの異なるデータを読み取るために別のトランザクションの操作の前と後のトランザクションの原因、例えば、データクエリを読み込むときに、トランザクションAとBが同時にトランザクション、トランザクションBを実行する際に、更新トランザクションは、トランザクションBは、トランザクションBが再びデータを読み出すために前とデータが同じではありませんした後、その倍を発見し、データを照会するために変更されます。 ③二回別のトランザクションのクエリの結果の前と後に、異なる量のデータが得られたトランザクション内のダミー読み出し動作を、例えば、ときに、トランザクションのトランザクション・B同時に、データのクエリのトランザクションBを読み取る際に、トランザクションaを追加または削除トランザクションB、ケース内を満たすレコードトランザクションのクエリ、再びクエリは、前のレコードを検索するクエリが存在しない、または以前の記録は消えていました。)

以上に費やされたエネルギーの衝突を避けるために、トランザクション分離レベルが高いです。分離レベルは、現在のトランザクションconn.getTransactionIsolation()メソッドのレベルによって決定された接続オブジェクトのconn.setTransactionLevel()メソッドによって設定することができます。


4.11.3にClass.forNameの役割は何ですか

Java言語では、唯一の任意のクラスを実行するJVMにロードされます。クラスの効果にClass.forName()メソッドは、JVMにロードされ、それがクラスオブジェクトクラスまたはインタフェースクラスの指定された文字列名に関連付けられてロードされ、JVM返され、JVMは、同じ時間を実行します静的コードセグメントクラス。

通常、JDBCドライバをロードするClass.forNameの(「はcom.mysql.jdbc.Driver」)メソッドを呼び出して、データベースへのJDBC接続を使用する前に、このアプローチするかどうかを特定のコールする必要がありますか?もしそうなら、なぜこのアプローチを呼びますか?実際には、この方法は、例えば、呼び出す必要はありません、テストさt =(テスト)Class.forNameの(「テスト」)。NewInstanceメソッド()文とテストトン=新しいテスト()ステートメントは、同じ効果を持つことになり、新規の使用ので、それはすることができますが、2つの違いは非常に明確である:さまざまな方法でオブジェクトを作成します。前者の用途のクラスローディング機構は、新しいクラスを作成します。第一の方法のソフトウェアの拡張性を増加させる傾向がある、例えば、ソフトウェアの後に開発プロジェクトは、各企業のプロセスフローを使用する企業の数になりますが、実質的に同じ、唯一の個々の企業のビジネス・ロジックは、開発プロセスで異なっていますこれは別のサブクラスを作成することによって、さまざまなビジネスニーズを達成するために、など、私は、抽出すべき共通の場所は、インターフェースBussinessInterfaceとして定義されていない可能性があり、実装クラスは、各企業のさまざまなビジネスプロセスのために異なる定義SUB1、SUB2、SUB3。優れた拡張性を実現するために、XMLファイルにハンドルクラスファイルを使用して配置することができます。場合だけ、開発者の生産性向上のインスタンスを作成するBussinessInterfaceのB =(BussinessInterface)Class.forNameの(クラス名).newInstance()を使用して、その後、クラス名クラス名を読み取るために、構成ファイルを読んでから、展開。後で新たなニーズがある場合は、さえ開発した新しいサブクラスがインスタンスを作成するコードを変更する必要はありません、唯一のプログラムが良いスケーラビリティを持つように、構成ファイルを変更する必要があります。


違いは何ですか4.11.4声明、PreparedStatementのおよびCallableStatement

3)安全性更好。使用 PreparedStatement 能够预防 SQL 注入攻击,所谓 SQL 注入,指的是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意 SQL 命令的目的。注入只对 SQL 语句的编译过程有破坏作用,而执行阶段只是把输入串作为数据处理,不再需要对 SQL 语句进行解析,因此也就避免了类似 select∗from user where name=′aa′and password=′bb′or 1=1 的 SQL 注入问题的发生。

CallableStatement 由 prepareCall()方法所创建,它为所有 DBMS(Database Management Sys-tem,数据库管理系统)提供了一种以标准形式调用已储存过程的方法。它从 PreparedStatement 中继承了用于处理输入参数的方法,而且还增加了调用数据库中的存储过程和函数以及设置输出类型参数的功能。

常见笔试题:

用于调用存储过程的对象是( )。

A.ResultSet B.DriverManager C.CallableStatemet D.PreparedStatement

答案:C。JDBC 中的 CallableStatement 对象为所有 RDBMS(Relational Database Management System,关系数据库管理系统)提供了一种标准形式调用存储过程的方法。其对存储过程的调用存在两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(IN-OUT 参数)的参数。


4.11.5 getString()方法与 getObject()方法有什么区别

JDBC 提供了 getString()、getInt()和 getData()等方法从 ResultSet 中获取数据,当查询结果集中的数据量较小时,不用考虑性能,使用这些方法完全能够满足需求,但是当查询结果集中的数据量非常大时,则会抛出异常:OracleException 未处理:ORA-01000:maximum open cursors exceeded(以访问 Oracle 数据库为例)。而通常情况下,使用 getObject()方法就可以解决这个问题。

getString()或 getInt()等方法在被调用时,程序会一次性地把数据都放到内存中,然后通过调用 ResultSet 的 next()和 getString()等方法来获取数据。当数据量大到内存中放不下时就会抛出异常,而使用 getObject()方法就不会这种问题,因为数据不会一次性被读到内存中,每次调用时会直接从数据库中去获取数据,因此使用这种方法不会因为数据量过大而出错。


4.11.6 使用 JDBC 时需要注意哪些问题

在使用 JDBC 编程时,首先需要建立于数据库的连接,才能完成对数据库的访问,由于与数据库的连接是非常重要的资源。JDBC 连接池提供了 JDBC 连接定义和数目有限的连接,如果连接数量不够,就需要长时间的等待。不正常关闭 JDBC 连接会导致等待回收无效的 JDBC 连接。只有正常的关闭和释放 JDBC 连接,JDBC 资源才可以被快速地重用,从而使得系统性能得到改善。因此在编程时,一定要保证释放不再使用的连接。

一般来讲,在使用 JDBC 访问数据库时,createStatement 和 prepareStatement 最好放在循环外面,而且使用了这些 Statement 后,需要及时关闭。最好是在执行了一次 executeQuery、exe-cuteUpdate 等之后,如果不需要使用结果集(ResultSet)的数据,就马上将 Statment 关闭。因为每次执行 conn.createStatement()或 conn.prepareStatement(),实际上都相当于在数据库中打开了一个 cursor(游标),如果把对这两个方法的调用放到循环内,会一直不停地打开 cursor。如果不能及时地关闭,会导致程序抛出异常。


4.11.7 什么是 JDO

Java 数据对象(Java Data Object,JDO)是一个用于存取某种数据仓库中的对象的标准化 API,它使开发人员能够间接地访问数据库。

JDO 是 JDBC 的一个补充,它提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(例如 JDBC API 的使用)。这些烦琐的工作已经转移到 JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,相较于 JDBC,JDO 更灵活、更通用,它提供了到任何数据底层的存储功能,例如关系数据库、文件、XML 以及对象数据库管理系统(Object Database Management System,ODBMS)等,使得应用可移植性更强。


4.11.8 JDBC 与 Hibernate 有什么区别

Hibernate 是 JDBC 的封装,采用配置文件的形式将数据库的连接参数写到 XML 文件中,至于对数据库的访问还是通过 JDBC 来完成的。

Hibernate 是一个持久层框架,它将表的信息映射到 XML 文件中,再从 XML 文件映射到相应的持久化类中,这样可以使用 Hibernate 独特的查询语言 Hibernate 查询语言(Hibernate Que-ry Language,HQL)了。Hibernate 的 HQL 查询语句返回的是 List<Object[.]> 类,而 JDBC 通过 statement 返回的查询结果是 ResultSet 并且有时候需要自己封装到 List 中。另外一个重要区别在于,Hibernate 具有访问层(DAO 类层,DAO 全称为 Data Access Object 数据访问接口,意为数据访问接口),该层是 HQL 查询语句唯一出现的位置,再往上层则不会出现查询语句,而 JDBC 可以随时连接随时访问,例如有 100 个类都有 SQL 查询语句,如果表名改变了,那么要使用 JDBC 的方式,就必须重写所有查询语句,而采用 Hibernate 的方式只需修改 DAO 层的类即可,因此 Hibernate 具有很好的维护性和扩展性。

发布了101 篇原创文章 · 获赞 20 · 访问量 6万+

おすすめ

転載: blog.csdn.net/qq_40993412/article/details/104065173