JDBC
概念
JDBC,英文全称Java DataBase Connectivity,即Java 数据库连接。是官方SUN公司定义的一套操作所有关系型数据库的标准API。应用程序可以通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。
如上图所示,JDBC为开发者屏蔽了不同数据库驱动实现的差异性,数据库厂商去实现这套接口规范,提供数据库驱动jar包,开发者可以只需使用同一套JDBC提供的API就可以进行数据库的操作。
- JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql. Driver Manager类实现。
- JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql. Driver接口。
- JDBC驱动器:它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序。JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。
主要对象:
- DriverManager:驱动管理对象
Driver Manager类用于加载JDBC驱动并且创建与数据库的连接。在Driver Manager类中,定义了两个比较重要的静态方法:- registerDriver(Driver driver)
- getConnection(String url,String user,String pwd)
registerDriver(Driver driver):注册驱动
- registerDriver(Driver driver)
- Class.forName("com.mysql.jdbc.Driver");
上面两种方法都用于向 DriverManager中注册给定的JDBC驱动程程序,其中Class.forName的实现是由于在com.mysql.jdbc.Driver类中存在静态代码块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
}
catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
getConnection(String url,String user,String pwd):用于建立和数据库的连接,并返回表示连接的 Connection对象
- Connection:数据库连接对象
Connection接口代表Java程序和数据库的连接,在Connection接口中,定义了一系列方法,具体如表所示。
功能:
* 获取执行sql 的对象 Statement createStatement() PreparedStatement prepareStatement(String sql)
* 管理事务:开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务;提交事务:commit();回滚事务:rollback()
- Statement/PreparedStatement
Statement接口用于向数据库发送SQL语句,在Statement接口中,提供了三个执行SQL语句的方法,具体如表所示。
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句,也能防止SQL注入。在PreparedStatement接口中,提供了一些基本操作的方法,具体如表下所示。
- ResultSet:结果集对象
ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
-
获取行
ResultSet提供了对结果集进行滚动的方法:- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
-
获取值
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:-
获取任意类型的数据
getObject(int index)
getObject(string columnName) -
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
-
示例:
ResultSet rs = null;
//4.向数据库发sql,并获取代表结果集的resultset
String sql = "select id,name,password,email,birthday from users";
rs = st.executeQuery(sql);
//5.取出结果集的数据
rs.afterLast();
rs.previous();
System.out.println("id=" + rs.getObject("id"));
System.out.println("name=" + rs.getObject("name"));
System.out.println("password=" + rs.getObject("password"));
System.out.println("email=" + rs.getObject("email"));
System.out.println("birthday=" + rs.getObject("birthday"));
或
//循环取出(id)
while(rs.next())
{
String id=rs.getString(1);//1代表数据库中表的列数,id在第一列也可以("id")!!!
System.out.println(id+" ");
}
- CallableStatement:存储过程
存储过程就是将一组SQL保存为一个逻辑执行单元,执行一个特定的任务。形式如下:
delimiter //
CREATE PROCEDURE spanish (OUT population_out INT)
BEGIN
SELECT COUNT(*) INTO population_out FROM countries;
END//
delimiter ;
CALL simpleproc(@a);
调用存储过程,则需要使用CallableStatement
String spanishProcedure = "{call spanish(?)}";
CallableStatement callableStatement = connect.prepareCall(spanishProcedure);
callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.executeUpdate();
String total = callableStatement.getString(1);
System.out.println( "amount of spanish countries " + total );
使用JDBC完整流程:
- 导入驱动jar包
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
//1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ppw", "root", "root");
//4.定义sql语句
String sql = "update user set name = 'ppw' where id = 1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();