Java的JDBC编程
这里写目录标题
1 概念
何为 JDBC编程
就是通过Java代码来操作数据库
咱们学数据库,无论是命令行 还是图形化界面,都不是开发中的主流使用方式
通过代码操作数据库,才是正真主流的方式
但无论是哪种方式,核心知识都是SQL
像我们的一些主流数据库,为了方便程序猿实现客户端程序,会提供一些 API 接口,称为“数据库SDK”,我们可以借助这些API比较方便地访问数据库服务器
- API是计算机中一个非常广泛使用的术语,也就是提供了一些类/方法/函数,可以让程序猿直接调用来完成一些功能
- SDk也是计算机中一个非常广泛使用的术语,指软件开发工具包,提供了一些工具
由于API是数据库提供的,所以不同的数据库,提供的API站的可能都不一样
我们希望有一个统一的标准,于是Java就提供了一套标准的接口体系,让这些数据厂商,提供得到API都往Java的这套接口体系中适配
程序员就只需要掌握Java的这一套API即可适应所有常见的主流数据库了
Java的这套操作数据库 的API,就称为 JDBC
各个数据库厂商,为了能够适配 JDBC
因此就需要写一些额外的程序来完成这个工作.厂商提供的这套额外的程序,称为"JDBC驱动包"使用Java操作各种数据库,就需要安装对应数据库提供的驱动包,才能真正进行使用
JDBC本质上就是Java对于各种数据库差异性的封装,目的就是为了简化程序猿的学习使用成本 !
2 安装驱动包
首先需要先有驱动包
从哪里去找驱动包?
- MySQL官网 (Oracle收购) 不太容易
- 中央仓库,驱动包也是一种"第三方库" 。第三方库有很多,就有大佬,把各种第三方库收集起来,放到一个统一的网站上。
下面介绍一个仓库
[/Maven Repository仓库](Maven Repository: Search/Browse/Explore (mvnrepository.com))
找到这个

在版本列表中选择5系列的版本(5.1.49,5.1.47这些都可以)要和 你的数据库服务器版本匹配,数据库是mysql8,就用8.0系列
是5就用5系列

选择一个版本,点进去

然后就开始下载了

下载好之后,就得到了一个 .jar 后缀的文件,叫做jar包,本质上就是一个类似于rar的压缩包
( Java发布程序给别人使用的时候,也会经常打jar包,jar包里主要就是一些 .class 文件)

然后用解压软件打开

像这样的压缩包,不需要手动解压缩,直接放到项目中即可,JVM在运行的时候就能自动读取压缩包内部的内容
新建一个目录,然后把刚刚的 jar包拷贝到这个目录里


然后就会变成这样

右键,找到 add as library

直接点OK

然后,这个jar包就能被idea识别了!
3 实现JDBC编程
接下来,就可以进行代码的编写了
要操作数据库,就得连接上数据库服务器,要想连上数据库服务器,就得描述清楚服务器所在的位置
在JDBC里面,使用DataSource这类来描述数据库的位置
这个操作,就是向上转型
用一个父类引用指向子类的实例
这个操作,就是向下转型
当然,上面两步操作就等价于这一步
虽然两种写法没啥区别.但是实际开发中可能还是更多的看到第一种写法!!
**第一种写法**里,得到的数据源是==DataSource类型==.
后续写其他代码,方法/类,如果使用到数据源,持有的类型也是DataSource类型。
DataSource是通用的类型,可以代指任何数据库。未来一旦需要更换数据库,代码改动是非常小的,只需要把实例化这一小块代码改了即可,其他代码都不用变。
第二种写法,得到的数据源是==MysqIDataSource类型==。
后续的其他代码,方法/类,如果用到数据源,持有的类型也就是MysqlDataSource
MysqIDataSource只是针对MySQL的类型.
未来一旦更换数据库,可能就需要把散落在代码各个地方的MysqIDataSource类型进行修改.
- 这也是咱们所学习的"多态"的重大的意义
- 多态本质其实就是对于"封装"的更进一步
- "封装"是为了让程序猿不必了解太多的实现细节,就能直接使用,从而降低使用成本.
- "多态"就是更进一步, 不光程序猿不必了解细节了,而且甚至于连这个对象是啥类型都可以不必关心了.更进一步的降低了使用成本~~
第一步我们要做的就是通过DataSource来确定服务器的位置~~
那么位置如何描述?
描述一个网络上的资源,常用手段,就是使用URL (唯一资源定位符/网址)
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
这一长串就是我们的URL
下面我们对它简单的解析一下,看看它其中都隐藏的那些信息??
向上述URL,我们不必要去背!
背,是很容易背错的,写了一次之后,后续只要复制粘贴即可
//1. 使用 DataSource 描述 MySQL 服务器的位置
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("******");
以上操作,就描述了数据库的位置!
- IP地址
- 端口号
- 数据库名
- 用户名
- 密码
第二步,就是和数据库服务器建立连接
在网络通信中,有两种风格,
一种是 “ 有连接 ”,相当于“ 打电话 ”,必须要电话拨通了(连接建立上了),两者才能通信
一种是 “ 无连接 ”,相当于“ 发微信 ”
数据库这里的通信方式采取的是有连接的方式
好处是,就是能够在通信之前,先"投石问路", 先看看通信的链路是否畅通
坏处是,就是连接需要进行管理.尤其是不用的连接要记得及时释放 (以前用座机的时候,经常有一种bug,电话没扣严实)
使用dataSource.getConnection来建立连接

然后我们发现
这是数据库编程中常见的异常,受查异常,(受查异常一定要手动处理,非受查异常不一定要手动处理)
- throws
- try catch
啥时候会抛出异常?
和数据库连接失败的时候就会抛异常
啥时候会连接失败,原因有很多
DataSource这里填写的信息,任何有一点点纰漏,都会导致连接失败。一般耐心阅读失败的详细信息,都是可以很容易找到问题的
看到了这个对象就说明现在已经连接成功了
如果密码或用户名输错了就会这样
第三步,构造 SQL 语句,(JDBC 操作数据库,本质仍然是通过 SQL 来描述数据库操作)
//例如,插入数据的操作
//直接用String 格式的类还不行,还需要搭配一个特殊的类
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
第四步,执行SQL
//4.执行SQL
//insert,update,delete都是通过 executeUpdate 来执行的
// select 则是通过 executeQuery 来执行的
//executeUpdate的返回值是一个整数,表示这个操作影响到几行
int n = statement.executeUpdate();
第五步,断开连接,释放资源 (后创建的先释放)
//5.断开连接,释放资源 (后创建的先释放)
statement.close();
connection.close();
完整的代码
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 jdbcHello {
public static void main(String[] args) throws SQLException {
//1. 使用 DataSource 描述 MySQL 服务器的位置
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 和 数据库 建立连接 使用dataSource.getConnection来建立连接
Connection connection = dataSource.getConnection();
//System.out.println(connection);
//3. 构造 SQL 语句,JDBC 操作数据库,本质仍然是通过 SQL 来描述数据库操作
//例如,插入数据的操作
//直接用String 格式的类还不行,还需要搭配一个特殊的类
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL
//insert,update,delete都是通过 executeUpdate 来执行的
// select 则是通过 executeQuery 来执行的
//executeUpdate的返回值是一个整数,表示这个操作影响到几行
int n = statement.executeUpdate();
System.out.println("n = "+n);
//5.断开连接,释放资源 (后创建的先释放)
statement.close();
connection.close();
}
}
看一看运行的效果把~

然后我们打开MySQL命令行客户端查看,发现操作成功

如果再次执行程序,是会报错的!
小结: JDBC中的关键概念
- DataSource描述了数据源. (数据在哪,服务器在哪…
- Connection表示一个连接. 需要先建立连接才能进行通信。一个数据库服务器可以同时处理多个连接.
- PreparedStatement描述了一个SQL语句,通过这个对象来执行SQL
看,发现操作成功

如果再次执行程序,是会报错的!
[外链图片转存中…(img-N3fFa8vp-1658023416775)]
小结: JDBC中的关键概念
- DataSource描述了数据源. (数据在哪,服务器在哪…
- Connection表示一个连接. 需要先建立连接才能进行通信。一个数据库服务器可以同时处理多个连接.
- PreparedStatement描述了一个SQL语句,通过这个对象来执行SQL