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