撩课-Java每天5道面试题第13天
撩课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对象
设置进来的值所覆盖掉。