第一部分 jdbc概述
1、JDBC(Java DataBase Connectivity),即Java数据库连接技术。它是一套用于访问【关系型数据库】的应用程序API,由一组用Java语言编写的【类和接口】组成。
2、jdbc是一种规范,它由Sum公司(Oracle)提供了一套完整的接口。JDBC规范提供的接口存在于java.sql包中,如下:
3、不同的数据库厂商只需要【按照jdbc规范】提供的api接口进行各自的实现,程序员只需要【面向接口和规范】编程,不需要关心具体的实现。
不同数据库的底层技术不同,不少数据库还是闭源的,源代码不公开的。Sun公司不可能为所有数据库提供具体实现,只能提供一套统一的接口规范。
4、Mysql提供的【JDBC实现】称为Mysql Connector,不同的数据库版本需要使用不同的Connector。实际开发时根据数据库版本、JDK版本、选择不同的Connector。
Connector版本 | MySQL版本 | JDK版本 |
---|---|---|
8.0 | 5.6, 5.7, 8.0 | JDK 8.0 或更高 |
5.1 | 5.6, 5.7 | JDK 5.0 或更高 |
选择自己对应的版本下载:
https://developer.aliyun.com/mvn/search
或者
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.30
进行下载
第二部分 获取连接
JDBC中定义了操作数据库的各种接口和类型,以下可能会使用到,如下:
接口 | 作用 |
---|---|
Driver | 驱动接口 |
DriverManager | 工具类,用于管理驱动,可以获取数据库的链接 |
Connection | 表示Java与数据库建立的连接对象(接口) |
PreparedStatement | 发送SQL语句的工具 |
ResultSet | 结果集,用于获取查询语句的结果 |
我们使用java代码获取mysql连接时需要以下三个要素:
一 、驱动
1、Driver接口介绍
java.sql.Driver
接口是所有【驱动程序】需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
不同的厂商提供了不同的驱动,如下:
- Oracle的驱动:oracle.jdbc.driver.OracleDriver - mySql 的驱动:com.mysql.cj.jdbc.Driver | com.mysql.jdbc.Driver
将上述jar包拷贝到Java工程的一个目录中,习惯上新建一个lib文件夹,不同的idea有不同的操作。
2、加载与注册驱动
-
加载驱动:我们需要将数据的的驱动实现类加载到JVM中,实现这个目的我们可以使用 Class 类的静态方法 forName(),向其传递要加载的驱动的类名
Class.forName(“com.mysql.cj.jdbc.Driver”)
。当然,理论上你new一个也行,第一次主动使用一个类就会触发类的加载。这里【为什么不new】我们先卖一个关子。Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
-
创建驱动:
Driver driver = (Driver) clazz.newInstance();
-
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序。
使用DriverManager.registerDriver(com.mysql.cj.jdbc.Driver)来注册驱动。
DriverManager.registerDriver(driver);
二、URL
1、URL 用于标识一个被注册的驱动程序,从而建立到数据库的连接。
2、URL的标准由三部分组成,各部分间用冒号分隔:
-
协议:java的连接URL中的协议总是jdbc 。
-
子协议:子协议用于标识一个数据库驱动程序。
-
子名称:一种标识【数据库】的方法。子名称作用是为了【定位数据库】。其包含【主机名】(对应服务端的ip地址),【端口号】,【数据库名】。
3、MySQL的连接URL编写方式:
-
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值。
-
最简单的写法:jdbc:mysql://localhost:3306/ydlclass。
-
带参数的写法:jdbc:mysql://localhost:3306/ydlclass?key1=value1&key2=value2
-
mysql8.0后必需要加上
serverTimezone=UTC
",指定当前服务器所处的时区。(也要看jdbc的版本)serverTimezone=Asia/Shanghai
我们也可以使用UTC(世界统一时间),但是这个时间和中国的时间差八小时(东八区),所以我们可以这样写:
serverTimezone=GMT%2B8(%2B相当于“+”号)
image-20220810130615995
注:通常一个高版本的mysql的url还会包含以下三个参数:
useUnicode=true&characterEncoding=utf8&useSSL=false
1、useUnicode=true&characterEncoding=UTF-8
的作用是:指定字符的编码、解码格式。
比如:若mysql数据库用到 是GBK编码方式,而项目数据用的是UTF-8编码方式。这时如果添加了"useUnicode=true&characterEncoding=UTF-8",则在存取数据时根据mysql和项目的编码方式将数据进行相应的格式转化。即:
(1)存数据
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码,并存放到数据库中。
(2)取数据
在数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
2、MySQL5.7之后要加上useSSL=false
,mysql5.7以及之前的版本则不用进行添加useSSL=false,会默认为false。
-
useSSL=true:就是一般通过证书或者令牌进行安全验证
-
useSSL=false:就是通过账号密码进行连接
-
SSL协议提供服务主要: 认证用户服务器,确保数据发送到正确的服务器; . 加密数据,防止数据传输途中被窃取使用; 维护数据完整性,验证数据在传输过程中是否丢失;
完整的url:
jdbc:mysql://localhost:3306/ydlclass?
serverTimezone=GMT%2B8&useUnicode=true
&characterEncoding=utf8&&useSSL=false
小知识:
-
Oracle 的连接URL编写方式:
jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
jdbc:oracle:thin:@localhost:1521:ydlclass
-
SQLServer的连接URL编写方式:
jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称
jdbc:sqlserver://localhost:1433:DatabaseName=ydlclass
三、用户名和密码
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接,此方法需要传递三个参数:
-
url:jdbc:mysql://localhost:3306/ydlclass?useUnicode=true&characterEncoding=utf8&&useSSL=false&serverTimezone=GMT%2B8
-
username:root (mysql数据库的用户名)
-
password:root (mysql数据库的密码)
四、获取连接方法
第一种方法:普通看似正常的获取连接
@Test
public void testConnection1() throws SQLException {
//1 定义要素
String driverName = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/ydlclass";
String username = "root";
String password = "root";
//2. 加载驱动,实例化驱动
Driver driver = new com.mysql.cj.jdbc.Driver();
//3. 注册驱动
DriverManager .registerDriver(driver);
//4. 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println(connection);
}
第二种方法:jvm注册驱动
@Test
public void testConnection2() throws SQLException, ClassNotFoundException {
//1 定义要素
String url = "jdbc:mysql://localhost:3306/ydlclass";
String username = "root";
String password = "root";
//2. 加载驱动,实例化驱动
//仅仅需要jvm注册一下就可以了
new com.mysql.cj.jdbc.Driver();
//3. 注册驱动
// DriverManager .registerDriver(driver);
//4. 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println(connection);
}
在现在的jdbc中一般默认驱动注册为自动加载与注册
简称spi机制
所以可以直接使用connection就能完成jdbc的注册工作
第三种 方法
@Test
public void testConnection2() throws SQLException, ClassNotFoundException {
//1 定义要素
String url = "jdbc:mysql://localhost:3306/ydlclass";
String username = "root";
String password = "root";
//获取连接,并自动注册驱动
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println(connection);
}
查询案例
@Test
public void testConnection2() throws SQLException, ClassNotFoundException {
//1 定义要素
String url = "jdbc:mysql://localhost:3306/ydlclass";
String username = "root";
String password = "root";
//获取连接,并自动注册驱动
Connection connection = DriverManager.getConnection(url, username, password);
//Statement:用于执行静态 SQL 语句并返回它所生成结果的对象
Statement statement = connection.createStatement();
//Query获得返回结果的一个集合,可以在executeQuery中直接添加sql语句
ResultSet resultSet = statement.executeQuery(sql);
//resultSet.next()相当于一个迭代器
while( resultSet.next()) {
//把数据库表中对象实体化
User user = new User();
//获取当前query中的那一列
int id = resultSet.getInt(1);
String username = resultSet.getString(2);
String password = resultSet.getString(3);
Date birthday = resultSet.getDate(4);
//把数据库的内容写到user对象中
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setDate(birthday);
//重写了是实体类所以现在打印直接是字符串
System.out.println(user);
}
}