版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaJDBC高频面试题及详细答案(实战版)一、基础概念类1、什么是JDBC?JDBC的核心作用是什么?JDBC全称JavaDatabaseConnectivity,是Java官方提供的一套操作数据库的标准API规范,并非独立框架或工具。核心作用:统一Java程序操作各类关系型数据库的接口,屏蔽不同数据库(MySQL、Oracle、SQLServer)的底层语法差异。开发者只需掌握一套JDBCAPI,更换数据库时仅需替换驱动和连接参数,无需大规模修改业务代码,实现Java程序对数据库的通用访问。2、JDBC的核心组件有哪些?各自作用是什么?JDBC五大核心组件,是数据库操作的基础核心:Driver(数据库驱动):数据库厂商实现的JDBC接口实现类,负责适配对应数据库的通信协议,是Java程序和数据库的通信桥梁,不同数据库对应不同驱动。DriverManager(驱动管理类):工具类,核心功能是加载数据库驱动、根据连接参数获取数据库连接对象,管理所有注册的数据库驱动。Connection(数据库连接):代表Java程序与数据库的单次会话连接,所有数据库的增删改查、事务操作都必须基于该对象完成。Statement/PreparedStatement(执行语句对象):用于编写、执行SQL语句,将Java中的SQL指令传递给数据库执行。ResultSet(结果集):封装数据库查询后的返回数据,是一个数据游标,用于遍历读取查询结果。3、JDBC完整执行流程是什么?标准开发流程,也是面试必背流程,共6步:加载数据库驱动:通过反射加载对应数据库的驱动类,注册到DriverManager中;获取数据库连接:通过DriverManager传入URL、用户名、密码,获取Connection连接;创建SQL执行对象:根据需求创建Statement或PreparedStatement对象;执行SQL语句:调用executeUpdate()(增删改)或executeQuery()(查询)执行SQL;处理返回结果:查询操作遍历ResultSet结果集,增删改获取受影响行数;关闭资源:逆序关闭ResultSet、Statement、Connection,释放数据库资源。二、核心原理与区别类(高频重点)4、Statement和PreparedStatement有什么区别?工作中为什么优先使用PreparedStatement?两者核心区别及实战选型原因如下:(1)语法与执行方式不同Statement直接拼接完整SQL语句执行,每次执行都会重新编译SQL;PreparedStatement支持预编译SQL,使用?作为占位符,通过参数赋值填充数据。(2)安全性不同(核心优势)Statement存在SQL注入漏洞,直接拼接用户输入参数,恶意输入会篡改SQL逻辑、泄露或删除数据;PreparedStatement预编译机制会固定SQL结构,参数仅作为纯数据传入,彻底杜绝SQL注入。(3)性能不同PreparedStatement支持SQL预编译和缓存,同一SQL模板多次执行时,无需重复编译,执行效率更高;Statement每次执行都要重新解析、编译SQL,频繁操作性能较差。(4)参数处理便利性不同Statement需要手动拼接字符串,极易出现语法错误、引号匹配问题;PreparedStatement可通过setXXX()方法精准设置各类数据类型参数,代码更简洁、容错率更高。总结:工作中除静态固定SQL外,一律使用PreparedStatement。5、什么是SQL注入?举一个简单案例SQL注入是一种常见的网络攻击手段,攻击者通过恶意拼接用户输入参数,篡改原有SQL语句的执行逻辑,非法操作数据库数据。案例(登录漏洞):原始SQL:select*fromuserwhereusername='"+name+"'andpassword='"+pwd+"'用户输入用户名:admin'--,密码任意输入拼接后SQL:select*fromuserwhereusername='admin'--'andpassword='123'数据库中--是注释符,后续密码校验逻辑被注释,攻击者无需密码即可登录管理员账号。6、execute、executeQuery、executeUpdate三者区别?三个方法均为SQL执行方法,适配不同SQL场景,返回值不同:executeQuery():仅执行查询SQL(select),返回ResultSet结果集,用于读取数据,无返回结果会返回空结果集,不会报错。executeUpdate():仅执行增删改SQL(insert/update/delete),以及DDL语句(建表、删表),返回int类型数值,代表SQL执行后受影响的数据库行数。execute():通用执行方法,可执行任意SQL语句,返回boolean值。true代表执行结果是查询结果(有ResultSet),false代表执行结果为更新行数或无结果。通用性强但性能低,开发中极少使用。7、JDBC事务的四大特性及默认事务机制?如何手动控制事务?(1)事务四大特性(ACID)原子性:事务内所有操作要么全部成功,要么全部失败回滚,不可部分执行。一致性:事务执行前后,数据库数据的完整性、约束关系保持一致,不会出现数据错乱。隔离性:多个并发事务之间相互隔离,互不干扰,避免脏读、不可重复读、幻读问题。持久性:事务提交成功后,数据会永久写入数据库,即使程序或服务器宕机,数据也不会丢失。(2)JDBC默认事务机制JDBC默认开启自动提交事务(autoCommit=true),每执行一条SQL语句,都会自动提交一次事务。(3)手动事务控制步骤获取Connection连接后,手动关闭自动提交:connection.setAutoCommit(false);批量执行多条业务SQL语句;无异常时,手动提交事务:mit();出现异常时,捕获异常并回滚事务:connection.rollback();最终关闭资源。8、JDBC中脏读、不可重复读、幻读分别是什么?数据库默认隔离级别?(1)三类读问题脏读:一个事务读取到了另一个事务未提交的修改数据,后续对方事务回滚,当前读取的数据为无效脏数据。不可重复读:同一事务内,两次读取同一条数据,结果不一致。原因是中间被其他事务修改并提交数据。幻读:同一事务内,两次查询批量数据,总数不一致。原因是中间被其他事务新增或删除数据。(2)常用隔离级别及适配性读未提交:允许三类问题,无实际使用价值;读已提交(MySQL默认):解决脏读,存在不可重复读、幻读;可重复读:解决脏读、不可重复读,存在幻读;串行化:解决所有问题,事务串行执行,性能最低。MySQLInnoDB默认隔离级别:可重复读。三、实操与异常问题类9、JDBC为什么必须手动关闭资源?关闭顺序是什么?(1)必须关闭的原因Connection、Statement、ResultSet均为数据库资源,不属于JVM内存资源,JVM垃圾回收机制无法自动释放。如果不手动关闭,会造成数据库连接泄露、游标泄露,导致数据库连接池耗尽、数据库卡死、程序报错。(2)标准关闭顺序逆序关闭:ResultSet→Statement→Connection原因:外层资源依赖内层资源,先关闭依赖的子资源,再关闭主连接资源,避免资源占用残留。实战开发中统一使用try-finally关闭资源,确保无论程序正常或异常,资源都能释放。10、ResultSet结果集的原理?为什么不建议长期持有ResultSet?ResultSet是一个数据库游标对象,并非一次性加载所有数据到内存,而是通过游标逐行从数据库读取数据,底层依赖打开的Connection连接。不建议长期持有的原因:长期持有会持续占用数据库连接和游标资源,导致连接池资源紧张;Connection关闭后,ResultSet会立即失效,直接使用会报异常;大数据量查询时,长期持有会增加数据库IO压力,降低程序性能。实战中一般读取数据后立即封装为Java实体对象,随即关闭结果集。11、JDBC出现连接超时、连接泄露的常见原因及解决方案?常见原因资源未关闭:异常场景下未执行close方法,导致连接无法回收;事务未提交/回滚:手动事务代码中,异常未回滚,连接一直处于占用状态;SQL执行耗时过长:慢查询长时间占用连接,导致连接超时;连接池参数配置不合理:最大连接数过小、超时时间过短。解决方案统一通过try-finally关闭所有JDBC资源;规范手动事务逻辑,保证异常必回滚;优化慢SQL,添加索引、限制查询数据量;合理配置连接池超时、回收参数,定时回收空闲连接。四、连接池与进阶优化类(中高级面试)12、为什么需要数据库连接池?原生JDBC连接有什么弊端?原生JDBC弊端每次数据库操作都需要新建连接、认证、关闭连接,连接创建销毁是高耗时操作,频繁操作会严重拖累系统性能,无法支撑高并发场景。连接池核心作用程序启动时预先创建一批数据库连接,存入连接池统一管理,业务操作时直接从池中获取连接,使用完毕后归还池内,无需频繁创建销毁。大幅提升并发处理能力,减少资源消耗。常用连接池:HikariCP、Druid、C3P0,目前主流使用HikariCP(SpringBoot默认)和Druid。13、PreparedStatement预编译原理?预编译是否一定能提升性能?预编译原理:数据库接收到带占位符的SQL模板后,会先解析语法、生成执行计划并缓存,后续传入不同参数执行时,无需重复解析编译,直接复用执行计划。注意:预编译仅对同模板多次执行的SQL有性能提升。如果是仅执行一次的SQL,预编译会增加少量缓存开销,性能和Statement基本一致,无明显优势。但即便如此,依然优先使用PreparedStatement,核心是为了防SQL注入。14、JDBC批量插入数据的实现方式?如何优化批量写入性能?基础批量实现通过PreparedStatement的addBatch()添加批量参数,executeBatch()批量执行SQL。核心优化手段关闭自动提交:批量插入时关闭autoCommit,所有数据插入完成后统一提交,减少事务日志开销;开启数据库批量重写参数:MySQL添加rewriteBatchedStatements=true连接参数,支持批量SQL重写,大幅提升插入效率;分批批量插入:避免一次性插入海量数据,防止内存溢出、数据库锁表,分批提交;禁用临时校验:大批量导入时可临时关闭主键、唯一索引校验,完成后再恢复。15、JDBC中大数据量查询如何避免内存溢出(OOM)?普通查询会将所有结果一次性加载到内存,数据量过大会导致OOM,解决方案:开启流式查询:MySQL通过设置fetchSize为Integer.MIN_VALUE,开启游标流式读取,逐行加载数据,不一次性加载全量数据;分页查询:通过limit分页,分批查询、分批处理;结果集只读、向前遍历:设置ResultSet为TYPE_FORWARD_ONLY、CONCUR_READ_ONLY,减少内存占用。五、易错冷门面试题16、Class.forName()加载驱动的作用?JDBC4.0之后还需要手动加载驱动吗?早期JDBC版本中,Class.forName("驱动类全限定名")的作用是通过反射加载驱动类,触发驱动的静态代码块,将驱动注册到DriverManager中,否则无法获取数据库连接。JDBC4.0及以上版本无需手动加载驱动。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届吉林省农安县第四中学八年级数学第一学期期末经典试题含解析
- 2027届安徽省宿州市埇桥区教育集团七上数学期末质量跟踪监视试题含解析
- 2027届四川省广元市名校数学七年级第一学期期末综合测试试题含解析
- 2026年浙江省建筑工程安全防护设施设计习题集及答案
- 2026年注册电气工程师考试电力系统自动化保护继电保护基础模拟试题及答案
- 2026及未来5年中国电子产品外套袋数据监测研究报告
- 2026年儿童心理健康知识测试题及答案
- 2026年黑龙江省数控加工安全操作规范习题集及答案
- 2026旅游行业市场调研分析及复苏趋势与投资机会研究报告
- 医院护理部工作规划
- 高中美术鉴赏课教学设计:以作品为本位的四步鉴赏法实践
- 2025年城管协管员笔试考试试题(含答案)
- 医疗健康管理与慢病防控
- 2026年认证基础、管理体系认证基础主观题考试(附答案)解析
- 七年级上册人教版英语第一次月考试卷(含答案)
- 2026年急诊超声应用培训课件
- 正压送风口阀体损坏更换安装调试方案
- 2026中考冲刺-九年级数学知识点梳理
- 新学期(2026年秋)小学二年级体育教学工作计划
- 浙江省杭州市2026届高三上学期教学质量检测数学试卷(杭州一模)(含答案)
- 第二届重庆市市场监管系统执法办案电子数据取证技能大竞赛赛完整试题
评论
0/150
提交评论