JDBC 面试问题(JDBC Interview Questions)
亲爱的读者,这些JDBC Interview Questions专门设计用于让您熟悉在面试JDBC时可能遇到的问题的本质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:
JDBC代表Java Database Connectivity,它是Java编程语言和各种数据库之间独立于数据库的连接的标准Java API。
通用JDBC体系结构由两层JDBC API(这提供了应用程序到JDBC管理器连接)和JDBC驱动程序API(这支持JDBC管理器到驱动程序连接)组成。
JDBC API由以下接口和类DriverManager,Driver,Connection,Statement,ResultSet,SQLException组成。
JDBC DriverManager是一个管理数据库驱动程序列表的类。 它使用通信子协议将来自java应用程序的连接请求与正确的数据库驱动程序进行匹配。
JDBC驱动程序是一个使Java应用程序能够与数据库交互的接口。 要连接各个数据库,JDBC需要每个数据库的驱动程序。 JDBC驱动程序提供与数据库的连接,并实现用于在客户端和数据库之间传输查询和结果的协议。
连接接口包含用于联系数据库的方法。 连接对象表示通信上下文。
Statement封装了一个SQL语句,该语句被传递给数据库以进行解析,编译,计划和执行。
在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它充当迭代器,允许您遍历其数据。 java.sql.ResultSet接口表示数据库查询的结果集。
有三个常量,当在结果集中定义时,可以在结果集中向后,向前和在特定行中移动光标。
ResultSet.TYPE_FORWARD_ONLY - 游标只能在结果集中向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE - 游标可以向前和向后滚动,结果集对创建结果集后其他人对数据库所做的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE - 游标可以向前和向后滚动,结果集对创建结果集后其他人对数据库所做的更改很敏感。
以下是创建JDBC应用程序的基本步骤
导入包含数据库编程所需的JDBC类的包。
注册JDBC驱动程序,以便可以打开与数据库的通信通道。
使用DriverManager.getConnection()方法打开连接。
使用Statement类型的对象执行查询。
使用适当的ResultSet.getXXX()方法从结果集中提取数据。
通过关闭依赖于JVM垃圾回收的所有数据库资源来清理环境。
有四种类型的JDBC驱动程序
JDBC-ODBC Bridge plus ODBC driver - 也称为Type 1调用本地可用ODBC驱动程序的本机代码。
Native-API, partly Java driver - 也称为Type 2,在客户端调用数据库供应商本机库。 然后,此代码通过网络与数据库通信。
JDBC-Net, pure Java driver - 也称为Type 3纯Java驱动程序,它与服务器端中间件进行通信,然后与数据库进行通信。
Native-protocol, pure Java driver - 也称为Type 4是使用数据库本机协议的pure-java驱动程序。
以下列出了何时可以使用四种类型的驱动程序
如果要访问某种类型的数据库(如Oracle,Sybase或IBM),则首选驱动程序类型为4。
如果Java应用程序同时访问多种类型的数据库,则键入3是首选驱动程序。
类型2驱动程序在数据库尚未提供类型3或类型4驱动程序的情况下非常有用。
类型1驱动程序不被视为部署级驱动程序,通常仅用于开发和测试目的。
JDBC Net纯Java驱动程序(类型4)是最快的驱动程序,因为它将JDBC调用转换为供应商特定的协议调用,并且它直接与数据库交互。
不可以。使用JDBC-ODBC Bridge时,每个连接只能打开一个Statement对象。
标准隔离级别是
TRANSACTION_NONE
TRANSACTION_READ_COMMITTED
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
JDBC体系结构将抽象与其实现分离。 因此JDBC遵循桥接设计模式。 JDBC API提供抽象,JDBC驱动程序提供实现。 可以在不更改客户端代码的情况下将新驱动程序插入JDBC API。
陈述的类型是
Statement - 常规SQL语句。
PreparedStatement - 由于预编译SQL而比语句更有效。
CallableStatement - 调用数据库上的存储过程。
准备好的语句提供了更好的性能,因为它们是预编译的。 准备好的语句为不同的参数重用相同的执行计划,而不是每次都创建一个新的执行计划。 Prepared语句使用绑定参数,这些参数被发送到数据库引擎。 这允许使用相同的预准备语句但不同的参数映射不同的请求以执行相同的执行计划。 准备好的语句更安全,因为它们使用绑定变量,可以防止SQL注入攻击。
Class.forName() - 此方法将驱动程序的类文件动态加载到内存中,自动注册它。 此方法是首选,因为它允许您使驱动程序注册可配置和可移植。
DriverManager.registerDriver() - 如果您使用的是非JDK兼容的JVM(例如Microsoft提供的JVM),则使用此静态方法。
以下是JDBC 4.0的一些优点
自动加载JDBC驱动程序类。 在早期版本中,我们必须使用class.forName手动注册和加载驱动程序。
连接管理增强功能。 添加到javax.sql.PooledConnection的新方法。
使用注释实现SQL的DataSet。
SQL XML支持。
JDBC驱动程序性能或速度取决于许多问题驱动程序代码的质量,驱动程序代码的大小,数据库服务器及其负载,网络拓扑,请求转换为其他API的次数。
讲述您的实时体验。
有3个重载的DriverManager.getConnection()方法来创建连接对象
getConnection(String url,String user,String password)使用带有用户名和密码的数据库URL。 例如
String URL = "jdbcoraclethin@amrood1521EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
getConnection(String url)Using only a database URL. For example
String URL = "jdbcoraclethinusername/password@amrood1521EMP";
Connection conn = DriverManager.getConnection(URL);
getConnection(String url, Properties prop)Using a database URL and a Properties object. For example
String URL = "jdbcoraclethin@amrood1521EMP";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );
使用DatabaseMetaData方法supportsOpenStatementsAcrossCommit()和supportsOpenStatementsAcrossRollback()来检查。
规范没有提到Statement.addBatch()的任何大小限制,这取决于驱动程序。
ResultSet接口中有几个涉及移动游标的方法,如beforeFirst(),afterLast(),first(),last(),absolute(int row),relative(int row),previous(),next() ,getRow(),moveToInsertRow(),moveToCurrentRow()。
ResultSet接口包含每种可能数据类型的get方法,每个get方法都有两个版本
一个接受列名称的人。
一个接受列索引的。
例如getInt(String columnName),getInt(int columnIndex)
ResultSet接口包含一组更新方法,用于更新结果集的数据。 每种更新方法对每种数据类型都有两个版本
一个接受列名称的人。
一个接受列索引的。
这些方法更改ResultSet对象中当前行的列,但不更改基础数据库中的列。 要更新对数据库中行的更改,需要调用以下方法之一
updateRow(),deleteRow(),refreshRow(),cancelRowUpdates(),insertRow()
JDBC驱动程序在将Java数据类型发送到数据库之前将其转换为适当的JDBC类型。 它使用大多数数据类型的默认映射。 例如,Java int转换为SQL INTEGER。
在调用DriverManager.getConnection方法期间出现“没有合适的驱动程序”,可能是由于以下任何原因
由于在调用getConnection方法之前未能加载适当的JDBC驱动程序。
它可以指定无效的JDBC URL,JDBC驱动程序无法识别该URL。
如果无法加载桥所需的一个或多个共享库,则会发生此错误。
SQL使用NULL值和Java使用null是不同的概念。 您可以使用三种策略
避免使用返回原始数据类型的getXXX()方法。
对原始数据类型使用包装类,并使用ResultSet对象的wasNull()方法来测试接收getXXX()方法返回的值的包装类变量是否应设置为null。
使用原始数据类型和ResultSet对象的wasNull()方法来测试接收getXXX()方法返回的值的原始变量是否应设置为您选择表示NULL的可接受值。
创建连接时,它处于自动提交模式。 这意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。 通过将auto-commit设置为false,在显式调用commit方法之前,不会提交任何SQL语句。
以下是原因
提高性能。
保持业务流程的完整性。
使用分布式事务。
保存点标记当前事务可以回滚到的点。 它可以选择仅回滚其中的一些,而不是将所有更改都回滚。 例如,假设你
开始交易。
在表中插入10行。
设置保存点。
再插入5行。
回滚到保存点。
提交交易。
执行此操作后,该表将包含您插入的前10行。 其他5行将被回滚删除。 保存点只是当前事务可以回滚到的标记。
SQLWarning对象是SQLException的子类,用于处理数据库访问警告。 警告不会像例外那样停止执行应用程序。 他们只是提醒用户某些事情没有按计划发生。 可以在Connection对象,Statement对象(包括PreparedStatement和CallableStatement对象)或ResultSet对象上报告警告。 这些类中的每一个都有一个getWarnings方法。
批处理允许您将相关的SQL语句分组到批处理中,并通过一次调用数据库来提交它们。
使用Statement或PrepareStatement对象进行批处理的典型步骤序列是
如果使用PrepareStatement对象进行批处理,请使用占位符创建SQL语句。
分别使用createStatement()或prepareStatement()方法创建Statement或PrepareStatement对象。
使用setAutoCommit()将auto-commit设置为false。
使用创建的语句对象上的addBatch()方法,将您喜欢的SQL语句添加到批处理中。
在创建的语句对象上使用executeBatch()方法执行所有SQL语句。
最后,使用commit()方法提交所有更改。
存储过程是一组SQL语句,它们构成逻辑单元并执行特定任务。 例如,员工数据库上的操作(雇用,激活,升级,查找)可以编码为由应用程序代码执行的存储过程。 可以使用JDBC API中的CallableStatement类调用存储过程。 例如,以下代码演示了这一点
CallableStatement cs = con.prepareCall("{call MY_SAMPLE_STORED_PROC}");
ResultSet rs = cs.executeQuery();
使用转义语法,您可以灵活地使用标准JDBC方法和属性来使用您无法使用的数据库特定功能。
一般的SQL转义语法格式如下
{keyword 'parameters'}.
JDBC定义包含以下语言功能的标准语法的转义序列
日期,时间和时间戳文字(d,t,ts关键字)。
标量函数,如数字,字符串和数据类型转换函数(fn关键字)。
外连接(oj关键字)
LIKE子句中使用的通配符的转义字符(转义关键字)。
过程调用(调用关键字)。
交易是一个逻辑工作单元。 要完成逻辑工作单元,可能需要对数据库采取若干操作。 事务用于在并发访问期间提供数据完整性,正确的应用程序语义和一致的数据视图。
按照以下步骤操作
//turn off the implicit commit
Connection.setAutoCommit(false);
//..your insert/update/delete goes here
Connection.Commit();
//a new transaction is implicitly started.
发出连接请求时,DriverManager会询问每个加载的驱动程序是否理解发送的URL。 如果未正确构造传递的URL,则返回“No Suitable Driver”消息。
boolean execute() - 执行任何类型的SQL语句。
ResultSet executeQuery() - 通常用于读取数据库的内容。 输出将采用ResultSet的形式。 通常使用SELECT语句。
int executeUpdate() - 通常用于更改数据库。 通常在这里使用DROP TABLE或DATABASE,INSERT到TABLE,UPDATE TABLE,DELETE from TABLE语句。 输出将采用int的形式,表示受查询影响的行数。
您需要关闭结果集,语句和连接。 如果连接来自池,则关闭它实际上会将其发送回池以供重用。 我们可以在finally {}块中执行此操作,这样如果抛出异常,您仍然有机会关闭它。
这些用于将大量数据存储到数据库中,如图像,电影等,其尺寸非常大。
每个Database的供应商都通过Driver提供ResultSet和其他接口的实现。
连接池是一种用于重用物理连接并减少应用程序开销的技术。 连接池功能最大限度地减少了创建和关闭会话的昂贵操作。数据库供应商帮助多个客户端共享一组缓存连接对象,以提供对数据库的访问。 客户端无需每次都创建新连接以与数据库进行交互。
如果您使用WebLogic,WebSphere,jBoss,Tomcat等应用程序服务器。 ,然后您的应用程序服务器提供配置连接池的工具。 如果您不使用应用程序服务器,则可以使用Apache Commons DBCP组件等组件。
java.sql.Blob具有更好的性能,因为在您明确要求之前,它不会从数据库中提取任何数据。
java.sql.Clob具有更好的性能,因为在您明确要求之前,它不会从数据库中提取任何数据。
使用Statement.setFetchSize方法指示每个数据库提取的大小。
的Class.forName( “MyClass的”)
加载MyClass类。
执行MyClass的任何静态块代码。
返回MyClass的实例。
不,它没有。 import语句告诉编译器要查找的类。 Class.forName()指示Classclass查找类加载器并将该特定Class对象加载到JVM使用的内存中。
ResultSet并发性确定ResultSet是可以更新还是仅读取。 ResultSet可以具有两个并发级别之一
ResultSet.CONCUR_READ_ONLY - 表示只能读取ResultSet。
ResultSet.CONCUR_UPDATABLE - 表示可以同时读取和更新ResultSet。
setFetchSize(int)和setMaxRow(int)之间的区别是
setFetchSize(int)定义ResultSet需要更多行时将从数据库中读取的行数。 setFetchSize(int)会影响数据库返回ResultSet数据的方式。
ResultSet的setMaxRows(int)方法指定ResultSet一次可以包含的行数。 setMaxRows(int)影响客户端JDBC对象。
JDBC RowSet对象以某种方式保存表格数据,使其比结果集更灵活,更易于使用。 RowSet对象是JavaBeans组件。
RowSet有两种类型
Connected连接的RowSet对象本质上是永久性的。 在应用程序终止之前,它不会终止。
Disconnected连接的RowSet对象本质上是临时的。 只要它需要从数据库中检索数据,它就会建立连接并在完成所需任务后将其关闭。 在重新建立连接后,将更新在断开连接状态期间修改的数据。
在典型的数据库事务中,假设一个事务读取并更改值,而第二个事务在第一个事务提交或回滚之前读取值。 此读取过程称为“脏读”。 因为第一个事务总是有可能回滚导致第二个事务读取无效值的更改。
TRANSACTION_READ_COMMITTED可防止脏读。
JDBC API有两个Metadata接口DatabaseMetaData和ResultSetMetaData。 元数据提供有关整个数据库的全面信息。 这些接口的实现由数据库驱动程序供应商实现,以使用户了解数据库的功能。
请按照以下步骤操作
首先设置新的ODBC数据源。 转到管理工具 - >数据源(ODBC) - >系统DSN选项卡 - >添加 - >驱动程序执行Microsoft Excel(*。xls) - >完成。 现在给出数据源名称(SampleExcel)和描述。 接下来,单击“选择工作簿”并指向Excel工作表。
在代码中添加以下代码
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbcodbcSampleExcel","","");
stmt = conn.createStatement();
sql = "select * from [Sheet1$]";
rs=stmt.executeQuery(sql);
Sheet1是excel表名称。
Hibernate是一个对象关系映射工具。 它将对象映射到关系数据。
Java命名和目录接口(JNDI)是一种用于访问不同命名和目录服务的API。 您可以使用它来访问存储在目录或命名服务中的内容,而无需专门为该命名或目录服务编写代码。
Java DataBase Connectivity(JDBC)API是一种用于访问不同关系数据库的API。 您可以使用它来访问关系数据库,而无需在代码中嵌入对特定数据库类型的依赖关系。
接下来是什么? (What is Next ?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。