JDBC Java Database Connectivity
1. JDBC 概述
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。
核心接口和核心类都在
java.sql
javax.sql 包内
在Java中如果需要连接数据库,需要导入对应数据库的Jar包。Jar由数据库厂商提供!!!可以从官网获取,或则是MVN maven依赖库官网
2. JDBC连接数据库所需资源
cmd连接数据库:
mysql -hlocalhost -uroot -p123456
所需资源:
1. mysql 明确告知计算机,当前连接的数据库为MySQL数据
2. -hlocalhost 表示当前使用的数据库是本机地址
3. -uroot 连接数据库所需用户名
4. -p 对应当前用户的数据库密码
JDBC连接数据库所需:
1. 明确当前连接数据库的是哪一个数据库,需要启动对应数据库的 Driver 驱动
2. 明确当前数据库所在ip地址,主机名,域名
3. 明确数据库连接使用用户名和密码
3. JDBC连接数据库准备
1. 对应当前数据库的JDBC Jar
官网或Maven仓库搜索
MySQL官网: https://dev.mysql.com/downloads/connector/j/
Maven 仓库: https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.47
建议: 5.1.47版本 稳定
2. 明确JDBC连接数据库的URL
Uniform Resource Locator 统一资源定位符
MySQL JDBC 规范 URL
jdbc:mysql://localhost:3306/javaee2009
jdbc: 主协议名,表示当前URL是jdbc协议
mysql: 子协议名,当前连接的数据库为mysql数据
localhost:3306: 数据库服务器所在域名,IP地址,主机名和对应的端口号
javaee2009: 当前选择连接的数据库 数据库连接之后 使用 use javaee2009
3. 对应当前数据库登陆使用的用户名和密码字 符串形式 或者 Properties 形式
4. Jar导入到Java项目中
4. IDEA创建项目 导入第三方Jar包
5. JDBC连接数据库 Hello Database
package com.qfedu.a_jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 第一个JDBC程序,Java连接数据库演示
*
* @author Anonymous
*/
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*
1. 加载驱动 JDBC For Java
Class.forName(String packageAndClass);
*/
// Alt + Enter IDEA 快速修复
Class.forName("com.mysql.jdbc.Driver");
// 2. 设定URL,用户名和密码
String url = "jdbc:mysql://localhost:3306/javaee2009";
String userName = "root";
String password = "123456";
// 3. 获取数据库连接对象 java.sql.Connection 数据库连接对象
Connection connection = DriverManager.getConnection(url, userName, password);
System.out.println(connection);
// 4. 关闭数据库资源
connection.close();
}
}
6. 驱动加载分析和静态代码块操作特征
静态代码块特征:
1. 类文件加载一定执行
2. 有且只执行一次
3. 只能使用类内的静态资源,不能使用非静态资源。
4. 静态代码块用于程序的启动初始化过程。
// com.mysql.jdbc.Driver是Java JDBC 规范 核心接口实现类 java.sql.Driver
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
// 类文件加载一定执行!!!
static {
try {
// DriverManager(驱动管理类) registerDriver 注册驱动
// new Driver() ==> 当前 com.mysql.jdbc.Driver对象
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* 构造一个新的驱动,并且通过DriverManager(驱动管理类)注册
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
7. JDBC核心API 【重点,不需要妙】
interface java.sql.Driver
JDBC驱动接口,要求所有的数据库提供商完成给予Driver接口的实现过程,满足JDBC连接数据库的基本资源和驱动。
class java.sql.DriverManager
JDBC驱动管理类
--| static void registerDriver(java.sql.Driver driver);
注册JDBC驱动对象,一般在对应数据库Jar中,通过static静态代码块自动完成
--| static java.sql.Connection getConnection(String url, String user, String password);
根据JDBC url,对应数据库用户名和密码,获取数据库连接对象Connection
interface java.sql.Connection
数据库连接对象Connection
--| java.sql.Statement createStatement();
获取当前数据库连接对象对应的,SQL语句搬运工Statement对象
--| java.sql.PreparedStatement prepareStatement(String sql);
获取当前数据库连接对象对应的,预处理SQL语句搬运工PreparedStatement对
象
interface java.sql.Statement
SQL语句搬运工Statement
--| int executeUpdate(String sql);
这里处理的是update insert delete SQL语句,执行用户指定的SQL语句,返
回值类型是当前SQL语句运行对于数据库的影响行数。 1 row affected
--| java.sql.ResultSet executeQuery(String sql);
执行DQL语句,查询操作,返回值类型是java.sql.ResultSet结果集对象,当前
方法返回值类型 never null
interface java.sql.PreparedStatement extends java.sql.Statement
预处理SQL语句搬运工PreparedStatement
--| void setXXX(int index, XXX value);
设置任意类型参数,index为参数下标,value是对应数据
常用 setObject(int index, Object value);
--| int executeUpdate();
执行PreparedStatement预处理SQL语句,可以处理的SQL语句包括 insert
delete update
--| java.sql.ResultSet executeQuery();
执行PreparedStatement预处理SQL语句,可以处理DQL语句select,返回值类
型是查询结果集对象java.sql.ResultSet
interface java.sql.ResultSet
JDBC结果集接口
--| XXX getXXX(String fieldName/ColumnName);
可以根据字段名字获取任意指定类型数据
String getString("userName");
int getInt("age");
--| boolean next(); // boolean hasNext();
判断是否可以继续解析数据行,并且指向下一个数据行
8. Statement操作
8.1 Statement完成insert操作
public static void testInsert() {
Statement statement = null;
Connection connection = null;
try {
/*
1. 加载驱动
*/
Class.forName("com.mysql.jdbc.Driver");
/*
2. 明确数据库连接所需URL,user,password
*/
String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
String user = "root";
String password = "123456";
/*
3.获取数据库连接对象 java.sql.Connection
*/
connection = DriverManager.getConnection(url, user, password);
/*
4. 获取数据库搬运工对象 java.sql.Statement
*/
statement = connection.createStatement();
/*
5. 明确SQL语句
*/
String sql = "insert into javaee2009.student2(id, name) VALUES (1, '苟磊')";
/*
6. 执行SQL语句
*/
int affectedRows = statement.executeUpdate(sql);
System.out.println(affectedRows);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
/*
7. 关闭资源
*/
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8.2 Statement完成update操作
public static void testUpdate() {
Statement statement = null;
Connection connection = null;
try {
/* 1. 加载对应驱动 */
Class.forName("com.mysql.jdbc.Driver");
/* 2. 准备数据连接必要条件 */
String url = "jdbc:mysql://localhost:3306/javaee2009";
String user = "root";
String password = "123456";
/* 3. 获取数据库连接线 */
connection = DriverManager.getConnection(url, user, password);
/* 4. 准备SQL语句 Alt + Enter ==> Inject language or references*/
String sql = "update javaee2009.student2 set name = '华子' where id = 3";
/* 5. 获取Statement对象 */
statement = connection.createStatement();
/* 6. 执行SQL语句 */
int i = statement.executeUpdate(sql);
System.out.println(i);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
/* 7. 关闭资源 */
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8.3 Statement完成delete操作
public static void testDelete() {
Statement statement = null;
Connection connection = null;
try {
/* 1. 准备驱动 */
Class.forName("com.mysql.jdbc.Driver");
/* 2. 准备数据连接必要内容 */
String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
String user = "root";
String password = "123456";
/* 3. 获取数据库连接对象 */
connection = DriverManager.getConnection(url, user, password);
/* 4. 准备SQL语句 */
String sql = "delete from javaee2009.student2 where id = 3";
/* 5. 获取Statement对象 */
statement = connection.createStatement();
/* 6. 执行 SQL语句 */
int i = statement.executeUpdate(sql);
System.out.println(i);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
/* 7. 关闭资源 */
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8.4 Statement完成select 一个数据操作
public static void testSelectOne() {
ResultSet resultSet = null;
Statement statement = null;
Connection connection = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 准备数据连接必要资源
String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
String user = "root";
String password = "123456";
// 3. 获取数据库连接
connection = DriverManager.getConnection(url, user, password);
// 4. 准备SQL语句
String sql = "select * from javaee2009.student where id = 1";
// 5. 获取Statement对象
statement = connection.createStatement();
// 6. 执行SQL语句,获取ResultSet结果集对象 Ctrl + Shift + Enter
resultSet = statement.executeQuery(sql);
Student student = null;
// 7. 解析ResultSet
while (resultSet.next()) {
// 根据字段名获取对应的数据,并且根据字段数据类型来进行方法选择
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String info = resultSet.getString("info");
float score = resultSet.getFloat("score");
student = new Student(id, name, age, info, score);
}
System.out.println(student);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8.5 Statement完成select 多条数据操作
public static void testSelectAll() {
ResultSet resultSet = null;
Statement statement = null;
Connection connection = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 准备数据连接必要资源
String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
String user = "root";
String password = "123456";
// 3. 获取数据库连接
connection = DriverManager.getConnection(url, user, password);
// 4. 准备SQL语句
String sql = "select * from javaee2009.student;";
// 5. 搞一个Statement对象
statement = connection.createStatement();
// 6. 执行SQL语句,获取ResultSet
resultSet = statement.executeQuery(sql);
ArrayList<Student> list = new ArrayList<>();
// 7. 解析ResultSet结果集对象
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String info = resultSet.getString("info");
float score = resultSet.getFloat("score");
list.add(new Student(id, name, age, info, score));
}
// 数组/集合.iter ==> 增强for循环
for (Student student : list) {
System.out.println(student);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
9. JDBCUtil工具类封装
9.1 JDBCUtil工具类封装目的
JDBC工具类
1. JDBC数据库连接所需的必要资源准备和驱动加载
2. 提供一个工具类方法,获取数据库连接对象 Connection getConnection
3. 关闭用户使用的数据库资源
9.2 JDBC数据库连接所需的必要资源准备和驱动加载
将数据库连接使用配置内容,写入到Properties文件
# JDBC数据库连接配置资源
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/javaee2009?useSSL=false
user=root
password=123456
期望配置文件可以自动加载到当前程序中,并且可以根据配置文件直接加载JDBC驱动
使用静态代码块
/* 准备必要的静态成员变量,用于从Properties文件中读取对应的数据 */
private static String jdbcUrl = null;
private static String user = null;
private static String password = null;
/* static修饰静态代码块,根据静态代码块特征,完成自动加载过程 */
static {
try {
// 1. 创建对应当前Properties文件的FileInputStream 文件操作字节输入流
FileInputStream fis = new FileInputStream("./src/db.properties");
// 2. 创建Properties对象
Properties properties = new Properties();
properties.load(fis);
// 3. 从配置文件中读取内容
jdbcUrl = properties.getProperty("jdbcUrl");
user = properties.getProperty("user");
password = properties.getProperty("password");
// 4. 加载驱动
Class.forName(properties.getProperty("driverClass"));
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
9.3 提供一个工具类方法,获取数据库连接对象
/**
* 获取数据库连接对象方法
*
* @return java.sql.Connection 对象。如果获取连接失败返回null
*/
public static Connection getConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(jdbcUrl, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
9.4 关闭用户使用的数据库资源
需要考虑关闭的数据:
Connection 数据库连接对象
Statement 数据库搬运工对象
ResultSet 数据库查询结果集对象
以上三个都是AutoCloseable子接口
/**
* 数据库操作使用的资源都是AutoCloseable接口的实现类,可以使用
* 不定长参数直接完成关闭方法,传入的参数是AutoCloseable实现类
* 个数不限
*
* @param res AutoCloseable实现类对象,个数不限
*/
public static void close(AutoCloseable... res) {
try {
// 遍历当前AutoCloseable数组,使用增强for循环
for (AutoCloseable re : res) {
// 当前资源不为null,直接关闭
if (re != null) {
re.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}