JDBC:Java的数据库编程
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问
MySQL本身提供了一组API供程序员调用,Oracle,SQL server,SQLite都提供了这样的API让程序员调用,这些不同的数据库提供的API并不相同
程序员希望,大家的API是一样的,但是各个数据库厂商互不相让,此时Java就站了出来
Java给出一套API接口标准,让数据库厂商来照着写,每个数据库厂商都额外写一点代码从而程序员就可以学会Java的这一套API标准就可以让程序员在各个数据库之间来回无缝衔接
这一套API就是JDBC,这一套接口标准可以形象表示为下图
接口转换程序称为"数据库驱动",平时我们所理解的驱动是硬件方面,但是它是软件,在以前,浏览器需要下载驱动才能运行,一旦版本不匹配需要重新匹配,在自动测试方面就有WebDriverManager来实现驱动管理
JDBC是Java标准库提供的,你只要装了JDK就都自带了JDBC,但是使用JDBC操作MySQL就需要下载并导入MySQL驱动包,下载安装一个程序,最好就是去官网下载,但是对于MySQL驱动包来说,Oracle官网藏得很深,强制你注册登录,这时我们可以用到中央仓库(Maven),去中央仓库下载即可
下载MySQL驱动包
搜索MySQL即可找到驱动包,Connector/J是新版本,另一个Java则是旧版本,小版本区别不大
注意:小版本前面的最高序号需要与你的MySQL版本号最高位一致,我的是5.7,所以下载5开头版本的Connector包
我们可以使用下载依赖的方法来注入依赖,这里我们采用引入第三方库
点击这里进行下载,
.jar其实是一个类似于.rar这样的压缩文件,里面包含了很多.class文件,写好的Java文件,就可以把编译出来的.class拷贝给别人,别人就能运行使用了,但是由于一个程序中,往往.class文件会有很多,涉及到一些复杂的目录结构,直接拷贝一堆.class文件非常不友好,于是就把这些要发布的.class按照待定格式打包压缩就得到了.jar文件,后续直接拷贝就可以了,同时JJVM也可以直接识别.jar内部的.class文件并直接运行
-
创建一个目录,并且把下载好的驱动放在该目录里
-
右键这个目录,单击add as library,告诉IDEA,当前这个目录是存放第三方库的目录,此时IDEA就能够识别咱们拷贝进来的驱动包了
此时IDEA能够识别驱动包
以上就是JDBC程序的准备工作了,准备工作完成后就可以编写代码了
编写JDBC代码
-
DateSource数据源:要操作的数据库,数据,是在哪里
package org.example.demo;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;//JDBC自带的interface
public class Demo {
public static void main(String[] args) {
//1.创建数据源 - 这个过程就是所谓的 "数据库厂商写代码和JDBC进行对接"
DataSource dataSource = new MysqlDataSource();//MySQLDataSource 这个类就是来自于MySQL的驱动包
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//这样写也可以,但是第一种是向上转型的写法,更能体现代码的解耦合
}
}
-
在MySQL中,就需要设定好,MySQL服务器的位置,要访问的数据库的名字,访问数据库的用户名和密码
package org.example.demo;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
public class Demo {
public static void main(String[] args) {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/j?characterEncoding=utf8&useSSL=false");
//此时seturl中分别是固定格式jdbc:mysql://127.0.0.1:3306/这个地方是数据库名称?这个地方是编码&这个地方是某种协议(加密通信)
((MysqlDataSource) dataSource).setUser("root");
//设置用户名
((MysqlDataSource) dataSource).setPassword("root");
//设置用户名密码
}
}
MySQL是一个客户端 服务器程序,服务器是保存数据的本体,之前的类似cmd黑框是MySQL客户端,进行客户端-服务器之间的通信的时候,常见的有两种通信的模式:
- 有连接(JDBC就属于‘有连接’),可以通俗理解为需要先拨号
- 无连接
-
此时需要创建连接,注意一定是第第三个 java.sql
package org.example.demo;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Demo {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/j?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("root");
2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//此时需要抛出异常,抛出SQLException异常
//这一步写错有很多原因,
//数据库服务器没有正确启动
//url写错了,用户名写错了,密码写错了,网络断开了()等等
}
}
-
按照表的结构构造两个参数
Scanner scanner = new Scanner(System.in);
// 3. 能够构造一个操作数据库的 sql 语句.
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入name: ");
String name = scanner.next();
-
此时创建一个预编译对象
一个字符串SQL发送到数据库服务器上,是要先对sql进行解析,进行各种校验(判断sql是否符合语法要求等才能执行),这个解析操作也是需要花费一定开销的,虽然开销不是很大,但是MySQL服务器需要同时给多个客户端提供服务,将结果解析在客户端完成,此时把解析的结果发送给服务器,服务器直接执行即可
// String sql = "insert into test values(" + id + ", '" + name + "')";
String sql = "insert into JDBC values(?, ?)";//可以把这个理解为通配符
//这是一个带有"预编译"功能的语句对象
//此时这里进行编译工作,IDEA相当于是客户端
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, id);
preparedStatement.setString(2, name);
-
将MySQL客户端中的 XX rows affected (0.00sec),只是要将得到的结果返回给服务器
// 4. 执行 sql, 把刚才解析好的语句发给数据库服务器了.
// 返回值是一个 int 类型, 表示这个操作影响了几行数据.
int n = preparedStatement.executeUpdate();
System.out.println("n = " + n);
-
将资源释放
·· // 5. 执行完毕, 有收尾操作. 释放前面创建的各种资源.
// 主要是释放 语句对象 和 连接对象. DataSource 是不必释放的.
preparedStatement.close();
connection.close();
scanner.close();
//此时需要保证先断开预编译对象,在释放连接
总结:
-
DataSource:数据源
-
Connection:连接对象
-
PreparedStatement:预编译对象