文章目录
- Q1:什么是JDBC?
- Q2:原生 JDBC操作数据库流程?
- Q3:JDBC中的Statement 和PreparedStatement的区别?
- Q4:关系数据库中连接池的机制是什么?
- Q5:JDBC是如何实现的Java程序和JDBC驱动的松耦合的?
- Q6:有哪些不同的结果集?
- Q7:常见的JDBC异常有哪些?
- Q8:JDBC的DataSource是什么,有什么好处?
- Q9:execute,executeQuery,executeUpdate的区别是什么?
- Q10:数据库连接池的原理。为什么要使用连接池?
- Q11:JDBC的DriverManager是用来做什么的?
- Q12:RowSet和ResultSet的区别?
Q1:什么是JDBC?
JDBC: 全称是Java DataBase Connection
,也就是 Java数据库连接
,我们可以用它来操作关系型数据库。
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则
,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
Q2:原生 JDBC操作数据库流程?
Class.forName()
加载数据库连接驱动;DriverManager.getConnection()
获取数据连接对象(conn
);- 根据SQL获取sql会话对象。有 2 种方式 Statement、PreparedStatement ;
- 执行SQL处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
- 关闭结果集、关闭会话、关闭连接。
Q3:JDBC中的Statement 和PreparedStatement的区别?
(1)PreparedStatement 继承于 Statement,PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
(2)作为Statement的子类 ,PreparedStatement继承了 Statement 的所有功能 。三 种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。
(3)Statement 一般用于执行固定的没有参数的SQL。
PreparedStatement 一般用于执行有 ?参数预编译的SQL语句。 P
reparedStatement支持?
操作参数,相对于Statement更加灵活。
(4)PreparedStatement可以防止SQL注入,安全性高于Statement。
在 JDBC 应用中,在任何时候都不要使用 Statement,原因如下:
① 代码的可读性和可维护性
。Statement 需要不断地拼接,而 PreparedStatement 不会。
② PreparedStatement 尽最大可能提高性能
。DB 有缓存机制,相同的预编译语句再次被调用不会再次需要编译。
③ 最重要的一点是极大地提高了安全性
。Statement 容易被 SQL 注入,而PreparedStatement 传入的内容不会和 sql 语句发生任何匹配关系。
Q4:关系数据库中连接池的机制是什么?
前提: 为数据库连接建立一个缓冲池。
(1)从连接池获取或创建可用连接。
(2)使用完毕之后,把连接返回给连接池。
(3)在系统关闭前,断开所有连接并释放连接占用的系统资源。
(4)能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。
Q5:JDBC是如何实现的Java程序和JDBC驱动的松耦合的?
(1)通过制定接口
,数据库厂商来实现。我们只要通过接口调用即可。
(2)驱动只有在通过的Class.forName
反射机制来加载的时候才会出现。
Q6:有哪些不同的结果集?
1、一共有三种ResultSet对象。
ResultSet.TYPE_FORWARD_ONLY
:这是默认的类型,它的游标只能往下移。
ResultSet.TYPE_SCROLL_INSENSITIVE
:游标可以上下移动,一旦它创建后,数据库里的数据再发生修改,对它来说是透明的。
ResultSet.TYPE_SCROLL_SENSITIVE
:游标可以上下移动,如果生成后数据库还发生了修改操作,它是能够感知到的。
2、ResultSet中有两种并发类型。
ResultSet.CONCUR_READ_ONLY
:ResultSet是只读的,这是默认类型。
ResultSet.CONCUR_UPDATABLE
:我们可以使用的ResultSet的更新方法来更新里面的数据。
Q7:常见的JDBC异常有哪些?
java.sql.SQLException
:JDBC异常的基类。
java.sql.BatchUpdateException
:当批处理操作执行失败的时候可能会抛出这个异常。这取决于具体的JDBC驱动的实现,它也可能直接抛出基类异常java.sql.SQLException中。
java.sql.SQLWarning
:SQL操作出现的警告信息。
java.sql.DataTruncation
:字段值由于某些非正常原因被截断了
Q8:JDBC的DataSource是什么,有什么好处?
DataSource即数据源,它是定义在javax.sql
中的一个接口,跟DriverManager
相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:
-
缓存PreparedStatement以便更快的执行
-
可以设置连接超时时间
-
提供日志记录的功能
-
ResultSet大小的最大阈值设置
-
通过JNDI的支持,可以为servlet容器提供连接池的功能
Q9:execute,executeQuery,executeUpdate的区别是什么?
boolean execute()
可以用来执行任意SQL语句,返回一个boolean的值,表明该语句是否返回了一个结果集对象ResultSet。
int executeUpdate()
用来执行修改,插入,删除操作。(执行SELECT会抛出异常)
ResultSet executeQuery()
只能进行SELECT,从而得到结果集对象。(DELETE、UPDATE、INSERT操作都会抛出异常)
通常我们不使用execute,如果你不知道要执行的SQL语句是什么类型的,就可以使用execute。
Q10:数据库连接池的原理。为什么要使用连接池?
1. 数据库连接池的原理?
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2. 为什么要使用连接池?
数据库连接是一种关键的,有限的,昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
Q11:JDBC的DriverManager是用来做什么的?
JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。
Connection conn = DriverManager.getConnection();
当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面,然后我们会把数据库配置信息传成DriverManager.getConnection()
方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。
Q12:RowSet和ResultSet的区别?
public interface RowSet extends ResultSet
RowSet继承自ResultSet
,因此它有ResultSet的全部功能,同时它自己添加了些额外的特性。
RowSet一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。