提示:以下是本篇文章正文内容
JDBC编程
JDBC编程 就是通过 Java 代码来操作数据库。实际开发中,绝大多数情况,都是通过代码操作数据库的,手动操作数据库,只有少数的,调试,测试,验证环境…才会涉及到。
Java 中操作数据库,最基础的方式就是JDBC(当然还有其它方式)。
数据库是一个类别,除了MySQL数据库之外,还有Oracle、SQL Server等其它数据库。而代码操作数据库的前提,是需要数据库提供API,咱们调用API来完成操作的。这里的API(Application Programming Interface)其实是应用程序编程接口的意思。举个例子,如果你去餐厅点餐,那么你无需顾忌菜品是如何制作出来的,你只需根据菜单点菜,后厨收到菜单要求,自然而然就会完成你所需要的菜品。在这个过程中,菜单就相当于一个 API,用来完成你与后厨之间的交互。
由于数据库多种多样,那么它们所提供的 API 自然就不一样了。如果每次对不同数据库进行编程,都需要学习该数据库的 API ,那么这无疑大大增加了程序员学习的成本。因此, Java 就站出来了,将这些数据库厂商聚拢到一起商讨,决定由Java 提供一套 API 的标准,把各个厂商的数据库已经搞好的 API ,再重新包装一下,搞到一起。这个时候,程序员只要按照一套 API 来搞就行了,而无需再关心各自数据库 API 的差异。各个数据库原有的 API 不变,在这个基础上,加个封装层,适配到 JDBC 这一套接口上。
- 准备工作,引入MySQL的JDBC驱动包:
这里的驱动包,属于“第三方库”,不是 JDK 里原生就有的,而是需要通过其它途径下载来并引入到项目中。
Java世界中,有一个叫做“中央仓库”的东西。有一群大佬,把第三方库收集起立,统一放到一个服务器上,就可以通过这个服务器获取到了。后续一些新的开发者做了些新的第三方库,也会上架到这个中央仓库中。这也是所谓 Java 中的生态。
以下是引入 JDBC驱动包的步骤:
1.访问网站
https://mvnrepository.com/
2.搜索MySQL
以下两个都是 JDBC驱动包的下载源,只不过上面是MySQL比较新的版本的驱动包(本机MySQL版本是5.7.27)。
3.只要大版本是一样的,那么任意下载一个问题就不大。
4.点击jar进行下载。
5.打开文件所在目录,复制文件。
6.打开IDEA,创建一个目录。
7.将文件复制到目录。
8.右键文件,点击Add as library。
9.最后完成 JDBC驱动包 的导入。
以下是JDBC编程 增删改部分代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBC_Test {
public static void main(String[] args) throws SQLException {
//1.创建数据源,数据源描述了你要操作的数据库在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8?useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("111111");
//2.和数据库服务器,建立连接
Connection connection = dataSource.getConnection();
//3.构造一个SQL
String sql = "insert into student values (3, '张三')";
//需要把String SQL 转换成 语句对象
PreparedStatement statement = connection.prepareStatement(sql);
//4.把构造好的 SQL 发送给服务器去执行
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5.最后一步,释放必要的资源
statement.close();
connection.close();
}
}
说明:
//1.创建数据源,数据源描述了你要操作的数据库在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8?useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("111111");
数据库是服务器,因此需要明确服务器的位置。我们通过 ip地址 + 端口号 + 数据库名 来定位。ip地址是用来描述一个主机在网络上的位置的一个机制,一个主机有多个服务器程序,端口号是用来区分不同服务程序的(下载MySQL服务器默认端口号是3306),数据库名自然是用来确定所选数据库的。
程序中先是使用向上转型后又向下转型(DataSource和MysqlDataSource)。这是 Java 圈子中喜好的一种写法。
//2.和数据库服务器,建立连接
Connection connection = dataSource.getConnection();
这里需要导入的包需要注意是java.sql这一个。
这个代码会和数据库服务器之间建立连接。连接建立好了之后,就可以进行后续的通信了。
//3.构造一个SQL
String sql = "insert into student values (3, '张三')";
//需要把String SQL 转换成 语句对象
PreparedStatement statement = connection.prepareStatement(sql);
String sql = "insert into student values (?, ?)";
int id = 2;
String name = "张三";
//需要把String SQL 转换成 语句对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
这里的 sql 使用了?作为占位符,占位的目的是为了进行"替换"。然后使用set数据类型 的方法。
PreparedStatement 其实是指预处理过的SQL。要执行的 SQL,是需要进行语法解析的。语法解析,也是有一定开销的。通过控制台,写 SQL,都是把原始的 SQL 发送给服务器。服务器负责解析 SQL 并执行。使用 Statement也是类似,也是服务器先解析,再执行。而使用 PreparedStatement,就不一样,就可以在客户端这边,提前把 SQL 解析好,再把解析好的结果发送给服务器,服务器的解析开销就大幅度降低,直接执行即可。
注意:1.Source数据源:描述了数据库服务器在哪里 2.Connection连接:需要先建立连接,才能进行通信。基于DataSource构造出来。知道数据库服务器在哪里,才能建立连接 3.PrepareStatement语句:基于连接来生成的,当前语句对象也是要发送给服务器的
//4.把构造好的 SQL 发送给服务器去执行
int n = statement.executeUpdate();
System.out.println("n = " + n);
这里返回值为int,表示影响数据库的行数。
此时,代码就会构造一个网络请求,发送给 MySQL 服务器(这个代码相当于扮演MySQL客户端的角色,相当于cmd),并且会等待服务器的响应数据,把得到的响应最终显示到控制台上。
//5.最后一步,释放必要的资源
statement.close();
connection.close();
当然,这两个对象内部都持有一些计算机的重要软/硬件资源,所以我们再程序最后需要释放掉这些资源。而释放的顺序,和创建的顺序是相反的。
以下是JDBC编程 查找部分代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBC_Test {
public static void main(String[] args) throws SQLException {
//1.创建数据源,数据源描述了你要操作的数据库在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8?useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("111111");
//2.和数据库服务器,建立连接
Connection connection = dataSource.getConnection();
//3.构造一个SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.把构造好的 SQL 发送给服务器去执行
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
//这个代码,就是获取“id”这一列的数值,期望得到一个 int
int ID = resultSet.getInt("id");
//这个代码,就是获取“name”这一列的数值,期望得到一个 String
String NAME = resultSet.getString("name");
System.out.println("id: " + ID);
System.out.println("name: " + NAME );
}
//5.最后一步,释放必要的资源
resultSet.close();
statement.close();
connection.close();
}
}
说明:
ResultSet 就是结果集合,代表了查询返回的临时表。可以类似于迭代器遍历的方式,遍历这里的每行数据。