没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
JDBC 常见面试题集锦
一、概念
1.什么是 JDBC,在什么时候会用到它?
JDBC 的全称是 Java DataBase Connection,也就是 Java 数据库连接,我们可以用它来
操作关系型数据库。JDBC 接口及相关类在 java.sql 包和 javax.sql 包里。我们可以用它来
连接数据库,执行 SQL 查询,存储过程,并处理返回的结果。JDBC 接口让 Java 程序和 JDBC
驱动实现了松耦合,使得切换不同的数据库变得更加简单。
2.有哪些不同类型的 JDBC 驱动?
有四类 JDBC 驱动。和数据库进行交互的 Java 程序分成两个部分,一部分是 JDBC 的
API,实际工作的驱动则是另一部分。(1)JDBC-ODBC Bridge plus ODBC Driver(类型 1):
它使用 ODBC 驱动连接数据库。需要安装 ODBC 以便连接数据库,正因为这样,这种方式现在
已经基本淘汰了。(2)Native API partly Java technology-enabled driver(类型 2):
这种驱动把 JDBC 调用适配成数据库的本地接口的调用。(3)Pure Java Driver for
Database Middleware(类型 3):这个驱动把 JDBC 调用转发给中间件服务器,由它去和不
同的数据库进行连接。用这种类型的驱动需要部署中间件服务器。这种方式增加了额外的网
络调用,导致性能变差,因此很少使用。(4)Direct-to-Database Pure Java Driver(类
型 4):这个驱动把 JDBC 转化成数据库使用的网络协议。这种方案最简单,也适合通过网络
连接数据库。不过使用这种方式的话,需要根据不同数据库选用特定的驱动程序,比如 OJDBC
是 Oracle 开发的 Oracle 数据库的驱动,而 MySQL Connector/J 是 MySQL 数据库的驱动。
3.JDBC 是如何实现 Java 程序和 JDBC 驱动的松耦合的?
JDBC API 使用 Java 的反射机制来实现 Java 程序和 JDBC 驱动的松耦合。随便看一个简
单的 JDBC 示例,你会发现所有操作都是 通 过 JDBC 接口完成的,而驱动只有 在 通 过
Class.forName 反射机制来加载的时候才会出现。
4.什么是 JDBC 连接,在 Java 中如何创建一个 JDBC 连接?
JDBC 连接是和数据库服务器建立的一个会话。你可以想像成是一个和数据库的 Socket 连接。
创建 JDBC 连接很简单,只需要两步:
A. 注册并加载驱动:使用 Class.forName(),驱动类就会注册到 DriverManager 里面并加
载到内存里。 B. 用 DriverManager 获取连接对象:调用 DriverManager.getConnnection()
方法并传入数据库连接的 URL,用户名及密码,就能获取到连接对象。
Connection con = null;
try{
// load the Driver Class
Class.forName("com.mysql.jdbc.Driver");
// create the connection now
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/UserDB",
"pankaj",
"pankaj123");
}catch (SQLException e) {
System.out.println("Check database is UP and configs are correct");
e.printStackTrace();
}catch (ClassNotFoundException e) {
System.out.println("Please include JDBC MySQL jar in classpath");
e.printStackTrace();
}
5.JDBC 的 DriverManager 是用来做什么的?
JDBC 的 DriverManager 是一个工厂类,我们通过它来创建数据库连接。当 JDBC 的 Driver
类被加载进来时,它会自己注册到 DriverManager 类里面,你可以看下 JDBC Driver 类的源
码来了解一下。然后我们会把数据库配置信息传成 DriverManager.getConnection()方法,
DriverManager 会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。
6.在 Java 程序中,如何获取数据库服务器的相关信息?
使用 DatabaseMetaData 可以获取到服务器的信息。当和数据库的连接成功建立了之后,
可以通过调用 getMetaData()方法来获取数据库的元信息。DatabaseMetaData 里面有很多方
法,通过它们可以获取到数据库的产品名称,版本号,配置信息等。
DatabaseMetaData metaData = con.getMetaData();
String dbProduct = metaData.getDatabaseProductName();
7.JDBC 的 Statement 是什么?
Statement 是 JDBC 中用来执行数据库 SQL 查询语句的接口。通过调用连接对象的
getStatement() 方 法 我 们 可 以 生 成 一 个 Statement 对 象 。 我 们 可 以 通 过 调 用 它 的
execute(),executeQuery(),executeUpdate()方法来执行静态 SQL 查询。
由于 SQL 语句是程序中传入的,如果没有对用户输入进行校验的话可能会引起 SQL 注入的问
题,如果想了解更多关于 SQL 注入的,可以看下这里。默认情况下,一个 Statement 同时只
能打开一个 ResultSet。如果想操作多个 ResultSet 对象的话,需要创建多个 Statement。
Statement 接口的所有 execute 方法开始执行时都默认会关闭当前打开的 ResultSet。
6.execute,executeQuery,executeUpdate 的区别是什么?
Statement 的 execute(String query)方法用来执行任意的 SQL 查询,如果查询的结果
是一个 ResultSet,这个方法就返回 true。如果结果不是 ResultSet,比如 insert 或者 update
查询,它就会返回 false。我们可以通过它的 getResultSet 方法来获取 ResultSet,或者通
过 getUpdateCount()方法来获取更新的记录条数。
Statement 的 executeQuery(String query)接口用来执行 select 查 询 , 并 且 返 回
ResultSet。即使查询不到记录返回的 ResultSet 也不会为 null。我们通常使用 executeQuery
来执行查询语句,这样的话如果传进来的是 insert 或者 update 语句的话,它会抛出错误信
息为 “executeQuery method can not be used for update”的java.util.SQLException。
Statement 的 executeUpdate(String query)方法用来执行 insert 或者 update/delete
(DML)语句,或者 什么也不返回 DDL 语句。返回值是 int 类型,如果是 DML 语句的话,它
就是更新的条数,如果是 DDL 的话,就返回 0。
只有当你不确定是什么语句的时候才应该使用 execute()方法,否则应该使用 executeQuery
或者 executeUpdate 方法。
7.JDBC 的 PreparedStatement 是什么?
PreparedStatement 对象代表的是一个预编译的 SQL 语句。用它提供的 setter 方法可以传
入查询的变量。由于 PreparedStatement 是预编译的,通过它可以将对应的 SQL 语句高效的
执行多次。由于 PreparedStatement 自动对特殊字符转义,避免了 SQL 注入攻击,因此应当
尽量的使用它。PreparedStatement 中如何注入 NULL 值?
可以使用它的 setNull 方法来把 null 值绑定到指定的变量上。setNull 方法需要传入参数
的索引以及 SQL 字段的类型,像这样:
ps.setNull(10, java.sql.Types.INTEGER);.
Statement 中的 getGeneratedKeys 方法有什么用?
有的时候表会生成主键,这时候就可以用 Statement 的 getGeneratedKeys()方法来获取这
个自动生成的主键的值了。相对于 Statement,PreparedStatement 的优点是什么?
它和 Statement 相比优点在于:PreparedStatement 有助于防止 SQL 注入,因为它会自动对
特殊字符转义。PreparedStatement 可以用来进行动态查询。PreparedStatement 执行更快。
尤其当你重用它或者使用它的拼量查询接口执行多条语句时。使用 PreparedStatement 的
setter 方法更容易写出面向对象的代码,而 Statement 的话,我们得拼接字符串来生成查
询语句。如果参数太多了,字符串拼接看起来会非常丑陋并且容易出错。
8.PreparedStatement 的缺点是什么,怎么解决这个问题?
PreparedStatement 的一个缺点是,我们不能直接用它来执行 in 条件语句;需要执行 IN
剩余19页未读,继续阅读
傅融
- 粉丝: 23
- 资源: 333
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0