Java的JDBC编程
什么是JDBC?
JDBC
,即
Java Database Connectivity
,
java
数据库连接。是一种用于执行
SQL
语句的
Java API
,它是 Java中的数据库连接规范。这个
API
由
java.sql.*,javax.sql.*
包中的一些类和接口组成,它为
Java 开发人员操作数据库提供了一个标准的API
,可以为多种关系数据库提供统一访问。
JDBC工作原理
JDBC
为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问
API
的一种高级抽象,它主要包含一些通用的接口类。
为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问
API
的一种高级抽象,它主要包含一些通用的接口类。
JDBC
访问数据库层次结构:
访问数据库层次结构:
JDBC
优势:
优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
JDBC常用接口和类
JDBC API
在
Java JDBC
编程中对数据库的操作均使用
JDK
自带的
API
统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API
(位于
java.sql
包下) 即可掌握
Java
数据库编程。
Java JDBC
编程中对数据库的操作均使用
JDK
自带的
API
统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API
(位于
java.sql
包下) 即可掌握
Java
数据库编程。
数据库连接Connection
Connection
接口实现类由数据库提供,获取
Connection
对象通常有两种方式:
接口实现类由数据库提供,获取
Connection
对象通常有两种方式:
- 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
- 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
以上两种方式的区别是:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。
Statement对象
Statement
对象主要是将
SQL
语句发送到数据库中。
JDBC API
中主要提供了三种
Statement
对象。
对象主要是将
SQL
语句发送到数据库中。
JDBC API
中主要提供了三种
Statement
对象。
实际开发中最常用的是
PreparedStatement
对象,以下对其的总结:
PreparedStatement
对象,以下对其的总结:
主要掌握两种执行
SQL
的方法:
SQL
的方法:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
ResultSet对象
- ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
- ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
JDBC使用
1.连接数据库
//先定义一个数据源对象
private static DataSource dataSource = null;
//1.初始化数据源
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//2.设置连接参数
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
//3.把构建好的Mysql数据源赋值给JDBC中的datasource
dataSource = mysqlDataSource;
//1.通过数据源获取一个数据库连接
connection = dataSource.getConnection();
这里的URL(数据库连接字符串)为:
- 5.7:jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=UTF-8&useSSL=false
useSSL=false:是否加密;
- 8.0:jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
serverTimezone=Asia/Shanghai:时区。
2.执行SQL语句
//接收用户输入值
System.out.println("请输入id:");
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
//2.定义SQL语句
// String sql = "select * from student where id = " + id;
String sql = "select * from student where id = ?";
System.out.println("sql-->" + sql);
//3.获取statement对象
// statement = connection.createStatement();
//获取预处理对象
statement = connection.prepareStatement(sql);
//处理占位符的值
statement.setInt(1,id);
//4.执行SQL
resultSet = statement.executeQuery();
3.把查询的结果集转为JAVA对象
//5.解析结果集,resultSet.next()表示结果集中是否有记录
while (resultSet.next()) {
//创建表示结果的JAVA对象
Student student = new Student();
//依次读取结果集中的数据斌赋值给JAVA对象
student.setId(resultSet.getInt(1));
student.setSn(resultSet.getInt(2));
student.setName(resultSet.getString(3));
student.setMail(resultSet.getString(4));
//打印结果
System.out.println(student);
}
在完成删除和插入时:
// 4. 执行SQL并获取结果
int row = statement.executeUpdate();
if (row <= 0) {
System.out.println("添加失败.");
} else {
System.out.println("添加成功");
}
4.释放资源
//依次关闭资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
完整代码:
//先定义一个数据源对象
private static DataSource dataSource = null;
//数据库的用户名
private static final String USER = "root";
//数据库密码
private static final String PASSWORD = "123456";
//数据库连接字符串
private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?characterEncoding=utf-8&useSSL=false";
public static void main(String[] args) {
//1.初始化数据源
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//2.设置连接参数
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
//3.把构建好的Mysql数据源赋值给JDBC中的datasource
dataSource = mysqlDataSource;
Connection connection = null;
// Statement statement = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
//建立数据库连接
try {
//1.通过数据源获取一个数据库连接
connection = dataSource.getConnection();
//接收用户输入值
System.out.println("请输入id:");
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
//2.定义SQL语句
// String sql = "select * from student where id = " + id;
String sql = "select * from student where id = ?";
System.out.println("sql-->" + sql);
//3.获取statement对象
// statement = connection.createStatement();
//获取预处理对象
statement = connection.prepareStatement(sql);
//处理占位符的值
statement.setInt(1,id);
//4.执行SQL
resultSet = statement.executeQuery();
//5.解析结果集,resultSet.next()表示结果集中是否有记录
while (resultSet.next()) {
//创建表示结果的JAVA对象
Student student = new Student();
//依次读取结果集中的数据斌赋值给JAVA对象
student.setId(resultSet.getInt(1));
student.setSn(resultSet.getInt(2));
student.setName(resultSet.getString(3));
student.setMail(resultSet.getString(4));
//打印结果
System.out.println(student);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//依次关闭资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
当然这里还要定义一个student类,这里就不写了,大家可以根据自己的需求创建。
优化:
连接数据库和释放资源每次都是重复操作,所以我们可以将他们封装起来,每次使用时调用即可,我们每次只需处理要执行的SQL操作即可。
封装连接数据库和释放资源:
// 先定义一个数据源对象
private static DataSource dataSource = null;
// 数据库的用户名
private static final String USER = "root";
// 数据库的密码
private static final String PASSWORD = "123456";
// 数据库连接字符串
private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?characterEncoding=utf-8&useSSL=false";
static {
// 初始化数据源
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
dataSource = mysqlDataSource;
}
// 用private 修饰构造方法,使外部不能new 这个类的对象
private DBUtil() {}
/**
* 获取数据库连接
* @return
* @throws SQLException
*/
public static Connection getConnection () throws SQLException {
return dataSource.getConnection();
}
/**
* 关闭对象并释放资源
* @param resultSet
* @param statement
* @param connection
*/
public static void close (ResultSet resultSet, PreparedStatement statement, Connection connection) {
// 依次关闭对象,并释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
示例调用封装类来实现SQL操作:
public static void main(String[] args) {
// 查询到的所有学生信息
List<Student> students = null;
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 1. 创建数据源并获取数据库连接
connection = DBUtil.getConnection();
// 2. 构造SQL语句
String sql = "select * from student";
// 使用SQL预处理对象处理SQL
statement = connection.prepareStatement(sql);
// 3. 执行SQL并获取结果,如果是结果集把结果集转成java对象
resultSet = statement.executeQuery();
// 遍历结果集,处理查询到数据
while (resultSet.next()) {
// 如果List为空则创建
if (students == null) {
students = new ArrayList<>();
}
// 解析结果集并封装成Student对象
Student student = new Student();
student.setId(resultSet.getInt(1));
student.setSn(resultSet.getInt("sn"));
student.setName(resultSet.getString("name"));
student.setMail(resultSet.getString(4));
// 加入到集合中
students.add(student);
}
// 打印结果
System.out.println(students);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 释放资源
DBUtil.close(resultSet, statement, connection);
}
}
期待各位大佬前来指点,制作不易,感谢支持。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码