知识点第九次整理
目录
内容51,JDBC访问数据库的基本步骤是什么?52,说说preparedStatement和Statement的区别53,execute,executeQuery,executeUpdate的区别是什么?54,JDBC的DriverManager是用来做什么的?55,JDBC的ResultSet是什么?56,SQL查询出来的结果分页展示一般怎么做?57,数据库连接池的原理。为什么要使用连接池。
内容
51,JDBC访问数据库的基本步骤是什么?
1)加载(注册)数据库驱动(到JVM)。
2)建立(获取)数据库连接。
3)创建(获取)数据库操作对象。
4)定义操作的SQL语句。
5)执行数据库操作。
6)获取并操作结果集。
7)关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)。
package com.yangshengjie.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
/**
* 使用JDBC连接并操作mysql数据库
*/
public static void main(String[] args) {
// 数据库驱动类名的字符串
String driver = "com.mysql.jdbc.Driver";
// 数据库连接串
String url = "jdbc:mysql://127.0.0.1:3306/jdbctest";
// 用户名
String username = "root";
// 密码
String password = "mysqladmin";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1、加载数据库驱动( 成功加载后,会将Driver类的实例注册到DriverManager类中)
Class.forName(driver );
// 2、获取数据库连接
conn = DriverManager.getConnection(url, username, password);
// 3、获取数据库操作对象
stmt = conn.createStatement();
// 4、定义操作的SQL语句
String sql = "select * from user where id = 100";
// 5、执行数据库操作
rs = stmt.executeQuery(sql);
// 6、获取并操作结果集
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7、关闭对象,回收数据库资源
if (rs != null) { //关闭结果集对象
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) { // 关闭数据库操作对象
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) { // 关闭数据库连接对象
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
52,说说preparedStatement和Statement的区别
Statement执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该sql语句
PreparedStatement用来执行带参数的预编译的SQL语句
PreparedStatement的优点:
①效率高.
使用PreparedStatement执行SQL命令时,命令会被数据库编译和解析,并放到命令缓冲区.以后每当执行同一个PreparedStatement对象时,预编译的命令就可以重复使用
②代码可读性和可维护性好
③安全性好.
使用PreparedStatement可以防止SQL注入.
53,execute,executeQuery,executeUpdate的区别是什么?
executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象。
executeUpdate(String sql); 可执行增,删,改,返回执行受到影响的行数。
execute(String sql); 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。
1) executeQuery只能进行SELECT,从而得到结果集对象,测试DELETE,UPDATE,INSERT操作都会抛出异常。
2) executeUpdate 用来执行修改,插入,删除操作,执行SELECT会抛出异常
3) execute可以用来执行任意SQL语句,返回一个boolean的值,表明该语句是否返回了一个结果集对象ResultSet。通常一般没有必要去使用execute。 excuteQuery,executeUpdate适合于很多场景的使用。那么我们什么时候该使用execute呢?那就是你也不知道sql语句是什么类型的时候,就用execute吧
54,JDBC的DriverManager是用来做什么的?
DriverManager:驱动管理类
主要作用:
- 注册驱动
- 获得连接
// 注册驱动
DriverManager.registerDriver(new Driver());
// 连接数据
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root","root");
55,JDBC的ResultSet是什么?
主要作用:结果集
结果集:就是查询语句SELECT语句查询结果的封装,能将返回的结果存到ResultSet
next()将光标从当前位置向前移一行,
针对不同的类型的数据可以使用getXXX()获取数据,统一获得数据可以使用getObject()
ResultSet光标最初位于结果集第一行的前面,调用next()方法后才移到第一行
当调用next()方法返回值为false时,说明光标位于最后一行之后
56,SQL查询出来的结果分页展示一般怎么做?
select * from test limit ” + pageSize*(pageNumber-1) + “,” + pageSize;
57,数据库连接池的原理。为什么要使用连接池。
-
什么是连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 -
为什么要使用连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 -
连接池工作原理
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。
第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。