1、数据库编程的必备条件
- 编程语言,如Java,C、C++、Python等
- 数据库,如Oracle,MySQL,SQL Server等
- 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
2、Java的数据库编程:JDBC
JDBC,即
Java Database Connectivity
,
java
数据库连接。是一种用于执行
SQL
语句的
Java API
,它是Java中的数据库连接规范。这个
API
由
java.sql.*,javax.sql.*
包中的一些类和接口组成,它为
Java开发人员操作数据库提供了一个标准的API
,可以为多种关系数据库提供统一访问。
3、JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问
API
的一种高级抽象,它主要包含一些通用的接口类。
JDBC访问数据库层次结构
:

JDBC
优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
4、JDBC使用
4.1 JDBC开发案例
在项目中创建文件夹lib
,并将依赖包
mysql-connector-java-5.1.47.jar
复制到
lib
中。再配置该
jar包到本项目的依赖中:右键点击项目Open Module Settings
,在
Modules
中,点击项目,配置
Dependencies
,点击
+
,
JARS or Directories
,将该
lib
文件夹配置进依赖中,表示该文件夹下的
jar
包都引入作为依赖。
//
加载
JDBC
驱动程序:反射,这样调用初始化
com.mysql.jdbc.Driver
类,即将该类加载到
JVM
方法
区,并执行该类的静态方法块、静态属性。
Class
.
forName
(
"com.mysql.jdbc.Driver"
);
//
创建数据库连接
Connection connection
=
DriverManager
.
getConnection
(
"jdbc:mysql://localhost:3306/test?
user=root&password=root&useUnicode=true&characterEncoding=UTF-8"
);
//MySQL
数据连接的
URL
参数格式如下:
jdbc
:
mysql
:
//
服务器地址
:
端口
/
数据库名
?
参数名
=
参数值
Statement statement
=
connection
.
createStatement
();
ResultSet resultSet
=
statement
.
executeQuery
(
"select id, sn, name, qq_mail, classes_id from student"
);
while
(
resultSet
.
next
()) {
int
id
=
resultSet
.
getInt
(
"id"
);
String
sn
=
resultSet
.
getString
(
"sn"
);
String
name
=
resultSet
.
getString
(
"name"
);
int
classesId
=
resultSet
.
getInt
(
"classes_id"
);
System
.
out
.
println
(
String
.
format
(
"Student: id=%d, sn=%s, name=%s,
classesId=%s"
,
id
,
sn
,
name
,
classesId
));
}
//
关闭结果集
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
();
}
}
4.2 JDBC使用步骤总结
1. 创建数据库连接
Connection
2. 创建操作命令
Statement
3. 使用操作命令来执行
SQL
4. 处理结果集
ResultSet
5. 释放资源
5、JDBC常用接口和类
5.1 JDBC API
在Java JDBC
编程中对数据库的操作均使用
JDK
自带的
API
统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API
(位于
java.sql
包下) 即可掌握
Java
数据库编程。
5.2 数据库连接Connection
Connection
接口实现类由数据库提供,获取
Connection
对象通常有两种方式:
- 一种是通过DriverManager(驱动管理类)的静态方法获取:
//
加载
JDBC
驱动程序
Class
.
forName
(
"com.mysql.jdbc.Driver"
);
//
创建数据库连接
Connection connection
=
DriverManager
.
getConnection
(
url
);
DataSource ds
=
new
MysqlDataSource
();
((
MysqlDataSource
)
ds
).
setUrl
(
"jdbc:mysql://localhost:3306/test"
);
((
MysqlDataSource
)
ds
).
setUser
(
"root"
);
((
MysqlDataSource
)
ds
).
setPassword
(
"root"
);
Connection connection
=
ds
.
getConnection
();
1. DriverManager类来获取的
Connection
连接,是无法重复利用的,每次使用完以后释放资源
时,通过
connection.close()
都是关闭物理连接。
2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()
都是将Conncetion连接对象回收。
5.3 Statement对象
Statement对象主要是将
SQL
语句发送到数据库中。
JDBC API
中主要提供了三种
Statement
对象。

实际开发中最常用的是PreparedStatement对象,以下对其的总结:

主要掌握两种执行SQL的方法:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
5.4 ResultSet对象
ResultSet对象它被称为结果集,它代表符合
SQL
语句条件的所有行,并且它通过一套
getXXX
方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet
的
next()方法 ,
如果我们想要得到
ResultSet
里的所有记录,就应该使用
while
循环。
6. 应用案例
技术知识点:
- JDBC API的CRUD
- JDBC API的事务控制
功能要求:
自动化2019级
5
班新增一名同学程咬金
修改该同学的班级为中文系2019级
3
班
查询所有中文系2019级
3
班的同学
删除名叫程咬金的同学
新增许仙同学的成绩:英文80分,
Java65
分,计算机原理
76
分,语文
59
分
修改许仙同学的成绩:英文81分
删除许仙同学的语文成绩
查询中文系2019级
3
班同学的成绩
7. 内容重点总结
JDBC
使用步骤:
1. 创建数据库连接
Connection
DriverManager创建
DataSource获取
2. 创建操作命令
Statement
PreparedStatement
3. 使用操作命令来执行
SQL
//
查询操作
preparedStatement
.
executeQuery
();
//
新增、修改、删除操作
preparedStatement
.
executeUpdate
();
4. 处理结果集ResultSet
while
(
resultSet
.
next
()) {
int
xxx
=
resultSet
.
getInt
(
"xxx"
);
String
yyy
=
resultSet
.
getString
(
"yyy"
);
...
}
5. 释放资源
try
{
if
(
resultSet
!=
null
){
resultSet
.
close
();
}
if
(
preparedStatement
!=
null
){
preparedStatement
.
close
();
}
if
(
connection
!=
null
){
connection
.
close
();
}
}
catch
(
SQLException e
) {
e
.
printStackTrace
();
throw new
RuntimeException
(
"
数据库错误
"
);
}
面试问答:
1. 数据库连接有哪些方式?分别有什么区别
2. 数据库
Statement
和
PreparedStatement
有什么区别?
8. 举例
新增貂蝉同学的借阅记录:诗经,从2019
年
9
月
25
日
17:50
到
2019
年
10
月
25
日
17:50
查询计算机分类下的图书借阅信息
修改图书《深入理解Java
虚拟机》的价格为
61.20
删除id
最大的一条借阅记录