JDBC概述
什么是JDBC
百度百科:
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
什么是数据库驱动
驱动:两个设备(应用)之间的桥梁
为什么学习JDBC
没有JDBC的时候,如果现在要开发一套系统,使用Java连接MySQL数据库,那么这时候Java程序员需要了解MySQL驱动API,如果使用Java连接Oracle数据库,那么这个时候Java程序员需要了解Oracle数据库驱动API。
SUN公司提供一套统一的规范 (接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。
JDBC的入门
JDBC的环境准备
创建数据库和表
CREATE TABLE `jdbc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`nickname` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
创建项目引入jar包
MySQLjar包下载地址
项目中引入jar包
JDBC的代码实现
JDBC的开发步骤
第一步:加载驱动
第二步:获得连接
第三步:基本操作
第四步:释放资源
JDBC的代码实现
Mysql8.0连接时的几个常见基本问题
连接MySQL8.0
Connection con = null;//与数据库连接的对象
Statement stmt= null;//执行SQL的对象
ResultSet rs = null;//存放结果集的对象
// 驱动程序名
final String driver = "com.mysql.cj.jdbc.Driver";
// URL指向要访问的数据库名
final String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC";
// MySQL配置时的用户名
final String user = "root";
// MySQL配置时的密码
final String password = "123456";
// 遍历查询结果集
try {
// 加载驱动程序
Class.forName(driver);
System.out.println("加载驱动成功!");
// 1.getConnection()方法,连接MySQL数据库!!
con = DriverManager.getConnection(url, user, password);
System.out.println("连接数据库!");
// isClosed():检索此Connection对象是否已关闭
if (!con.isClosed()) {
System.out.println("连接到数据库成功!");
}
// 2.创建statement类对象,用来执行SQL语句!!
stmt= con.createStatement();
// 要执行的SQL语句
String sql = "select * from user";
// 3.ResultSet类,用来存放获取的结果集!!
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.print(rs.getInt("id") + " ");
System.out.print(rs.getString("username") + " ");
System.out.print(rs.getString("password") + " ");
System.out.print(rs.getString("nickname") + " ");
System.out.print(rs.getInt("age"));
System.out.println();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
System.out.println("释放ResultSet成功");
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt!= null) {
try {
stmt.close();
System.out.println("释放Statement成功");
} catch (SQLException e) {
e.printStackTrace();
}
stmt= null;
}
if (con != null) {
try {
con.close();
System.out.println("释放Connection成功");
} catch (SQLException e) {
e.printStackTrace();
}
con = null;
}
}
运行结果:
JDBC详解之DriverManager
驱动管理类
作用:
- 注册驱动
这个方法可以完成驱动的注册,但是实际开发中-般不会使用这个方法完成驱动的注册!!
原因:
如果需要注册驱动,就会使用DriverManager.registerDriver(new Driver);但是查看源代码发现,在代码中有一段静态代码块,静态代码块已经调用了注册驱动的方法。
如果再手动调用该方法注册驱动,就会导致驱动被注册两次。
实际开发中一般会采用:
Class.forName("com.mysql.cj.jdbc.Driver");
- 获得连接
这个方法就是用来获得与数据库连接的方法,这个方法中有3个参数:
url: —与数据库连接的路径
user: —与数据库连接的用户名
password: —与数据库连接的密码
主要关注的是url的写法:
jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC
jdbc:—连接数据库的协议
mysql:—是jdbc的子协议,用来区分连接什么样的数据库
localhost:连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接的不是本机的,就需要写上连接主机的IP地址。
3306:MySQL数据库服务器的端口号
user:数据库名称
url如果连接的是本机的路径,可以简化为如下格式:
jdbc:mysql:///user
JDBC的API详解之Connection
与数据库连接的对象
作用:
- 创建执行SQL语句的对象
执行SQL语句对象
Statement:—执行SQL
CallableStatement:—执行数据库中存储过程
PreparedStatement:—执行SQL对SQL进行预处理。解决SQL注入漏洞。 - 管理事务
JDBC的API详解之Statement
执行SQL
作用:
- 执行SQL
执行SQL的方法:
- boolean execute(String sql);
执行查询,修改,添加,删除的SQL语句。 - ResultSet executeQuery(String sq);
执行查询(执行select 语句)。 - int executeUpate(String sql);
执行修改、添加、删除的SQL语句。
通常使用的是executeQuery和executeUpate两个方法。
- 执行批处理
将SQL添加到批处理中
情况批处理
执行批处理
可以写多个SQL语句,然后将SQL语句添加到批处理中,执行executeBatch方法执行。
JDBC的API详解之ResultSet
结果集,通过select语句查询的结果。
结果集的遍历:
遍历的原理:每使用一次next()方法就会遍历一行数据,从第一行开始,直到返回的是false为止。
代码实现:输出结果集时,int结果使用getInt,String结果使用getString
结果集的获取:
结果集获取可以使用结果集中的:
getXXX();方法通常都会有一个重载的方法。
getXXX(lint columnIndex);—通过列数来获取数据
getXX(String columnLabel);—通过列的名字获取数据,推荐使用本方法。
JDBC的资源释放
JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement.Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。
将资源释放的代码写入到finally 的代码块中。
资源释放的代码应该写的标准:
finally {
if (rs != null) {
try {
rs.close();
System.out.println("释放ResultSet成功");
} catch (SQLException e) {
e.printStackTrace();
}
//将re=null,是为了让垃圾回收机制更快的回收。
rs = null;
}
if (statement != null) {
try {
statement.close();
System.out.println("释放Statement成功");
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
if (con != null) {
try {
con.close();
System.out.println("释放Connection成功");
} catch (SQLException e) {
e.printStackTrace();
}
con = null;
}
}
JDBC的CRUD操作之添加操作
因为是添加数据的操作,所以就不需要使用ResultSet结果集了。
编写添加数据的SQL语句,然后使用executeUpdate方法执行SQL语句,executeUpdate方法返回的是影响的行数,判断影响的行数是否大于0就可以知道是否成功添加数据。
代码实现:
@Test
public void demo1() {
Connection con = null;
Statement stmt = null;
// 驱动程序名
String driver = "com.mysql.cj.jdbc.Driver";
// URL指向要访问的数据库名
String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC";
// MySQL配置时的用户名
String user = "root";
// MySQL配置时的密码
String password = "123456";
// 遍历查询结果集
try {
// 加载驱动程序
Class.forName(driver);
System.out.println(