一. 创建数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式
1.通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
2.通过DataSource(数据源)对象获取。实际构建的是MysqlDataSource对象。
// 一. 创建 DataSource 对象
// DataSource 是官方的接口
// 所以,我们真实中创建的是 MySQL 厂商写的 DataSource 的实现类 MysqlDataSource 对象
MysqlDataSource dataSource = new MysqlDataSource();
// 进行必要的配置
// 1. 服务器在哪台主机(网络的哪台电脑)上
// 127.0.0.1 或者 localhost
// ip 域名(domain/host)
// 代表都是本机:客户端在哪台电脑上,服务器就在哪台电脑上
dataSource.setServerName("127.0.0.1");
// 2. 服务器在这台主机监听哪个端口
// 默认就是 3306 端口
dataSource.setPort(3306);
// 3. 连接服务器的时候使用哪个用户名
// 使用权限最大的 root 用户
dataSource.setUser("root");
// 4. 连接服务器的时候,密码是什么
dataSource.setPassword("password");
// 5. 连接上去之后,默认库是哪个
// 这个大家根据自己的情况来改
dataSource.setDatabaseName("1211_02");
// 6. 一些额外的配置
// 配置客户端和服务器通信时使用的字符集编码
dataSource.setCharacterEncoding("utf-8");
// dataSource.setCharacterEncoding("utf8");
// 配置客户端和服务器通信时是否要进行数据的加密
dataSource.setUseSSL(false);
// 配置客户端和服务器通信时,服务器的时区 :北京时间 —— 东 8 区 —— 亚洲/上海
// Asia/Shanghai
dataSource.setServerTimezone("Asia/Shanghai");
区别:
1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源
时,通过connection.close()都是关闭物理连接。
2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接
是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将
Conncetion连接对象回收。
二. 创建操作命令Statement
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象
Statement
用于执行不带参数的简单SQL语句
PreparedStatement
用于执行带或不带参数的SQL语句
SQL语句会预编译在数据库系统
执行速度快于Statement对象
CallableStatement
用于执行数据库存储过程的调用
三. 使用操作命令来执行SQL
占位符
1)写的SQL中,需要准备好点位符(placeholder: 目前还不知道值,但位置肯定在这)
使用?作为占位符,需要几个动态的值,就写几个?
sql = "select bid from books where name = ? and total = ?";
2)在执行期间(运行期间) , 根据读取到的值,将对应的值绑定到占位符上
String name = scanner.nextLine);
int total = Integer.parselnt(scanner.nextLine);
sql = "select bid from books where name = ? and total = ?";
PreparedStatement ps = connection.preparedStatement(sq);
//这里进行绑定,按照位置进行绑定,第一个问号是 1,第二个问号是2,以此类推
//把name变量中的值,name 是String类型的,绑定在第一一个 ?处
ps.setString(1, name);
//把total变量中的值,total 是int类型,绑定在第二二个?处
ps.setInt(2, total);
2.PreparedStatement执行SQL的方法:
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
语句
四. 处理结果集ResultSet
1. boolean next()方法
作用:
1)让ResultSet内部的游标(cursor) 指向下一行。
2)返回ResultSet内部的游标是否正确地指向了下一-行, 即判断是否把所有行都遍历过了。
注意点:
一开始, 游标不指向任何行,随着调用了一次next(),则游标指向第一-行,随着调用了两次next(),则游标指向第二二行,依次类推。随着调用了n次next(), next() 返回了false,表示游标遍历完了所有行。
使用:
ResultSet中的游标指向其中- -行的情况下时,ResultSet 对象现在就可以看出代表该行。利用getObject(..) / getlnt(...) / getString(...) ..系列方法,读取该行中的某个字段的值
读取字段:
通过说明我们要取第几个,其中第-个是1
rs.getObject(1)代表要取第 1列
rs.getObject(2)代表要取第2列
2.通过说明我们要取的字段名称
rs.getObject("bid")代表取 bid列
rs.getObject("name")代表取name列
Object o = rs.getObject("bid);
int i = rs.getObject("bid", Integer.class); // 先得到Integer,自动拆箱成int
String s = rs.getObject("name*;, String.cass);
便捷的方法
int i = rs.getlnt("bid");
String s = rs.getString("name");
五. 释放资源
使用try finally进行资源释放或者使用第三方库的方法(如lombok的 @SneakyThrows //加上这个注解可以在编译阶段将受查异常转换为非受查异常的形式抛出,不用写throw了)
使用总结:
构造-个DataSource对象(实际构造的是MysqlDataSource对象)
通过DataSource对象,得到一个Connection对象
(假如只考虑select操作,带有查询结果)通过Connection + String类型的SQL构造PreparedStatement对象,执行executeQuery()操作
服务器响应-个ResultSet对象(表现为从executeQuery()返回)代表查询到的结果集
public class APP {
public static void main(String[] args) throws SQLException {
// 一. 创建 DataSource 对象
// DataSource 是官方的接口
// 所以,我们真实中创建的是 MySQL 厂商写的 DataSource 的实现类 MysqlDataSource 对象
MysqlDataSource dataSource = new MysqlDataSource();
// 进行必要的配置
// 1. 服务器在哪台主机(网络的哪台电脑)上
// 127.0.0.1 或者 localhost
// ip 域名(domain/host)
// 代表都是本机:客户端在哪台电脑上,服务器就在哪台电脑上
dataSource.setServerName("127.0.0.1");
// 2. 服务器在这台主机监听哪个端口
// 默认就是 3306 端口
dataSource.setPort(3306);
// 3. 连接服务器的时候使用哪个用户名
// 使用权限最大的 root 用户
dataSource.setUser("root");
// 4. 连接服务器的时候,密码是什么
dataSource.setPassword("password");
// 5. 连接上去之后,默认库是哪个
dataSource.setDatabaseName("1211_02");
// 6. 一些额外的配置
// 配置客户端和服务器通信时使用的字符集编码
dataSource.setCharacterEncoding("utf-8");
// dataSource.setCharacterEncoding("utf8");
// 配置客户端和服务器通信时是否要进行数据的加密
dataSource.setUseSSL(false);
// 配置客户端和服务器通信时,服务器的时区 :北京时间 —— 东 8 区 —— 亚洲/上海
// Asia/Shanghai
dataSource.setServerTimezone("Asia/Shanghai");
// 二、利用构建好的 DataSource 对象,创建 Connection 对象
// Connection 是需要 关闭(close)的
Connection c = null;
try {
c = dataSource.getConnection();
// 执行一条 select 语句
String sql = "select * from books";
// 三、利用 Connection 对象 + String 类型的 SQL 语句,创建 PreparedStatement 对象
// PreparedStatement 对象同样需要考虑关闭的逻辑
PreparedStatement ps = null;
try {
ps = c.prepareStatement(sql);
// 四、发送这个 SQL 语句 : 执行这个 SQL 语句对象
// 执行:execute 得到 ResultSet 对象
ResultSet rs = null;
try {
rs = ps.executeQuery(); // executeQuery 用于 select 语句
// 五、遍历得到的结果
while (rs.next()) {
int bid = rs.getInt("bid");
String name = rs.getString("name");
int total = rs.getInt("total");
int current = rs.getInt("current");
System.out.printf("%4d | %10s | %4d | %4d\n", bid, name, total, current);
}
} finally {
if (rs != null) {
rs.close();
}
}
} finally {
if (ps != null) {
ps.close();
}
}
} finally {
if (c != null) {
// 说明 c 创建成功了
c.close(); // 关闭掉
}
}
}
}