JDBC学习(复习)-面试总结详细

news2025/7/14 20:40:37

JDBC详细介绍

  • 一、JDBC详细介绍
  • 二、jdbc面试总结
    • 2.1 JDBC操作数据库的步骤 ?
    • 2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的区别?
    • 2.3 JDBC中大数据量的分页解决方法?
    • 2.4 说说数据库连接池工作原理和实现方案?
      • 2.4.1 工作原理
      • 2.4.2 实现方案
    • 2.5 Java中如何进行事务的处理?
    • 2.6 修改JDBC代码质量
    • 2.7 写出一段JDBC连接本机MySQL数据库的代码
    • 2.8 JDBC是如何实现Java程序和JDBC驱动的松耦合的?
    • 2.9 execute,executeQuery,executeUpdate的区别是什么?
    • 2.10 PreparedStatement的缺点是什么,怎么解决这个问题?
    • 2.11 JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?
    • 2.12. 什么是幻读,哪种隔离级别可以防止幻读?
    • 2.13 JDBC的DriverManager是用来做什么的?
    • 2.14 ResultSet
      • 2.14.1 JDBC的ResultSet是什么?
      • 2.14.2 有哪些不同的ResultSet?
    • 2.15 JDBC的DataSource是什么,有什么好处?
    • 2.16 常见的JDBC异常有哪些?
    • 2.17 JDBC的RowSet是什么,有哪些不同的RowSet?
    • 2.18 JDBC中存在哪些不同类型的锁?
    • 2.19 什么是JDBC的最佳实践?

一、JDBC详细介绍

参考链接: JDBC详细全解(示例超多)

在这里插入图片描述

二、jdbc面试总结

2.1 JDBC操作数据库的步骤 ?

  1. 注册数据库驱动。
  2. 建立数据库连接。
  3. 创建一个Statement。
  4. 执行SQL语句。
  5. 处理结果集。
  6. 关闭数据库连接
    代码如下:
Connection connection = null;
       Statement statement = null;
       ResultSet resultSet = null;
       try {
           /*加载驱动有两种方式:
            * 1:会导致驱动会注册两次,过度依赖于mysql的api,脱离的mysql的开发包,程序则无法编译
            * 2:驱动只会加载一次,不需要依赖具体的驱动,灵活性高
            *我们一般都是使用第二种方式
            * */
           //1.
           //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
           //2.
           Class.forName("com.mysql.jdbc.Driver");
           //获取与数据库连接的对象-Connetcion
           connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "root");
           //获取执行sql语句的statement对象
           statement = connection.createStatement();
           //执行sql语句,拿到结果集
           resultSet = statement.executeQuery("SELECT * FROM users");
           //遍历结果集,得到数据
           while (resultSet.next()) {
               System.out.println(resultSet.getString(1));
               System.out.println(resultSet.getString(2));
           }
       } catch (SQLException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       } finally {
           /*关闭资源,后调用的先关闭
            * 关闭之前,要判断对象是否存在
            * */
           if (resultSet != null) {
               try {
                   resultSet.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
           if (statement != null) {
               try {
                   statement.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
           if (connection != null) {
               try {
                   connection.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }

2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的区别?

区别:

  • PreparedStatement:是预编译的SQL语句,效率高于Statement。
  • PreparedStatement:支持操作符,相对于Statement更加灵活。
  • PreparedStatement:可以防止SQL注入,安全性高于Statement。
  • CallableStatement:适用于执行存储过程。

2.3 JDBC中大数据量的分页解决方法?

 最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。

mysql语法:
1
oracle语法:
2

2.4 说说数据库连接池工作原理和实现方案?

2.4.1 工作原理

  JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。

2.4.2 实现方案

  连接池使用集合来进行装载,返回的Connection是原始Connection的代理,代理Connection的close方法,当调用close方法时,不是真正关连接,而是把它代理的Connection对象放回到连接池中,等待下一次重复利用。

代码如下:
3

2.5 Java中如何进行事务的处理?

  事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性 (ACID) ,称为原子性、一致性、隔离性和持久性,只有这样才能成为一个事务。
Connection类中提供了4个事务处理方法:

  • setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交,即为true,通过设置false禁止自动提交事务;
  • commit():提交事务;
  • rollback():回滚事务.
  • savepoint:保存点
    注意:savepoint不会结束当前事务,普通提交和回滚都会结束当前事务的

2.6 修改JDBC代码质量

 下述程序是一段简单的基于JDBC的数据库访问代码,实现了以下功能:从数据库中查询product表中的所有记录,然后打印输出到控制台.该代码质量较低,如没有正确处理异常,连接字符串以”魔数”的形式直接存在于代码中等,请用你的思路重新编写程序,完成相同的功能,提高代码质量。

修改前代码:
4

修改的点:
1、url、password等信息不应该直接使用字符串“写死”,可以使用常量代替
2、catch中应该回滚事务,抛出RuntimeException也是回滚事务的一种方法
3、关闭资源

修改后代码:5
6

2.7 写出一段JDBC连接本机MySQL数据库的代码

7

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

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

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

  1. execute:
     Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。
  2. executeQuery:
     Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。
  3. executeUpdate:
     Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回DDL语句。返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。

注意:只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。

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

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

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

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

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

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

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

  • 已读提交: Read committed【TRANSACTION_READ_COMMITTED】
  • 可重复读: Repeatable read【TRANSACTION_REPEATABLE_READ】
  • 串行化:Serializable【TRANSACTION_SERIALIZABLE】

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

幻读是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
只有串行化(TRANSACTION_SERIALIZABLE)隔离级别才能防止产生幻读。

2.13 JDBC的DriverManager是用来做什么的?

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

2.14 ResultSet

2.14.1 JDBC的ResultSet是什么?

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

2.14.2 有哪些不同的ResultSet?

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

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

 ResultSet有两种并发类型。

  • ResultSet.CONCUR_READ_ONLY:ResultSet是只读的,这是默认类型。
  • ResultSet.CONCUR_UPDATABLE:我们可以使用ResultSet的更新方法来更新里面的数据。

2.15 JDBC的DataSource是什么,有什么好处?

 DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:

  1. 缓存PreparedStatement以便更快的执行
  2. 可以设置连接超时时间
  3. 提供日志记录的功能
  4. ResultSet大小的最大阈值设置
  5. 通过JNDI的支持,可以为servlet容器提供连接池的功能

2.16 常见的JDBC异常有哪些?

有以下这些:

  • java.sql.SQLException:这是JDBC异常的基类。
  • java.sql.BatchUpdateException:当批处理操作执行失败的时候可能会抛出这个异常。这取决于具体的JDBC驱动的实现,它也可能直接抛出基类异常java.sql.SQLException。
  • java.sql.SQLWarning:SQL操作出现的警告信息。
  • java.sql.DataTruncation:字段值由于某些非正常原因被截断了(不是因为超过对应字段类型的长度限制)。

问题1: SQLWarning是什么,在程序中如何获取SQLWarning?
  SQLWarning是SQLException的子类,通过Connection, Statement, Result的getWarnings方法都可以获取到它。 SQLWarning不会中断查询语句的执行,只是用来提示用户存在相关的警告信息。

如果java.sql.SQLException: No suitable driver found该怎么办?
  如果你的SQL URL串格式不正确的话,就会抛出这样的异常。不管是使用DriverManager还是JNDI数据源来创建连接都有可能抛出这种异常。它的异常栈看起来会像下面这样。
2
解决这类问题的方法就是,检查下日志文件,像上面的这个日志中,URL串是’jdbc:mysql://localhost:3306/UserDB,只要把它改成jdbc:mysql://localhost:3306/UserDB就好了。

2.17 JDBC的RowSet是什么,有哪些不同的RowSet?

 RowSet用于存储查询的数据结果,和ResultSet相比,它更具灵活性。RowSet继承自ResultSet,因此ResultSet能干的,它们也能,而ResultSet做不到的,它们还是可以。RowSet接口定义在javax.sql包里。
 RowSet提供的额外的特性有:

  1. 提供了Java Bean的功能,可以通过settter和getter方法来设置和获取属性。RowSet使用了JavaBean的事件驱动模型,它可以给注册的组件发送事件通知,比如游标的移动,行的增删改,以及RowSet内容的修改等。
  2. RowSet对象默认是可滚动,可更新的,因此如果数据库系统不支持ResultSet实现类似的功能,可以使用RowSet来实现。
     RowSet分为两大类:
  • 连接型RowSet:这类对象与数据库进行连接,和ResultSet很类似。JDBC接口只提供了一种连接型RowSet,javax.sql.rowset.JdbcRowSet,它的标准实现是com.sun.rowset.JdbcRowSetImpl。
  • 离线型RowSet:这类对象不需要和数据库进行连接,因此它们更轻量级,更容易序列化。它们适用于在网络间传递数据。
     有四种不同的离线型RowSet的实现。
  • CachedRowSet:可以通过他们获取连接,执行查询并读取ResultSet的数据到RowSet里。我们可以在离线时对数据进行维护和更新,然后重新连接到数据库里,并回写改动的数据。
  • WebRowSet:继承自CachedRowSet,他可以读写XML文档。
  • JoinRowSet:继承自WebRowSet,它不用连接数据库就可以执行SQL的join操作。
  • FilteredRowSet:继承自WebRowSe,我们可以用它来设置过滤规则,这样只有选中的数据才可见。

2.18 JDBC中存在哪些不同类型的锁?

从广义上讲,有两种锁机制来防止多个用户同时操作引起的数据损坏。

  1. 乐观锁:只有当更新数据的时候才会锁定记录。
  2. 悲观锁:从查询到更新和提交整个过程都会对数据记录进行加锁。

2.19 什么是JDBC的最佳实践?

  1. 数据库资源是非常昂贵的,用完了应该尽快关闭它。Connection, Statement, ResultSet等JDBC对象都有close方法,调用它就好了。
  2. 养成在代码中显式关闭掉ResultSet,Statement,Connection的习惯,如果你用的是连接池的话,连接用完后会放回池里,但是没有关闭的ResultSet和Statement就会造成资源泄漏了。
  3. 在finally块中关闭资源,保证即便出了异常也能正常关闭。
  4. 大量类似的查询应当使用批处理完成。
  5. 尽量使用PreparedStatement而不是Statement,以避免SQL注入,同时还能通过预编译和缓存机制提升执行的效率。
  6. 如果你要将大量数据读入到ResultSet中,应该合理的设置fetchSize以便提升性能。
  7. 你用的数据库可能没有支持所有的隔离级别,用之前先仔细确认下。
  8. 数据库隔离级别越高性能越差,确保你的数据库连接设置的隔离级别是最优的。
  9. 如果在WEB程序中创建数据库连接,最好通过JNDI使用JDBC的数据源,这样可以对连接进行重用。
  10. 如果你需要长时间对ResultSet进行操作的话,尽量使用离线的RowSet。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九方财富冲刺上市:付费用户开始减少,退款金额飙升至4.9亿元

日前,九方财富控股有限公司(下称“九方财富”)通过港交所上市聆讯,并披露了聆讯后招股书。据贝多财经了解,九方财富最早于2021年8月31日在港交所递表,后在2022年3月、9月分别进行了更新。 据每日经济新闻报…

vue3.0 模板语法

文章目录前言:1. 内容渲染指令1.1 v-text1.2 {{ }}插值表达式1.3 v-html2. 双向绑定指令2.1 v-model2.2 v-model的修饰符3. 属性绑定指令3.1 动态绑定多个属性值3.2 绑定class和style属性4.条件渲染指令4.1 v-if、v-else-if、v-else4.2 v-show4.3 v-if与v-show的区别…

RebbitMQ 消息队列(简单使用)

消息队列介绍 MQ的优势 1.业务解耦:不同系统消费信息互不关联,灵活增减系统数量,修改某个系统其他系统也不影响 2.异步提速:不同系统之间可同时响应,提升并发量 3.削峰填谷:处理消息高峰期,均摊…

《图机器学习》-Graph Neural Network

前言 回顾之前的Node Embedding: 将图中的节点嵌入到d维空间,并确保图中相似的节点能够嵌在一起。 即学习一个编码器ENCENCENC确保图的节点嵌入到embedding space依然能够描述原空间节点之间的相似性。 在Node Embedding中,我们需要设计&…

DEXTUpload .NET增强的上传速度和可靠性

DEXTUpload .NET增强的上传速度和可靠性 DEXTUpload.NET Pro托管在Windows操作系统上的Internet Information Server(IIS)上,服务器端组件基于HTTP协议,支持从web浏览器到web服务器的文件上载。它也可以在ASP.NET服务器应用程序平台开发的任何网站上使用…

记一次攻防演练溯源实例

缘起 在今年的攻防期间,通过安全设备告警分析,需要对某个源攻击IP进行溯源反制,并且需要记录整个溯源过程和提交溯源报告。 开展溯源 研判 在溯源之前,首先应该判断是否真的存在攻击行为,攻击的特征,攻…

Linux学习(7.5)linux目录配置与重点回顾

鸟哥的 Linux 私房菜 -- Linux 的文件权限与目录配置 (vbird.org) 怎么记啊,直接点进去看吧 目录 Linux目录配置的依据--FHS 绝对路径与相对路径 重点回顾 以下内容转载自鸟哥的Linux私房菜 Linux目录配置的依据--FHS 是希望让使用者可以了解到已安装软件通常…

ARouter::Compiler The user has configuration the module name, it was

学习组件化使用的是阿里的ARouter,我是照着案例敲的,在编译的时候报了这么一个错。 我查了好多资料,大部分都是说build.gradle 配置出现了问题,比如没有配置 javaCompileOptions {annotationProcessorOptions {arguments [AROUTE…

shader(光栅化)

1.定义将模型经过mvp得到的标准立方体映射到屏幕。屏幕是像素数组组成,像素是一个颜色均匀的小方块。2.屏幕变换矩阵3.直接采样(锯齿严重)4.先模糊再采样(抗锯齿有好转)5.傅里叶变换6.高通滤波(图像边界&am…

robot remote server用这个server去远程获取ip

server端配置: 1、安装python环境 2、下载robot remote server 下载地址:https://pypi.python.org/pypi/robotremoteserver/(不要用pip下载,把robotremoteserver.py文件下载下来) 3、首先创建一个目录E:\rfremote\ &a…

canvas初学2

一、碰撞检测 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Linux下java服务占用cpu过高如何处理

Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…

在windows11上安装openssh服务端并修改端口号

在windows11上安装openssh服务端并修改端口号 目录1.软件下载地址2.修改端口3.启动ssh原文链接&#xff1a;https://blog.csdn.net/qq_62129885/article/details/1268467751.软件下载地址 Release v9.2.0.0p1-Beta PowerShell/Win32-OpenSSH (github.com) https://github.co…

【BBuf的CUDA笔记】八,对比学习OneFlow 和 FasterTransformer 的 Softmax Cuda实现

0x1. OneFlow/FasterTransformer SoftMax CUDA Kernel 实现学习 这篇文章主要学习了oneflow的softmax kernel实现以及Faster Transformer softmax kernel的实现&#xff0c;并以个人的角度分别解析了原理和代码实现&#xff0c;最后对性能做一个对比方便大家直观的感受到onefl…

光伏行业规模“狂飙”至87.41GW,机器视觉检测成保量提质“王牌”?

在产业政策引导和市场需求驱动的双重作用下&#xff0c;我国光伏产业已成为具备国际竞争优势的产业&#xff0c;在制造规模、技术水平和市场份额等方面均位居全球前列。近日&#xff0c;国家能源局公布了2022年光伏新增装机规模&#xff1a;87.41GW&#xff0c;增长率59.27%。行…

一文带你了解MySQL的Server层和引擎层是如何交互的?

对于很多开发小伙伴来说&#xff0c;每天写SQL是必不可少的一项工作。 那不知道大家有没有深入了解过&#xff0c;当我们的一条SQL命令被执行时&#xff0c;MySQL是如何把数据从硬盘/内存中查出来并展示到用户面前的呢&#xff1f; 其实&#xff0c;MySQL也没有大家想象的那么…

DateTimeParseException

前端请求为字符串的时间格式2023-02-16 19:19:51&#xff0c;服务端用LocalDateTime类型接收时报解析异常java.time.format.DateTimeParseException: Text 2023-02-16 19:19:51 could not be parsed at index 10方法一&#xff1a;JsonFormat(shape Shape.STRING, pattern &q…

第四章.神经网络—BP神经网络

第四章.神经网络 4.3 BP神经网络 BP神经网络(误差反向传播算法)是整个人工神经网络体系中的精华&#xff0c;广泛应用于分类识别&#xff0c;逼近&#xff0c;回归&#xff0c;压缩等领域&#xff0c;在实际应用中&#xff0c;大约80%的神经网络模型都采用BP网络或BP网络的变化…

详解Ubuntu1804安装Anaconda(附网盘极速下载链接)

2022版的anaconda下载如下 百度网盘链接链接&#xff1a;https://pan.baidu.com/s/1RZICFpR_MYVxOxHzEbStRg 提取码&#xff1a;z864 下面是具体的安装过程 1、进入下载文件存放的位置打开终端运行.sh文件&#xff1a;&#xff08;我本人的下载位置就在“下载”里面&#x…

【ROS学习笔记3】ROS的架构

【ROS学习笔记3】ROS的架构 文章目录【ROS学习笔记3】ROS的架构零、前言一、ROS系统文件二、ROS文件系统相关命令三、ROS计算图四、Reference写在前面&#xff0c;本系列笔记参考的是AutoLabor的教程&#xff0c;具体项目地址在 这里 零、前言 从系统架构方面来看&#xff0c;…