1. JDBC概述
JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。(注意:JDBC是人为制定的一种规范,而不是一种实现)
如下图所示,有了JDBC我们就可以通过JDBC去加载不同数据库厂商的驱动,实现对不同数据库的操作,而不用针对不同数据库再编写相应的程序,使程序拥有良好的可移植性。
2. 前期准备
数据库:mysql 5.6
IDE:Eclipse IDE for Enterprise Java Developers
因为需要连接mysql数据库,这里要用到mysql-connector-java-5.1.28-bin.jar包,Maven项目可以直接添加依赖。由于是学习的缘故,这里用到的包相对会比较旧。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.28</version>
</dependency>
3. CRUD的实现
这些功能实现其实很简单,主要包含以下步骤:
- 注册数据库驱动
- 获取数据库的连接
- 获取传输对象
- 用传输对象传输sql语句到数据库中执行,获取结果集对象
- 遍历结果集获取需要的数据(只有查询才会返回结果集)
- 关闭资源
由上面的步骤可以看出其实大部分操作都是套路型的(花里胡哨),核心操作还是我们对传输sql语句到数据库中执行,本质上我们本知道知道相应操作的sql语句就可以完成。
3.2. mysql的CRUD语句
虽然知道sql语句是核心,但是如果平时不常用的话,很容易就会忘记了。现在先来复习一下mysql简单的增删查改操作。
3.2.1. 查询
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
3.2.2. 插入:
插入操作主要有以下两种写法:
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
3.2.3. 更新:
# 更新表中已经存在的元素
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
3.2.4. 删除:
# 根据条件删除表中已经存在的元素
DELETE FROM table_name
WHERE some_column=some_value;
3.3. 操作简述
我们第一步要获取到数据库的连接:
- 首先需要注册数据库的驱动,这里用到Class.forName()方法,参数是数据库驱动的类型,如果是mysql数据库的话传入的是"com.mysql.jdbc.Driver"。
- 接着就是连接到数据库了,我们需要传入数据库的地址,用户名和密码。这里需要简单解释一下数据库地址的写法:
- 一般格式:jdbc:数据库类型://ip:port/数据库名称。比如我们要连接本地一个叫做mydb1的数据库,地址就写为:jdbc:mysql://localhost:3306/mydb1
- 当ip地址和端口号为本地地址和数据库默认端口号时,可以省略不写。例如上面的数据库地址可以简写为:jdbc:mysql://localhost:3306/mydb1
//1.注册数据库驱动
Class.forName(DriverType);
//2.获取数据库的连接
Connection conn = DriverManager.getConnection(url, user, password);
成功连接之后就可以获取传输器Statement对象,利用该对象传输sql语句对数据进行操作了。
- Statement接口主要用于在已经建立连接的基础上向数据库发送SQL语句。
- ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作获得的结果集。
//3.获取传输器对象
Statement state = conn.createStatement();
//4.传输sql语句到数据库中执行,获取结果集对象
ResultSet res = res = state.executeQuery(sql);
3.4. 实现代码
由于操作都比较重复,这里只演示查询的操作。如果进行其他操作,只要更改相应的sql语句。下面的代码封装得也不是很好,可以考虑以下优化:
- 由于连接和关闭资源操作都比较重复,我们可以把它们封装成一个静态的JDBCUtils。
- 我们可以把像驱动的类型、数据库地址、用户名和密码这些信息都写入配置文件,连接的时候再从配置文件中读取。
public class JdbcCRUD {
private static Connection conn = null;
private static Statement state = null;
private static ResultSet res = null;
private static void find() {
try {
//1.注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库的连接
conn = DriverManager.getConnection("jdbc:mysql:///mydb1", "root", "123456");
//3.获取传输器对象
state = conn.createStatement();
//4.传输sql语句到数据库中执行,获取结果集对象
res = state.executeQuery(" select * from user ");
//5.遍历结果集获取需要的数据
while (res.next()) {
int id = res.getInt("id");
String name = res.getString("username");
String password = res.getString("password");
System.out.println(id + "," + name + "," + password);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//6.关闭资源
if (res != null) {
try {
res.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
res = null;
}
}
if (state != null) {
try {
state.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
state = null;
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}
}