JDBC
想要通过Java程序操作关系型数据库,就需要使用JDBC
(Java DataBase Connectivity),JDBC就是使用Java程序
操作关系型数据库的一套API(Java官方提供的)。很多高级的操作数据库的框架(如MyBatis、MyBatisPlus等)底层都是基于JDBC实现的,是对JDBC的高级封装;所以说了解原生的JDBC的操作是十分重要的。
Java官方只是提供了JDBC的规范(接口),并没有对其进行实现,而是将JDBC的实现交给了各个数据库厂商(如MySQL,Oracle等),因为各个不同的关系型数据库的底层细节
只有各个厂商最清楚。各个厂商提供的JDBC实现也被称为数据库驱动
,各个数据库厂商去实现这一套接口,并提供驱动jar包,我们在使用JDBC的时候需要根据所使用的数据库类型
,引入厂商实现的jar包。我们可以使用JDBC
这套接口进行编程,但是要知道的是:真正执行的代码其实是各个厂商驱动jar包中的实现类
。
快速入门
JDBC的快速入门十分简单,总的来说可以分为两步:1.准备工作:创建Maven项目,根据使用的数据库,在pom.xml
引入对应厂商的数据库驱动(不同厂商对于JDBC的实现不同,提供的驱动jar包
也不同)依赖,并且准备一个数据库表用于操作。
2.根据规范编写JDBC程序,操作数据库表。
准备
因为用的是Maven
构建项目,想要连接的是MySql数据库
,所以说我们只需要在pom.xml
文件中直接引入MySql实现的JDBC驱动的坐标即可:
数据库建表、数据:
create table user(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) comment '用户名',
password varchar(32) comment '密码',
name varchar(10) comment '姓名',
age tinyint unsigned comment '年龄'
) comment '用户表';
insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
(2, 'xiaoqiao', '123456', '小乔', 18),
(3, 'diaochan', '123456', '貂蝉', 24),
(4, 'lvbu', '123456', '吕布', 28),
(5, 'zhaoyun', '12345678', '赵云', 27);
JDBC实现DML语句
编写代码,操作数据库表,实现对数据的更改(此处更新id为1的用户的年龄):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCQuickStart {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 注册驱动,本质上是将驱动类加载到内存中,这一步是为了告诉程序用的是什么数据库
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接
String url = "jdbc:mysql://localhost:3306/db01";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, username, password);
// 获取SQL语句执行对象
Statement statement = connection.createStatement();
// 在SQL语句执行对象中执行SQL语句 statement:声明、报告、语句 execute:执行、实施
// DML语句都有返回值,代表有多少行数据受到影响
int lines = statement.executeUpdate("update user set age = 20 where id = 1"); // DML语句
System.out.println("一共有" + lines + "行数据受到影响");
// 处理完成后释放资源
statement.close();
connection.close();
}
}
运行代码,发现数据成功被更改了。
增删改在数据库的操作中都是属于DML语句,都可以使用Statement
类中的executeUpdate
方法,在方法中书写SQL语句从而达到修改的目的,而数据库中的DQL(查询语句) 则不属于executeUpdate中的类别,DQL属于executeQuery
,需要使用executeQuery方法进行查询,下文将详细讲解如何使用JDBC编写DQL语句。
JDBC实现DQL语句
在Java程序中对数据库进行查询操作,一般是为了将查询到的数据封装为实体对象,便于后续进行逻辑处理和响应数据给前端,封装成对象时,对象的属性建议
和数据库中的字段一致
:
编写JDBC代码操作数据库
注册数据库驱动,注册数据库驱动是为将对应数据库的驱动类
加载到内存中,告诉程序使用的是什么数据库:
Class.forName("com.mysql.cj.jdbc.Driver");
获取数据库连接,准备好数据库连接需要的资源,然后创建数据库连接对象Connection
:
String url = "jdbc:mysql://localhost:3306/db01";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, username, password);
获取SQL语句执行对象,此处使用PreparedStatement
对象创建一条预编译的SQL,预编译的SQL更加灵活,并且安全性更好,此处不过多赘述:
// 编写SQL语句
String sql = "select id, username, password, name, age from user where username = ? and password = ?";
// 使用PreparedStatement对象创建预编译SQL
PreparedStatement statement = connection.prepareStatement(sql);
为预编译SQL补全参数,根据预编译SQL中参数的类型,参数的位置,调用方法补全其参数:
// 预编译SQL的两个参数都是String类型的,所以说使用setString方法补全其参数
statement.setString(1, "liubei");
statement.setString(2, "123456");
调用executeQuery方法发起一条DQL语句,该方法的返回值是根据SQL语句查询到的内容,将会封装到ResultSet
这个类中,我们只需要操作这个类,就可以获取查询的结果:
// 调用executeQuery方法发起一条DQL语句,并将查询结果封装到ResultSet类中
ResultSet resultSet = statement.executeQuery();
操作ResultSet对象,将查询结果封装为实体类,直接操作ResultSet对象,根据数据库表中的字段名和字段类型
,获取到查询到的数据,进行封装即可。ResultSet对象操作和集合中的Iterator类似:
// 遍历ResultSet结果集合,将查询结果封装为User实体类
while (resultSet.next()) {
User user = new User(
resultSet.getInt("id"),
resultSet.getString("username"),
resultSet.getString("password"),
resultSet.getString("name"),
resultSet.getInt("age")
);
System.out.println(user);
}
操作数据库完成后,需要释放资源,释放资源的原则是先开后关
。
// 释放资源
resultSet.close();
statement.close();
connection.close();
成功使用DQL语句从数据库中查询到内容并封装为User实体对象:
总结
如上文所示,JDBC可以让我们在Java程序中操作数据库,但是使用起来确实也相对麻烦,所以说现在已经很少使用原生的JDBC了,而是使用基于JDBC实现的高级框架,如:MyBatis
、MyBatisPlus
等,这些优秀的框架使用起来十分的便捷,极大提高了我们开发的效率,但是我认为作为一个Java程序员,我们需要了解原生JDBC的使用。