欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-25 20:18:04
撩课Java+系统架构点击开始学习 96.JDBC操作数据库的步骤 ? 97.JDBC中的Statement 和PreparedStatement的区别? 98.说说数据库连接池工作原理和实现方案? 99.execute,executeQuery,executeUpdate的区别是什么? 100.S ......

撩课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对象
设置进来的值所覆盖掉。