JDBC
全称:java 数据库连接 - java database connectivity standard。
JDBC是java语言用于访问数据库的应用编程接口API,通过它可访问各类关系数据库。
知识要点:
- JDBC简介
- JDBC类和接口
- JDBC调用存储过程
- LOB的读写
- JDBC事务
JDBC简介
两层组成:
- 上面一层JDBC API,负责与JDBC驱动程序管理器API进行通信。
- 下面一层驱动程序管理器API,它与实际链接到数据库、由供应商提供的数据库驱动程序进行通信,并且返回查询的信息,或者执行由查询规定的操作。
使用JDBC可以方便的将SQL语句传递给几乎任何一种数据库。使用JDBC写的程序可以传给相应的数据库管理系统DBMS。
JDBC 类和接口
java.sql包中提供的常用类和接口。
java.sql包中提供了JDBC中核心的常用类、接口和异常。
用户使用JDBC的主要操作:与数据库建立连接、执行SQL语句、处理结果等,主要涉及DriverManager类、Connection接口、Statement接口、PreparedStatement接口和ResultSet接口。
DriverManager类
DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。
DriverManager.getConnection建立与数据库的链接。
要使用JDBC来存取特定的数据库,必须有相应的JDBC driver,是链接JDBC API 与具体数据库之间的桥梁。
java程序首先使用API来与JDBC DriverManager交互,由manager载入指定的JDBC driver,此后就可以通过JDBC API来存取数据库。
本地协议纯java驱动程序
JDBC转化为数据库直接使用的网络协议,不需要安装客户端软件,使用java sockets来连接数据库。
Connection接口
Connection对象代表特定数据库的链接(会话)。通过DriverManager类的静态方法,getConnection()方法可以获取Connection接口的实现类对象。
-
static Connection getConnection (String url)
-
static Connection getConnection(String url, Properties info)
-
static Connection getConnection(String url, String user, String password);
Statement接口
Statement对象用于将SQL语句发送到数据库中,执行对数据库的数据的检索或者更新。
两个子接口:CallableStatement和PreparedStatement。
-
Statement createStatement()
:创建一个Statement对象来将sql语句发送到数据库 -
Statement createStatement(int resultSetType, int resultSetConcurrency)
: 创建一个Statement对象,该对象生成具有给定类型和并发性的ResultSet对象。 -
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
:创建一个Statement对象,该对象生成具有给定类型和并发性和可保存性的ResultSet对象。
PreparedStatement接口
Statement主要执行静态的SQL语句。如果有些操作只是用来SQL语句中某些参数不同,其余SQL子句相同,则可用PreparedStatement来提高执行效率。可以使用Connection的PreparedStatement()方法建立好一个预先编译的SQL语句:其中参数变动的地方先用?作为占位符,等到真正指定参数执行时,在使用相应的setXXX(int parameterIndex, 值)方法,指定?处真正应该有的参数值。
ResultSet接口
包含了SQL语句中条件的所有行,并且通过一套get()方法提供了对这些行中数据的访问,这些get()方法可以访问当前行中的不同列。ResultSet.next()方法用于移动到ResultSet中的下一行,使下一行成为当前行。
JDBC规范中提供了数据库类型与JAVA类型关系对应表。
JDBC操作sql
步骤:
-
创导与SQL相关的包
import java.sql.*;
-
加载JDBC驱动程序
根据不同的数据库加载对应厂商提供的驱动程序。把厂商提供的驱动程序JAR包添加到classpath,在代码中显式加载数据库驱动程序类。加载完数据库驱动程序类后,驱动程序会自动通过DriverManager.registerDriver()方法注册,这样就可以与厂商的驱动程序通信了。
常见驱动程序全名:
- MySQL:com.mysql.jdbc.Driver
- SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
- Oracle: oracle.jdbc.driver.OracleDriver.
-
提供链接URL
链接URL定义了链接数据库时的协议、子协议、数据源识别。
形式为:“协议:子协议:数据源识别”
协议在JDBC中总是以jdbc开始;子协议是桥接的驱动程序或是数据库管理系统名称,mysql对应的就是“mysql”;”数据源识别“标出找出数据库来源的地址与链接端口
mysql的链接URL:jdbc:mysql://主机名称:链接端口/数据库名称?参数=参数值&参数=参数值。
jdbc:mysql://localhost:3306/db1?user=root&password=123&useUnicode=true&characterEncoding=GBK;
-
建立一个数据库的链接
需要向DriverManager要求并获得Connection镀锡,一个Connection对象代表一个数据库连接。
使用DriverManager的getConnection()方法传入指定的连接URL、用户名和密码来过得。
String url = "jdbc:mysql://localhost:3306/db1"; Connection conn = DriverManager.getConnection(url, "root", "root");
-
创建一个Statement对象
Statement对象是SQL叙述的具体代表对象。
Statement stmt = conn.createStatement();
-
执行SQL语句
获得Statement对象后可以使用方法去执行SQL。
-
int excecuteUpdate(String sql):执行改变数据库内容的SQL,如insert、update、delete,返回操作影响到的记录数。
-
java.sql.RusultSet executeQuery(String sql):执行查询数据库的SQL,如SELECT语句,返回查询到的结果集ResultSet对象。
int rows = stmt.executeUpdate("insert into db1;"); Result rs = stmt.executeQuery("select * from db1;");
-
-
处理结果
ResultSet是数据库结果集的数据表。Result对象具有指向当前行的光标。最初在第一行。
可以使用ResultSet的next()方法来移动光标到下一行,它会返回true和false表示是否有下一行记录。
两种方式获得当前行获取指定列的值:
- getXXX(int columnIndex) :使用列索引获取值,列从1开始编号。
- getXXX(String columnLabel):使用列的名称获取值。
-
关闭JDBC对象
操作完成需要把所使用的JDBC对象全部显示关闭释放JDBC资源 。
- 调用ResultSet的close()方法
- 调用Statement的close()方法
- 调用Connection的close()方法
JDBC基本示例
package JDBC;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
public class MyJdbcTest {
public static void main(String[] args) throws Exception {
// 1.导入驱动jar包
// 2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 3.获取数据库连接对象
Connection cnnt = DriverManager.getConnection("jdbc:mysql://localhost:3306/newtest?characterEncoding=utf-8&serverTimezone=UTC", "root", "password");
// 4.定义sql语句
String sql = "update student set id = 22,age = 18,name = ‘deng‘ where id = 1";
// 5. 创建执行sql语句的对象Statement
Statement stmt = cnnt.createStatement();
// 6.执行SQL
int count = stmt.executeUpdate(sql);
// 7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
cnnt.close();
}
}