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