撩课-Java每天5道面试题第13天

时间:2022-12-15 19:02:05

撩课Java+系统架构点击开始学习

96.JDBC操作数据库的步骤 ?

1、加载数据库驱动 
 2、创建并获取数据库链接 
3、创建jdbc statement对象 
4、设置sql语句
5、设置sql语句中的参数(使用preparedStatement) 
6、通过statement执行sql并获取结果 
7、对sql执行结果进行解析处理
8、释放资源(resultSet、preparedstatement、connection)

 

97.JDBC中的Statement 和PreparedStatement的区别?

Java提供了
 Statement、
PreparedStatement 
CallableStatement
三种方式来执行查询语句,
其中 Statement 用于通用查询,
PreparedStatement 用于执行参数化查询,
而 CallableStatement则是用于存储过程。


关于PreparedStatement接口,
需要重点记住的是: 
1. PreparedStatement可以写参数化查询,
比Statement能获得更好的性能。 

2. 对于PreparedStatement来说,
数据库可以使用已经编译过
及定义好的执行计划,
这种预处理语句查询
比普通的查询运行速度更快。 

3. PreparedStatement可以阻止常见的
SQL注入式攻击。 

4. PreparedStatement可以写动态查询语句 

5. PreparedStatement与
java.sql.Connection对象是关联的,
一旦你关闭了connection,
PreparedStatement也没法使用了。 

6. “?” 叫做占位符。 

7. PreparedStatement查询
默认返回FORWARD_ONLY的ResultSet,
你只能往一个方向移动结果集的游标。
当然你还可以设定为其他类型的
值如:”CONCUR_READ_ONLY”。 
8. 不支持预编译SQL查询的JDBC驱动,
在调用connection.prepareStatement(sql)的时候,
它不会把SQL查询语句发送给数据库做预处理,
而是等到执行查询动作的时候
调用executeQuery()方法时
才把查询语句发送个数据库,
这种情况和使用Statement是一样的。
 
9. 占位符的索引位置从1开始而不是0,
如果填入0会导致
java.sql.SQLException invalid column index异常。
所以如果PreparedStatement有两个占位符,
那么第一个参数的索引时1,
第二个参数的索引是2.

 

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

一般来说,Java应用程序访问数据库的过程是:
1.装载数据库驱动程序;
2.通过jdbc建立数据库连接;
3.访问数据库,执行sql语句;
4.断开数据库连接。

程序开发过程中,存在很多问题:

首先,
每一次web请求都要建立一次数据库连接。
建立连接是一个费时的活动,
每次都得花费0.05s~1s的时间,
而且系统还要分配内存资源。
这个时间对于一次或几次数据库操作,
或许感觉不出系统有多大的开销。

可是对于现在的web应用,
尤其是大型电子商务网站,
同时有几百人甚至几千人在线是很正常的事。
在这种情况下,
频繁的进行数据库连接操作
势必占用很多的系统资源,
网站的响应速度必定下降,
严重的甚至会造成服务器的崩溃。
其次,对于每一次数据库连接,
使用完后都得断开。
否则,如果程序出现异常而未能关闭,
将会导致数据库系统中的内存泄漏,
最终将不得不重启数据库

“数据库连接”是一种稀缺的资源,
为了保障网站的正常使用,
应该对其进行妥善管理。
其实我们查询完数据库后,
如果不关闭连接,
而是暂时存放起来,
当别人使用时,
把这个连接给他们使用。
就避免了一次建立数据库
连接和断开的操作时间消耗。

数据库连接池的基本思想:
就是为数据库连接建立一个“缓冲池”。
预先在缓冲池中放入一定数量的连接,
当需要建立数据库连接时,
只需从“缓冲池”中取出一个,
使用完毕之后再放回去。
我们可以通过设定连接池最大连接数
来防止系统无尽的与数据库连接

 

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

在jdbc中有3种执行sql的语句分别是
execute,
executeQuery
executeUpdate

ResultSet  executeQuery(String sql); 
执行SQL查询,并返回ResultSet 对象。

方法executeQuery 
用于产生单个结果集(ResultSet)的语句,
例如 SELECT 语句。
被使用最多的执行 SQL 语句的方法。
这个方法被用来执行 SELECT 语句,
它几乎是使用最多的 SQL 语句。
但也只能执行查询语句,
执行后返回代表查询结果的ResultSet对象。

2.int executeUpdate(String sql); 
可执行增,删,改,
返回执行受到影响的行数。

方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句
以及 SQL DDL(数据定义语言)语句,
例如 CREATE TABLE 和 DROP TABLE。
INSERT、UPDATE 或 DELETE 语句的效果
是修改表中零行或多行中的一列或多列。
executeUpdate 的返回值是一个整数(int),
指示受影响的行数(即更新计数)。
对于 CREATE TABLE 或 DROP TABLE 等
不操作行的语句,
executeUpdate 的返回值总为零。

3.boolean  execute(String sql); 
可执行任何SQL语句,
返回一个布尔值,
表示是否返回ResultSet 。

可用于执行任何SQL语句,
返回一个boolean值,
表明执行该SQL语句是否返回了ResultSet。
如果执行后第一个结果是ResultSet,
则返回true,否则返回false。
但它执行SQL语句时比较麻烦,
通常我们没有必要使用execute方法
来执行SQL语句,
而是使用executeQuery或executeUpdate更适合,
但如果在不清楚SQL语句的类型时
则只能使用execute方法
来执行该SQL语句了。

 

100.Statement中的setFetchSize和setMaxRows方法有什么用处

setMaxRows可以用来限制返回的数据集的行数。
当然通过SQL语句也可以实现这个功能。
比如在MySQL中我们可以用
LIMIT条件来设置返回结果的最大行数。

setFetchSize理解起来就有点费劲了,
因为你得知道Statement
和ResultSet是怎么工作的。
当数据库在执行一条查询语句时,
查询到的数据是在数据库的缓存中维护的。
ResultSet其实引用的是数据库中缓存的结果。

假设我们有一条查询返回了100行数据,
我们把fetchSize设置成了10,
那么数据库驱动每次只会取10条数据,
也就是说得取10次。
当每条数据需要处理的时间比较长的时候
并且返回数据又非常多的时候,
这个可选的参数就变得非常有用了。

我们可以通过Statement来
设置fetchSize参数,
不过它会被ResultSet对象
设置进来的值所覆盖掉。