JDBC面试题都在这里(三)

简介: 以下我是归纳的JDBC知识点

JDBC是如何实现Java程序和JDBC驱动的松耦合的?


JDBC是如何实现Java程序和JDBC驱动的松耦合的?

通过制定接口,数据库厂商来实现。我们只要通过接口调用即可。随便看一个简单的JDBC示例,你会发现所有操作都是通过JDBC接口完成的,而驱动只有在通过Class.forName反射机制来加载的时候才会出现。



execute,executeQuery,executeUpdate的区别是什么?



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方法。


PreparedStatement的缺点是什么,怎么解决这个问题?


PreparedStatement的缺点是什么,怎么解决这个问题?

PreparedStatement的一个缺点是,我们不能直接用它来执行in条件语句;需要执行IN条件语句的话,下面有一些解决方案:

  • 分别进行单条查询——这样做性能很差,不推荐。
  • 使用存储过程——这取决于数据库的实现,不是所有数据库都支持。
  • 动态生成PreparedStatement——这是个好办法,但是不能享受PreparedStatement的缓存带来的好处了。
  • 在PreparedStatement查询中使用NULL值——如果你知道输入变量的最大个数的话,这是个不错的办法,扩展一下还可以支持无限参数。



JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?


JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

脏读:一个事务读取到另外一个事务未提交的数据

例子:A向B转账,A执行了转账语句,但A还没有提交事务,B读取数据,发现自己账户钱变多了!B跟A说,我已经收到钱了。A回滚事务【rollback】,等B再查看账户的钱时,发现钱并没有多。

下面的三种个隔离级别都可以防止:

  • Serializable【TRANSACTION_SERIALIZABLE】
  • Repeatable read【TRANSACTION_REPEATABLE_READ】
  • Read committed【TRANSACTION_READ_COMMITTED】



什么是幻读,哪种隔离级别可以防止幻读?


什么是幻读,哪种隔离级别可以防止幻读?

是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。



JDBC的DriverManager是用来做什么的?


JDBC的DriverManager是用来做什么的?

  • JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。
  • 当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面
  • 然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序



JDBC的ResultSet是什么? ##


JDBC的ResultSet是什么?

  • 在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
  • ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。
  • 默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的ResultSet
  • 当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。
  • 可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。



有哪些不同的ResultSet?

有哪些不同的ResultSet?

根据创建Statement时输入参数的不同,会对应不同类型的ResultSet。如果你看下Connection的方法,你会发现createStatement和prepareStatement方法重载了,以支持不同的ResultSet和并发类型。

一共有三种ResultSet对象。

  • ResultSet.TYPE_FORWARD_ONLY:这是默认的类型,它的游标只能往下移。
  • ResultSet.TYPE_SCROLL_INSENSITIVE:游标可以上下移动,一旦它创建后,数据库里的数据再发生修改,对它来说是透明的。
  • ResultSet.TYPE_SCROLL_SENSITIVE:游标可以上下移动,如果生成后数据库还发生了修改操作,它是能够感知到的。

ResultSet有两种并发类型。

  • ResultSet.CONCUR_READ_ONLY:ResultSet是只读的,这是默认类型
  • ResultSet.CONCUR_UPDATABLE:我们可以使用ResultSet的更新方法来更新里面的数据。
目录
相关文章
|
7月前
|
存储 SQL Java
Java面试题之数据库与JDBC 部分
106、有 3 个表(15 分钟):【基础】 Student 学生表 (学号,姓名,性别,年龄,组织部门) Course 课程表 (编号,课程名称 Sc 选课表 (学号,课程编号,成绩) 表结构如下:
18 0
|
Java 数据库连接 开发者
java面试题:在Spring框架中如何更有效地使用JDBC?
java面试题:在Spring框架中如何更有效地使用JDBC?
java面试题:在Spring框架中如何更有效地使用JDBC?
|
Java 数据库连接 数据库
java面试题:解释JDBC抽象和DAO模块?
java面试题:解释JDBC抽象和DAO模块?
java面试题:解释JDBC抽象和DAO模块?
|
SQL 存储 Java
|
缓存 Oracle Java
JDBC面试题都在这里(四)
以下我是归纳的JDBC知识点
145 0
|
Oracle Java 关系型数据库
JDBC面试题都在这里(二)
以下我是归纳的JDBC知识点
107 0
|
SQL 存储 移动开发
JDBC面试题都在这里(一)
以下我是归纳的JDBC知识点
183 0
JDBC面试题都在这里(一)
|
缓存 前端开发 安全