• 撩课-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对象
    设置进来的值所覆盖掉。
  • 相关阅读:
    iOS 统计项目代码行数
    iOS Xcode 8 快捷键 (注释 失效 处理)
    iOS NSSet 学习 “无序数组” & 去重 案例
    iOS 学习@autoreleasepool{}
    iOS 学习如何声明私有变量和私有方法
    iOS 系统认知 debug distribution release 和 #ifdef DEBUG
    iOS copy 和 mutableCopy 学习
    iOS 关于 Missing iOS Distribution signing identity for.... 等 打包 校验 出现的事故 处理经验
    iOS NSCoding 的学习 和 使用
    TeamViewer被发现用于(检测为)商业用途解决方案(绝对有效)
  • 原文地址:https://www.cnblogs.com/gxq666/p/10043051.html
Copyright © 2020-2023  润新知