- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Java数据库面试题及答案(实战版)
1.说说JDBC操作数据库的核心步骤,用代码示例说明?
JDBC核心是通过API建立Java与数据库的交互,关键步骤要注意资源关闭和防注入,实际开发常用try-with-resources自动释放资源:
publicUserqueryUserById(intid){
Stringurl=jdbc:mysql://localhost:3306/test?useSSL=falseserverTimezone=UTC;
Stringuser=root;
Stringpwd=123456;
Userresult=null;
//try-with-resources自动关闭Connection/PreparedStatement/ResultSet
try(Connectionconn=DriverManager.getConnection(url,user,pwd);
PreparedStatementpstmt=conn.prepareStatement(SELECTid,name,ageFROMuserWHEREid=?)){
//设置参数(索引从1开始),避免SQL注入
pstmt.setInt(1,id);
//执行查询获取结果集
try(ResultSetrs=pstmt.executeQuery()){
if(rs.next()){
result=newUser();
result.setId(rs.getInt(id));
result.setName(rs.getString(name));
result.setAge(rs.getInt(age));
}
}
}catch(SQLExceptione){
//实际项目要打印详细日志(如Logback),而非直接print
log.error(查询用户异常,用户ID:{},id,e);
}
returnresult;
}
注意点:①MySQL5.1+驱动(com.mysql.cj.jdbc.Driver)无需手动Class.forName();②URL必须加serverTimezone,否则会有时区异常;③坚决不用Statement,避免SQL注入。
2.PreparedStatement和Statement的区别?为什么优先用前者?
最核心区别是SQL预编译和防注入,具体对比:
维度
Statement
PreparedStatement
SQL执行方式
每次执行都编译SQL
只编译一次(预编译)
性能
重复执行相同SQL时性能差
重复执行性能更高
SQL注入风险
有(直接拼接参数)
无(参数占位符?)
批量操作
不支持addBatch()
支持批量操作
为什么优先用PreparedStatement?
举个注入例子:如果用Statement查询用户,参数直接拼接:
//恶意用户输入id为1OR1=1,会查询所有用户数据
Stringsql=SELECT*FROMuserWHEREid=+userId;
Statementstmt=conn.createStatement();
stmt.executeQuery(sql);
而PreparedStatement用?占位,参数会被JDBC自动转义,即使输入恶意值也只会当作普通字符串处理,从根源避免注入。
3.常用数据库连接池有哪些?HikariCP比Druid优势在哪?
常用连接池:HikariCP(SpringBoot默认)、Druid(阿里,带监控)、C3P0(老旧,少用)。
HikariCP优势(性能比Druid高20%+):
轻量级设计:没有多余装饰器,代码量仅Druid的1/10,减少内存开销;
高效连接管理:用ConcurrentBag(而非普通集合)管理连接,并发获取连接速度快;
优化细节:用FastList替代ArrayList(避免边界检查)、无锁设计减少线程竞争;
配置简单:核心参数少,默认配置已适配多数场景。
HikariCP核心配置示例(
文档评论(0)