1.
什么是JDBC API,什么时候使用?
Java DataBase Connectivity API允许我们使用关系数据库。JDBC API接口和类是部分java.sql和javax.sqlpackage的一部分,我们可以使用JDBC API获取数据库连接,在数据库服务器上运行sql查询和存储过程,并处理结果。
JDBC API的编写方法允许我们的Java程序和实际的JDBC驱动程序之间的松散耦合,这使得我们可以很容易地从一个数据库切换到另一个数据库服务器。
2.
JDBC司机有哪些类型?
JDBC有四种类型的司机。任何使用数据库的java程序都有两个部分,第一部分是JDBC API,第二部分是执行实际工作的驱动程序。
JDBC-ODBC桥加ODBC驱动(类型1):使用ODBC驱动连接数据库。我们应该安装ODBC驱动程序来连接数据库,这就是为什么这个驱动程序几乎过时了。
本机API部分支持Java技术的驱动程序(类型2):该驱动程序将JDBC类转换为数据库服务器的客户端API。我们应该安装数据库客户端API。这不是首选驱动程序,因为它额外依赖于数据库客户端API驱动程序。
数据库中间件的纯Java驱动程序(类型3):该驱动程序向可以连接到不同类型数据库的中间件服务器发送JDBC调用。我们应该安装一个中间件服务器来使用这个驱动程序。这增加了额外的网络呼叫并降低了性能,这就是为什么JDBC驱动程序没有被广泛使用的原因。
直接到数据库的纯Java驱动程序(类型4):这个驱动程序将JDBC调用转换成数据库服务器可以理解的网络协议。该解决方案简单,适合网络上的数据库连接。但是对于这个解决方案,我们应该使用特定于数据库的驱动程序,比如Oracle的OJDBC jar for Oracle DB和MySQL Connector/J .
3.
JDBC API如何帮助我们实现Java程序和JDBC驱动API的松耦合?
JDBC应用编程接口使用java反射应用编程接口来实现Java程序和JDBC驱动程序之间的松耦合。如果你看一个简单的JDBC例子,你会发现所有的编程都是由JDBC API完成的,驱动只有在通过反射由Class.forName()方法加载时才会出现。
我认为这是在核心java类中使用反射来确保我们的应用程序不能直接使用驱动程序接口的最好例子之一,这使得从一个数据库移动到另一个数据库变得非常容易。
4.
什么是JDBC联系?解释在一个简单的java程序中获得数据库连接的步骤。
JDBC连接类似于使用数据库服务器创建的会话。您也可以将连接视为来自数据库服务器的套接字连接。
创建JDBC连接非常简单,需要两步:
注册并加载驱动程序:使用Class.forName(),驱动程序类在DriverManager中注册并加载到内存中。
使用驱动管理器获取连接对象:我们通过传递数据库URL字符串、用户名和密码作为参数来获取连接对象。
Connection con = null尝试{ //加载驱动类class . forname(" com . MySQL . JDBC . driver ");//创建连接con = driver manager . getconnection(" JDBC:MySQL://localhost:3306/userdb "," pankaj "," pankaj 123 ");} catch(SQLException e){ System . out . println("检查数据库是否正常,配置是否正确");e . printstacktrace();} catch(ClassNotFoundException e){ System . out . println("请在类路径中包含JDBC MySQL jar ");e . printstacktrace();}
5.
JDBC驱动管理器类有什么用?
JDBC驱动管理器是工厂类,我们通过它获得数据库连接对象。当我们加载JDBC驱动程序类时,它会向驱动管理器注册,您可以通过查找JDBC驱动程序类的源代码来检查它。
当我们通过传递数据库配置细节来调用方法DriverManager.getConnection()时,DriverManager使用注册的驱动程序来获取连接并将其返回给调用程序。
6.
如何在java程序中获取数据库服务器的详细信息?
我们可以使用DatabaseMetaDataobject来获取数据库服务器的详细信息。成功创建数据库连接后,我们可以通过调用getMetaData()方法来获取元数据对象。我们可以使用数据库元数据中的方法来获取数据库产品名称、版本和详细的配置信息。
database metaData metaData = con . GetMetadata();string DBProducT = Metadata . GetDatabaseProductName();
7.
什么是JDBC声明?
JDBC应用编程接口语句用于在数据库中执行查询。我们可以通过调用连接创建状态()方法来创建一个语句对象。我们可以使用语句通过不同的执行方法传递查询来执行静态的SQL查询,比如execute(),executeQuery(),executeUpdate(),等等。
由于查询是在java程序中生成的,如果用户输入验证不正确,可能会导致SQL注入问题,更多细节可以在SQL注入示例中找到。
默认情况下,每个语句对象只能同时打开一个结果集对象。因此,如果我们想使用多个结果集对象,每个对象必须由不同的语句对象生成。语句接口中的所有execute()方法都隐式关闭语句的当前结果集对象(如果有打开的对象)。
8.
execute、executeQuery和executeUpdate有什么区别?
语句执行(字符串查询)用于执行任何SQL查询,如果结果是结果集(如运行选择查询),则返回真。当没有结果集对象时(如运行插入或更新查询),输出为假。我们可以使用getResultSet()获取结果集,使用getUpdateCount()方法检索更新计数。
语句执行查询(字符串查询)用于执行选择查询并返回结果集。即使没有与查询匹配的记录,返回的结果集也不会为空。在执行选择查询时,我们应该使用executeQuery方法,这样如果有人试图执行insert/update语句,就会抛出java.sql.SQLException,并显示消息“executeQuery方法不能用于更新”。
执行更新(字符串查询)用于执行不返回任何内容的插入/更新/删除(DML)语句或DDL语句。Output为int,等于SQL数据操作语言(DML)语句的行数。对于DDL语句,输出为0。
execute()方法只能在语句类型不确定时使用;否则,应该使用executeQuery或executeUpdate方法。
9.
什么是JDBC准备声明?
JDBC准备状态对象代表一个预编译的SQL语句。我们可以使用它的setter方法来设置查询的变量。
因为PreparedStatement是预编译的,所以它可以用来多次有效地执行该语句。对于语句来说,PreparedStatement是一个更好的选择,因为它自动转义特殊字符并避免了SQL注入攻击。
10.
如何在JDBC报表中设置空值。
我们可以使用PreparedStatement setNull()方法将空变量绑定到参数。例如,setNull方法以index和SQL Types作为参数ps.setnull (10,Java . SQL . Types . integer);。
11.
getGeneratedKeys()方法在Statement中有什么用?
有时,表可以使用自动生成的键来插入主键的唯一列值。我们可以使用语句getGeneratedKeys()方法来获取这个自动生成的密钥的值。
12.
报表附注有什么好处?
报表附注的一些优点是:
PreparedStatement帮助我们防止SQL注入攻击,因为它会自动转义特殊字符。
PreparedStatement允许我们使用参数输入来执行动态查询。
准备语句比语句快。当我们重用PreparedStatement或使用其批处理方法执行多个查询时,这一点变得更加明显。
PreparedStatement帮助我们使用setter方法编写面向对象的代码,而使用语句时,我们必须使用字符串连接来创建查询。如果要设置多个参数,使用字符串连接编写查询看起来很难看,而且容易出错。
13.
PreparedStatement的局限性是什么,如何克服?
准备声明的一个限制是我们不能在IN子句中直接使用它。在in子句中使用PreparedStatement的一些替代方法是:
执行单个查询的性能非常慢,不建议这样做
使用存储过程是特定于数据库的,因此不适合多个数据库应用程序。
这是一种动态创建准备状态查询的好方法,但它失去了缓存准备状态的好处。
在PreparedStatement查询中使用NULL当您知道变量输入的最大数量时,这是一个很好的方法,可以通过部分执行来扩展,以允许无限制的参数。更详细的分析可以在JDBC准备声明条款替换中找到。
14.
什么是JDBC结果集?
Jdbcsultset类似于表示数据库结果集的数据表,通常是通过执行查询数据库的语句生成的。
结果集对象保持一个指向其当前数据行的光标。最初,光标位于第一行之前。next()方法将光标移动到下一行。如果没有更多的行,next()方法返回false,并且可以在while循环中使用它来迭代结果集。
默认的结果集对象不可更新,并且只有一个光标向前移动。因此,只能迭代一次,并且只能从第一行迭代到最后一行。您可以使用以下语法生成可滚动和/或可更新的结果集对象。
语句stmt = con . CreateStatement(ResultSet。不敏感,结果集。CONCUR _ UPDATABLE
当生成结果集对象的语句对象被关闭、重新执行或用于从多个结果序列中检索下一个结果时,该对象将自动关闭。
我们可以使用ResultSet getter方法、列名或索引号从1中检索列数据。
15.
结果集有哪些不同类型?
创建语句时,我们可以根据用户输入获得不同类型的结果集对象。如果您查看连接方法,您会看到createStatement()和prepareStatement()方法被重载,以提供结果集类型和并发性作为输入参数。
结果集对象有三种类型。
结果集。TYPEFORWARDONLY:这是默认类型,光标只能在结果集中向前移动。
结果集。类型不敏感:光标可以前后移动,结果集对创建结果集后其他人对数据库的更改不敏感。
结果集。TYPESCROLLSENSITIVE:光标可以前后移动,结果集对创建结果集后其他人对数据库所做的更改很敏感。基于并发性有两种类型的结果集对象。
结果集。并发只读:结果集是只读的,这是默认的并发类型。
结果集。CONCUR _可更新:我们可以使用ResultSet更新方法来更新行数据。
16.
setFetchSize()和setMaxRows()方法在语句中有什么用?
我们可以使用setMaxRows(int i)方法来限制数据库从查询中返回的行数。您可以使用SQL查询本身来实现相同的功能。例如,在MySQL中,我们可以使用LIMIT子句来设置查询返回的最大行数。
理解fetchSize可能很棘手,因为您应该知道语句和结果集是如何工作的。当我们在数据库中执行查询时,我们将在数据库缓存中获取并维护结果,并返回结果集。结果集是一个引用数据库中结果的游标。
假设我们有一个返回100行的查询,我们将fetchSize设置为10,那么JDBC驱动程序在每次数据库访问时将只获得10行,因此将有10次访问来获得所有的行。如果每一行都需要大量的处理时间,并且结果中的行数很大,那么设置最佳的fetchSize是有帮助的。
我们可以通过Statement对象设置fetchSize,但是可以通过ResultSet对象的set fetchSize()方法覆盖它。
17.
如何使用JDBC API调用存储过程?
存储过程是在数据库中编译的一组SQL查询,可以从JDBC应用编程接口执行。JDBC调用状态可用于执行数据库中的存储过程。初始化CallableStatement的语法为;
CallableStatement stmt = con . prepare call({ call insert Employee(?,?,?,?,?,?)}");stmt.setInt(1,id);stmt.setString(2,name);stmt.setString(3,角色);stmt.setString(4,city);stmt.setString(5,国家);//我们需要在调用存储过程之前注册外部参数stmt.registeroutparameter (6,java.sql.types.varchar)。stmt . execute update();
我们需要在执行CallableStatement之前注册OUT参数。
18.
什么是JDBC批量加工,它有什么好处?
有时我们需要为数据库运行类似的批处理查询,比如将数据从CSV文件加载到关系数据库表中。我们知道我们可以选择使用语句或准备语句来执行查询。此外,JDBC API还提供了批处理功能,通过它我们可以一次对数据库执行大量查询。
JDBC应用编程接口通过语句和准备语句添加批处理()和执行批处理()方法支持批处理。
批处理比一次执行一条语句更快,因为数据库调用更少。
19.
什么是JDBC交易管理?我们为什么需要它?
默认情况下,当我们创建数据库连接时,它以自动提交模式运行。这意味着无论何时执行并完成查询,都会自动触发提交。因此,我们触发的每个SQL查询都是一个事务。如果我们运行一些DML或DDL查询,这些更改将在每个SQL语句完成后保存到数据库中。
有时,我们希望一组SQL查询成为事务的一部分,这样我们就可以在所有查询正常运行时提交它们。如果我们得到任何异常,我们可以选择回滚作为事务一部分执行的所有查询。
JDBC应用编程接口提供了一个方法,设置自动提交(布尔标志),通过它我们可以禁用连接的自动提交功能。我们应该仅在必要时禁用自动提交,因为除非我们在连接上调用commit()方法,否则不会提交事务。数据库服务器使用表锁实现事务管理,这是一个资源密集型的过程。因此,我们应该在完成交易后立即提交交易。
20.
如何回滚JDBC事务?
我们可以使用连接对象回滚()方法来来回回滚事务。它回滚事务所做的所有更改,并释放此连接对象当前持有的所有数据库锁。
21.
什么是JDBC保存点?怎么用?
有时,一个事务可以是一组多个语句,我们希望回滚到事务中的某个特定点。JDBC保存点帮助我们在事务中创建检查点,我们可以回滚到该特定检查点。
为事务创建的任何保存点都会自动释放,并在事务提交或整个事务回滚时变得无效。将事务回滚到保存点会自动释放在相关保存点之后创建的任何其他保存点,并使其无效。
22.
什么是JDBC数据源?它的优点是什么?
JDBC数据源是javax.sql包中定义的接口,比DriverManager功能更强大,可以用于数据库连接。我们可以使用数据源来创建数据库连接,并且可以使用驱动程序实现类来获得连接的实际工作。除了获取数据库连接,数据源还提供了一些其他功能,例如:
缓存准备状态用于加快处理连接超时设置记录函数最大大小阈值使用JNDI支持servlet容器中的连接池读取有关JDBC数据源的更多信息。
23.
如何在Apache Tomcat服务器中使用JDBC数据源和JNDI实现JDBC连接池?
对于部署在servlet容器中的Web应用程序,创建JDBC连接池非常简单,只需要几个步骤。
在容器配置文件中创建一个JDBC·JNDI资源,例如
server.xml
context.xml在Web应用程序中,使用InitialContext查找第一步中配置的JNDI资源,然后获取连接。
Context ctx = new InitialContext();DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");24.
什么是阿帕奇DBCP API?
如果使用数据源获取数据库连接,通常用于获取连接的代码与特定于驱动程序的数据源实现紧密耦合。除了选择数据源实现类,大部分代码都是样板代码。
Apache DBCP通过提供数据源实现帮助我们摆脱这些问题,数据源实现充当了我们的程序和不同JDBC驱动程序之间的抽象层。阿帕奇DBCP图书馆依赖于公地池图书馆,所以要确保它们都在构建路径中。
25.
什么是JDBC连接隔离等级?
当我们使用JDBC事务来实现数据完整性时,DBMS使用锁来防止其他人访问事务访问的数据。DBMS使用锁来防止脏读、不可重复读和幻影读。
DBMS使用JDBC事务隔离级别来使用锁定机制。我们可以通过connectiongettransactionin solution()方法获取隔离级别信息,并通过setTransactionIsolation()方法进行设置。
26.
什么是JDBC行集?行集有哪些类型?
Jdbcrrowset以更灵活的方式保存表数据,即ResultSet。所有行集对象都是从结果集派生的,因此它们具有结果集的所有功能和一些其他功能。行集接口是在javax.sql包中定义的。
行集提供的一些附加功能包括:
带有属性和它们的getter-setter方法的Java Bean。行集使用JavaBeans事件模型,该模型可以向任何已注册的组件发送事件通知,例如光标移动、更新/插入/删除行以及更改行集内容。
默认情况下,行集对象是可滚动和可更新的,所以如果DBMS不支持可滚动或可更新的结果集,我们可以使用行集来获取这些函数。
行集大致分为两种类型:
连接的行集对象-这些对象连接到数据库,与结果集对象最相似。JDBC API只提供了一个连接的RowSet对象javax.sql.RowSet.JdbcRowSet,它的标准实现类是com . sun . RowSet . JDBC RowSet impl disconnected RowSet对象——这些RowSet对象不需要连接到数据库,所以比较轻便,可以序列化。它们适合通过网络发送数据。有四种类型的断开连接的行集实现。
它们可以获得连接,执行查询,读取结果集数据来填充行集数据。当数据断开连接时,我们可以操作和更新数据,重新连接到数据库并写入更改。WebRowSet是从CachedRowSet派生出来的——它们可以读写XML文档。JoinRowSet是从WebRowSet派生的——它们可以在不连接到数据源的情况下形成SQL连接。从WebRowSet派生的筛选行集-我们可以应用筛选条件,以便只显示选定的数据。
27.
结果集和行集有什么区别?
行集对象是从结果集派生的,因此它们具有结果集的所有功能和一些附加功能。行集的一个优点是它们可以断开连接,使它们重量轻,易于在网络上传输。
是否使用结果集或行集取决于您的要求,但是如果您计划长时间使用结果集,断开连接的行集是释放数据库资源的更好选择。
28.
有哪些常见的JDBC例外?
一些常见的JDBC例外情况是:
这是JDBC异常的基本异常类。这个异常是在批处理操作失败时抛出的,但是这取决于JDBC驱动程序抛出这个异常还是基本的SQLException。Java . sql . SqlWarning-在SQL操作中使用的警告消息。当数据值由于超过MaxFieldSize而被意外截断时。
29.
JDBC有哪些CLOB和BLOB数据类型?
字符大对象(CLOB)是由单字节字符和相关代码页组成的字符串。这种数据类型适用于存储面向文本的信息,其中信息量可能超过传统VARCHAR数据类型的限制(上限为32 KB)。
二进制大对象(BLOB)是由字节组成的二进制字符串,没有关联的代码页。这种数据类型可以存储大于VARBEROS(32K限制)的二进制数据。这种数据类型适用于存储图像、语音、图形和其他类型的业务或特定于应用的数据。
30.
什么是JDBC的“肮脏阅读”?哪个隔离级别防止脏读?
当我们处理事务时,可以更新行,而其他查询可以读取更新的值。这将导致脏读,因为更新的值不是永久的,并且更新行的事务可以回滚到以前的值,从而导致无效数据。
隔离级别TRANSACTIONREADCOMMITTED、TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE防止脏读。
31.
什么是2阶段提交?
当我们在涉及多个数据库的分布式系统中工作时,我们需要使用两阶段提交协议。两阶段提交协议是分布式系统的原子提交协议。在第一阶段,事务管理器向所有事务资源发送提交请求。如果所有事务资源都正常,事务管理器将提交所有资源的事务更改。如果任何事务资源响应为“中止”,事务管理器可以回滚所有事务更改。
32.
JDBC有哪些不同类型的锁?
广义而言,有两种类型的锁定机制可以防止数据损坏,因为多个用户使用相同的数据。
乐观锁定-使用代码来实现这种锁定。表中引入了一个额外的列来保持更新计数。当你选择了这一行,你也会读到这一列,比如“版本”。现在,当您试图更新/删除一行时,这个“版本”将在where子句中传递。因此,如果同时执行其他线程的更新,更新将会失败。这是避免数据损坏的好方法,但是如果有人在更新语句中遗漏了更新“版本”,可能很容易出错。这样,更新查询如下所示。
mysql> update emp SET name = 'David', version = 5 WHERE id = 10 and version = 4;悲观锁定-从选择到读取、更新和提交锁定记录。这通常由数据库供应商软件完成,并通过使用选择进行更新查询来触发。如果线程长时间处理锁,这种锁定行的方式可能会导致性能下降和死锁。
此外,一些DBMS系统提供锁定机制来锁定单个行、表或数据库。
33.
你对DDL和DML语句了解多少?
数据定义语言语句用于定义数据库模式。创建、更改、删除、截断、重命名语句是DDL语句,通常不会返回任何结果。
数据操作语言语句用于操作数据库模式中的数据。选择、插入、更新、删除、调用等等都是DML语句的例子。
34.
java.util.Date和java.sql.Date有什么区别?
Java.util.Date包含日期和时间信息,而java.sql.Date只包含日期信息,没有时间信息。因此,如果必须在数据库中保留时间信息,建议使用时间戳或日期时间字段。
35.
如何将图像或原始数据插入数据库?
我们可以使用BLOB将图像或原始二进制数据插入数据库。
36.
什么是幻影阅读,什么隔离等级阻止?
虚拟读取是指事务多次执行查询并获取不同数据的情况。假设一个事务正在执行一个查询以根据条件获取数据,然后另一个事务插入一个与条件匹配的行。现在,当同一事务再次执行查询时,新行将成为结果集的一部分。新行叫幻影行,这种情况叫幻影读。
只有TRANSACTION_SERIALIZABLE隔离级别可以防止幻影读取。
37.
什么是SQL警告?如何在JDBC程序中检索SQL警告。
SQLWarning是SQLException的子类,可以通过调用Connection、Statement和ResultSet对象上的getWarnings()方法来检索。SQL警告不会停止脚本的执行,但会向用户发出警告。
38.
如何使用数据库对象作为IN/OUT调用Oracle存储过程?
如果Oracle存储过程有IN/OUT参数作为数据库对象,我们需要在程序中创建一个大小相同的对象数组,然后用它来创建Oracle STRUCT对象。然后我们可以为数据库对象设置这个STRUCT对象,并通过调用setSTRUCT()方法来使用它。
39.
什么时候能拿到java.sql.SQLException:找不到合适的驱动?
当SQL URL字符串格式不正确时,如果没有合适的驱动程序,就会出现异常。您可以在使用驱动管理器的简单Java应用程序中或使用数据源的JNDI资源中获得此异常。异常堆栈跟踪如下所示。
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL ''jdbc:mysql://localhost:3306/UserDB' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)java.sql.SQLException: No suitable driver found for 'jdbc:mysql://localhost:3306/UserDB at java.sql.DriverManager.getConnection(DriverManager.java:604) at java.sql.DriverManager.getConnection(DriverManager.java:221) at com.journaldev.jdbc.DBConnection.getConnection(DBConnection.java:24) at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:15)Exception in thread "main" java.lang.NullPointerException at com.journaldev.jdbc.DBConnectionTest.main(DBConnectionTest.java:16)调试此异常时,只需检查日志中打印的URL即可。比如上面日志里的URL是‘JDBC:MySQL://localhost:3306/userdb,但是应该是JDBC:MySQL://localhost:3306/userdb。
40
JDBC的最佳实践是什么?
JDBC的一些最佳实践是:
数据库资源很重,所以请确保在完成后立即关闭它。Close()方法是为连接、语句、结果集和所有其他JDBC对象定义的,用于关闭它们。始终显式关闭代码中的结果集、语句和连接,因为如果您在连接池环境中工作,连接可能会返回到池中,从而导致打开的结果集和语句对象导致资源泄漏。关闭finally块中的资源,以确保它们即使在异常情况下也是关闭的。对类似的批处理操作使用批处理。始终在语句上使用准备语句,以避免SQL注入,并获得准备语句的预编译和缓存优势。如果要将批处理数据检索到结果集中,设置fetchSize的最佳值有助于获得良好的性能。数据库服务器可能不支持所有隔离级别,因此请在假设之前进行检查。更严格的隔离级别会导致性能下降,因此请确保为数据库连接设置了最佳隔离级别。如果您想在Web应用程序中创建数据库连接,请尝试使用JNDI上下文使用JDBC数据源资源来重用该连接。当您需要长时间使用结果集时,请尝试使用断开连接的行集。
1.《jdbc JDBC面试问题》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《jdbc JDBC面试问题》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/1193475.html