1. 概念
- JDBC(Java Database Connection):java数据库连接。
- 目前常见的关系型数据库管理系统有很多种,包括MySQL、Oracle、SQLserver等等。
- 数据库管理系统,顾名思义是用来管理数据库的,将数据库中的数据以表的形式存储。
- 以MySQL为例,安装完MySQL,可以通过控制台连接数据库、编写SQL语句对数据库进行增删改查。
- 包括web应用在内的各种需要与数据打交道的应用,都会涉及到数据的增删改查,也就是要与数据库管理系统,比如MySQL,打交道。此时,希望通过java程序的方式直接操作数据库。要想实现这个目的,需要使用相应的数据库驱动与数据库建立连接。不同数据库厂商的数据库驱动都是不同的,建立连接以及操作数据库的方式都所有区别。
- 为了便于程序的维护,Sun公司开发了JDBC这种统一的规范,程序只需要遵守这个规范即可以实现与数据库的连接,而无需考虑底层是如何实现的,这由不同的数据库厂商负责实现。
2. 最原始的使用步骤
(1)加载驱动类(在此之前要导包:mysql-connector-java)
Class.forName("com.mysql.cj.jdbc.Driver");
(2)设置url、用户名和密码
url,资源统一定位符,用于和数据库建立连接,以MySQL为例,与HTTP的网址类似(http://www.baidu.com/tieba?uername=yujing&password=xxxx)
- jdbc:mysql: 可以理解为一种协议或规范,MySQL数据库驱动的厂商需要遵循该规范
- localhost 等价于127.0.0.1,可以理解为域名,主机所在的ip地址
- 3306:数据库服务的端口
- test:数据库的名字,下一层目录
- ?后接参数名称和参数值,多个键值对中用&连接
四种参数代表的意思:
- useUnicode=true:支持中文编码
- characterEncoding=utf8:设置中文编码格式
- useSSL=true:使用更加安全的连接
- serverTimezone=GMT 设置时区
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
String username = "root";
String password = "123456";
(3)创建连接 获得数据库连接对象,代表数据库,可以查看数据库的信息
Connection connection = DriverManager.getConnection(url, username, password);
(4)通过连接获取执行SQL语句的对象
Statement statement = connection.createStatement();
(5)编写SQL语句,利用执行SQL的对象执行SQL
可能存在返回结果,用ResultSet接收,封装了所有查询出的对象(数据库表的所有行),以链表的形式存在
String sql = "SELECT * FROM sys_user";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.print("id=" + resultSet.getObject("id") + " ");
System.out.print("username=" + resultSet.getObject("username") + " ");
System.out.print("email=" + resultSet.getObject("email") + " ");
System.out.print("password=" + resultSet.getObject("password") + " ");
System.out.println("phoneNum=" + resultSet.getObject("phoneNum"));
}
(6)释放连接
resultSet.close();
statement.close();
connection.close();
整体代码
package com.jing.jdbc;
import java.sql.*;
public class JDBCDemo01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 利用数据库图形管理软件的使用步骤来理解java和数据库建立连接并操作数据库的过程
// 1. 加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 设置用户信息和url
/*
url用于和数据库建立连接,与HTTP的网址类似(http://www.baidu.com/tieba?uername=yujing&password=xxxx)
jdbc:mysql: 可以理解为一种协议或规范,数据库驱动的厂商需要遵循该规范
localhost 等价于127.0.0.1,可以理解为域名,主机所在的ip地址
test:数据库的名字,下一层目录
?后接参数名称和参数值,多个键值对中用&连接
*/
/*
四种参数代表的意思:
(1) useUnicode=true:支持中文编码
(2) characterEncoding=utf8:设置中文编码格式
(3) useSSL=true:使用更加安全的连接
(4) serverTimezone=GMT 设置时区
*/
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";
String username = "root";
String password = "123456";
// 3. 创建连接 获得数据库连接对象,代表数据库,可以查看数据库的信息
Connection connection = DriverManager.getConnection(url, username, password);
// 4. 获取执行SQL语句的对象
Statement statement = connection.createStatement();
// 5.1 编写SQL语句,利用执行SQL的对象执行SQL,可能存在返回结果
String sql = "SELECT * FROM sys_user";
ResultSet resultSet = statement.executeQuery(sql); // 返回结果集,封装了所有查询出的对象(数据库表的所有行),以链表的形式存在
// 5.2 遍历结果集
while (resultSet.next()){
System.out.print("id=" + resultSet.getObject("id") + " ");
System.out.print("username=" + resultSet.getObject("username") + " ");
System.out.print("email=" + resultSet.getObject("email") + " ");
System.out.print("password=" + resultSet.getObject("password") + " ");
System.out.println("phoneNum=" + resultSet.getObject("phoneNum"));
}
// 6. 释放连接(类似于HTTP连接的释放)
resultSet.close();
statement.close();
connection.close();
}
}
test中的sys_user表
执行结果
3. 涉及到的几类对象
(1)Driver对象:Driver是一个接口,加载驱动实际上是注册了一个新的驱动
(2)Connection:数据库连接对象,代表数据库,负责数据库层面的操作,比如创建执行SQL的对象、事务相关操作(设置事务自动提交,事务手动提交,事务回滚)
(3)Statement:执行SQL语句的类,增删改查各类语句。其实是将语句发送给数据库执行,并接收数据库返回的结果。
(4)ResultSet:查询结果集,封装了查询到的所有记录,以链表的形式组织,自带指向第一个元素之前的位置的指针。
- next()方法:遍历,向下一个位置移动指针,如果指针指向为空,则返回false,否则返回true。
- getObject():根据列名获得记录中的字段值,不知道值的类型时使用
- getString():如果字段的类型为varchar,则可以使用更加具体的方法
- ...
4. 抽取JDBC工具类
解耦代码,减少冗余代码,便于维护
(1)db.properties
Driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
username=root
password=123456
(2)JDBCUtils.java
package com.jing.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
try {
// 利用反射获取类对象,然后获取JDBCUtils的类加载器,然后读取资源
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
// Properties是HashTable的子类,所以本质上也是一种双列集合,不是什么特殊的东西
Properties properties = new Properties();
// 将输入流中的数据以键值对的形式存储到集合中
properties.load(in);
// 根据属性获取值
driver = properties.getProperty("Driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
// 加载驱动,只需加载一次,所以放在静态代码块中
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
// 释放资源
public static void release(Connection conn, Statement stm, ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stm != null){
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
(3)JDBCDemo02.java
package com.jing.jdbc;
import com.jing.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo02 {
public static void main(String[] args){
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 利用工具类获取数据库连接
connection = JDBCUtils.getConnection();
// 获取SQL语句执行对象
statement = connection.createStatement();
// 编写查询语句,并执行
String sql = "SELECT * FROM sys_user";
resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.print("id=" + resultSet.getObject("id") + " ");
System.out.println("username=" + resultSet.getObject("username") + " ");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(connection,statement,resultSet);
}
}
}
结果