JDBC中常用的接口

JDBC常用的接口
DriverManager
驱动管理器获得数据库链接

Connection
数据库链接接口

Statement
语句接口,用来静态操作SQL语句

PreparedStatement
预定义语句,用来动态操作SQL语句

CallableStrtement
可以调用存储过程的预定义语句

ResultSet
结果集,保存数据记录的结果集合

ResultSetMetaData
结果集元素数据如:列名、列类型

DatabaseMetaData
数据元数据:数据库名称、版本
---------------------
DriverManager:用于管理JDBC驱动的服务类。程序中使用该类的的主要功能是获取Connection对象,该类包含如下方法:

public static Connection getConnection(String url, String user, String password) throws SQLException
该方法获得url对应数据库的连接;

Connection:代表数据库连接对象,每个Connection代表一个物理连接会话。要想访问数据库,必须先得到数据库连接。该接口的常用方法如下:
Statement createStatement() throws SQLException; 该方法返回一个Statement对象;
PreparedStatement prepareStatement(String sql)throws SQLException;该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译;
CallableStatement prepareCall(String sql) throws SQLException;
该方法返回CallableStatement对象,该对象用于调用存储过程。
上面上个方法都返回用于执行sql语句的Statement对象,PreparedStatement和CallableStatement是Statement的子类,只有获得了Statement之后才可以执行sql语句;
除此之外,Connection还有如下几个用于控制事务的方法。
Savepoint setSavepoint() throws SQLException;创建一个保存点;
Savepoint setSavepoint(String name) throws SQLException;以指定名字来创建一个保存点;
void setTransactionIsolation(int level) throws SQLException;设置事务的隔离级别;
void rollback() throws SQLException;回滚事务;
void rollback(Savepoint savepoint) throws SQLException;将事务回滚到指定的保存点;
void setAutoCommit(boolean autoCommit) throws SQLException;关闭自动提交,打开事务;
void commit() throws SQLException;提交事务;


Statement:用于执行sql语句的工具接口。该对象既可以执行DDL,DCL语句,也可以用于执行DML语句,还可以用于执行sql查询。当执行sql查询时,返回查询到的结果集。它的常用方法如下:
ResultSet executeQuery(String sql) throws SQLException;该方法用于执行查询语句,并返回查询结果对应ResultSet对象。该方法只能用于执行查询语句。
int executeUpdate(String sql) throws SQLException;该方法用于执行DML语句,并返回受影响的行数;该方法也可用于执行DDL语句,执行DDL语句将返回0;
boolean execute(String sql) throws SQLException;改方法可以执行任何sql语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;

PreparedStatement:预编译的Statement对象,PreparedStatement是Statement的子接口,它允许数据库预编译sql语句(这些sql语句通常带有参数),以后每次只改变sql命令的参数,避免数据库每次都需要编译sql语句,无需再传入sql语句,
只要为预编译的sql语句传入参数值即可。所以它比Statement多了如下方法:
void setXxx(int parameterIndex, Xxx value):该方法根据传入参数值的类型不同,需要使用不同的方法。传入的值根据索引传给sql语句中指定位置的参数。

ResultSet:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。它包含了如下常用方法来移动记录指针。
void close() throws SQLException;释放ResultSet对象;
boolean absolute( int row ) throws SQLException;将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行,如果移动后的记录指针指向一条有效记录,则该方法返回true;
boolean next() throws SQLException;将结果集的记录指针定位到下一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
boolean last() throws SQLException;将结果集的记录指针定位到最后一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;

Connection接口
Connection接口代表与特定的数据库连接,在连接上下文中执行SQL语句并返回结果。

方法 功能描述
createStatement() 创建一个Statement对象
createStatement(int resultSetType, int resultSetConcurrency) 创建一个Statement对象,该对象生成具有给定类型、并发性、和可保存的ResultSet对象
PrearedStatement() 创建预处理对象PreparedStatement
isReadOnly() 查看当前Connection对象的读写模式是否为只读模式
setReadOnly() 设置当前Connection对象的读写模式,默认是非只读模式
commit() 使上一次提交/回滚之后进行的更改成为持久更改,并释放此Connection对象当前所持有的的所有数据库锁
setAutoCommit() 设置对数据库的更改是否为自动提交,默认是自动提交(true)
rollback() 回滚当前事务中的所有改动并释放当前连接持有的数据库的锁
close() 立即释放连接对象的数据库和JDBC资源
DriverManager类
DriverManager类用来管理数据库中的所有驱动程序。它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接。如果通过getConnection()方法可以建立连接,则经连接返回,否则抛出SQLException异常。DriverManager类的常用方法如下:

方法 功能描述
getConnection(String sql, String user, String password) 指定三个入口参数(依次是连接数据库的URL、用户名和密码)来获取与数据库的连接
setLLoginTimeout 获取驱动程序试图登录到某一数据库时可以等待的最长时间,以秒为单位
println(String message) 将一条消息打印到当前的JDBC日志流中
Statment接口
Statement接口用于在已经建立连接的基础上向数据库发送SQL语句。在JDBC中有3中Statement对象,分别是Statement、PreparedStatement和CallableStatement。Statement对象用于执行不带参数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用来执行数据库的存储过程的调用。Statement接口的常用的方法如下:

方法 功能描述
execute(String sql) 执行静态的select语句,该语句可能返回多个结果集
executeQuery(String sql) 执行给定的SQL语句,该语句返回单个ResultSet对象
clearBatch() 清空此Statement的当前SQL命令列表
executeBatch() 将一批命令提交给数据库来执行,如果全部命令执行成功则返回更新计数组成的数组。数组元素的排序与SQL语句的添加顺序对应
addBatch() 将给定的SQL命令添加到此Statement对象的当前命令列表中。如果驱动程序不支持批量处理,将抛出异常
close() 释放Statement实例占用的数据库和JDBC资源
PreparedStatment接口
PreparedStatment接口用来动态地执行SQL语句。通过PreparedStatment实例执行的动态SQL语句,将被预编译并保存到PreparedStatment实例中,从而可以重复地执行该SQL语句。PreparedStatment接口的常用方法如下:

方法 功能描述
SetInt(int index, int k) 将指定位置的参数设置为int值
SetFloat(int index, float f) 将指定位置的参数设置为float值
SetLong(int index, long l) 将指定位置的参数设置为long值
SetDouble(int index, double d) 将指定位置的参数设置为double值
SetBoolean(int index, boolean b) 将指定位置的参数设置为boolean值
SetDate(int index, Date date) 将指定位置的参数设置为date值
executeQuery() 在此PreparedStatment对象中执行SQL查询,并返回该查询生成的ResultSet对象
setString(int index, String s) 将指定位置的参数设置为String值
SetNull(int index, int sqlType) 将指定位置的参数设置为SQL NULL
executeUpdate() 执行前面包含的参数的动态insert、update或delete语句
clearParemeters() 清除当前所有的参数值
ResultSet接口
ResultSet接口类似于一个临时表(实际上也是一个缓存区),用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移,进而获取到数据。

Statement对象执行executeQuery实际上并不是一下子将所有查询到的数据全部放入到ResultSet中(想象一下如果是几十万条是不是要蹦了),而是分批次放入进去ResultSet缓存,一次取完了再放入下一批次,直至取完所有查询到的数据。然而ResultSet里的这个缓存区究竟有多大呢?我们可以通过ResultSet里的getFetchSize()方法来获取(一般大小为10个),同时我们也可以通过setFetchSize()方法来设置这个缓存区的大小。

在JDBC 2.0(JDK 1.2)之后,该接口添加了一组更新方法updateXXX(),该方法有两个重载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对数据进行的操作同步到数据库中,需要执行updateRow()或insertRow()方法更新数据库。ResultSet接口的常用方法如下:

方法 功能描述
getInt() 以int形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是0
getFloat() 以float形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是0
getDate() 以date形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是null
getBoolean() 以boolean形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是null
getString() 以String形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是null
getObject() 以Object形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是null
first() 将指针移到当前记录的第一行
last() 将指针移到当前记录的最后一行
next() 将指针向下移一行
beforeFirst() 将指针移到集合的开头(第一行位置)
afterLast() 将指针移到集合的尾部(最后一行位置)
absolute(int index) 将指针移到ResultSet给定编号的行
isFirst() 判断指针是否位于当前ResultSet集合的第一行。如果是返回true,否则返回false
isLast() 判断指针是否位于当前ResultSet集合的最后一行。如果是返回true,否则返回false
updateInt() 用int值更新指定列
updateFloat() 用float值更新指定列
updateLong() 用long值更新指定列
updateString() 用String值更新指定列
updateObject() 用Object值更新指定列
updateNull() 将指定的列值修改为NULL
updateDate() 用指定的date值更新指定列
updateDouble() 用double值更新指定列
getRow() 查看当前行的索引号
insertRow() 将插入行的内容插入到数据库
updateRow() 将当前行的内容同步到数据库
deleteRow() 删除当前行,但是不同步到数据库中,而是在执行close()方法之后同步到数据库中
---------------------

一、JDBC接口核心的API
在JDK API的java.sql.* 和 javax.sql.*下面查看

1、Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
1)connect(url, properties): 连接数据库的方法。
url: 连接数据库的URL
URL语法: jdbc协议:数据库子协议://主机:端口/数据库
user: 数据库的用户名
password: 数据库用户密码

2、DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
1)registerDriver(driver) : 注册驱动类对象
2)Connection getConnection(url,user,password); 获取连接对象

3、Connection接口: 表示java程序和数据库的连接对象。
1)Statement createStatement() : 创建Statement对象
2)PreparedStatement prepareStatement(String sql) 创建PreparedStatement对象
3)CallableStatement prepareCall(String sql) 创建CallableStatement对象

4、Statement接口: 用于执行静态的sql语句
1)int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML)
2)ResultSet executeQuery(String sql) :执行的静态的查询sql语句(DQL)

5、PreparedStatement接口(Statement接口的子接口):用于执行预编译sql语句
1) int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
2)ResultSet executeQuery() : 执行预编译的查询sql语句(DQL)

6、CallableStatement接口(PreparedStatement接口的子接口):用于执行存储过程的sql语句(call xxx)
1)ResultSet executeQuery() : 调用存储过程的方法

7、ResultSet接口:用于封装查询出来的数据
1)boolean next() : 将光标移动到下一行
2)getXX() : 获取列的值

二、使用Statement执行sql语句
1、执行DDL语句

package sram.jdbc.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

/**
* 使用Statement对象执行静态sql语句
*/
public class Demo2 {
private String url = "jdbc:mysql://localhost:3306/emp_system";
private String user = "root";
private String password = "root";
/**
* 执行DDL语句(创建表)
*/
@Test
public void test1(){
Connection conn = null;
Statement stmt = null;
try {
//1.驱动注册程序
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn = DriverManager.getConnection(url, user, password);
//3.创建Statement
stmt = conn.createStatement();
//4.准备sql
String sql = "CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),BossName VARCHAR(20))";
//5.发送sql语句,执行sql语句,得到返回结果
int count = stmt.executeUpdate(sql);
//6.校验是否发送成功
System.out.println("影响了"+count+"行!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
//7.关闭连接(顺序:后打开的先关闭)
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}

2、执行DML语句:和执行DDL语句一样,仅sql语句不同
1)插入:

String sql = "INSERT INTO dept(NAME,BossName) VALUES('软件开发部','张三')";
2)更新:

String sql = "UPDATE dept SET NAME='销售部' WHERE id='1'";
3)删除:

String sql = "DELETE FROM dept WHERE id=2";
3、封装重复代码,引入变量
1)封装重复代码:

package sram.util.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
* jdbc工具类
*/
public class JdbcUtil {
private static String url = "jdbc:mysql://localhost:3306/emp_system";
private static String user = "root";
private static String password = "root";

/**
* 静态代码块中(只加载一次)
*/
static{
//注册驱动程序
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驱动程序注册出错");
}
}

/**
* 抽取获取连接对象的方法
*/
public static Connection getConnection(){
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

/**
* 释放资源的方法
*/
public static void close(Connection conn,Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}

2)使用封装好的类,并引入变量

package sram.jdbc.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

import sram.util.jdbc.JdbcUtil;

/**
* 使用Statement对象执行静态sql语句
*/
public class Demo2 {
/**
* 执行DTL/DML语句
*/
private int id = 4;
@Test
public void test(){
Connection conn = null;
Statement stmt = null;
try {
//1.驱动注册程序
//2.获取连接对象
//使用封装类
conn = JdbcUtil.getConnection();

//3.创建Statement
stmt = conn.createStatement();
//4.准备sql
//String sql = "CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),BossName VARCHAR(20))";
//String sql = "INSERT INTO dept(NAME,BossName) VALUES('软件开发部','张三')";
//String sql = "UPDATE dept SET NAME='销售部' WHERE id=1";

//使用变量形式
String sql = "DELETE FROM dept WHERE id="+id;
//5.发送sql语句,执行sql语句,得到返回结果
int count = stmt.executeUpdate(sql);
//6.校验是否发送成功
System.out.println("影响了"+count+"行!");
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
//7.关闭连接(顺序:后打开的先关闭)
//使用封装类
JdbcUtil.close(conn, stmt);
}
}
}

4、执行DQL语句


package sram.jdbc.connection;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

import sram.util.jdbc.JdbcUtil;

/**
* 使用Statement执行DQL语句(查询操作)
*/
public class Demo3 {
@Test
public void test(){
Connection conn = null;
Statement stmt = null;
try {
//获取连接
conn = JdbcUtil.getConnection();
//创建Statement
stmt = conn.createStatement();
//准备sql
String sql = "SELECT * FROM dept";
//执行sql
ResultSet rs = stmt.executeQuery(sql);
/*
//移动光标
boolean flag = rs.next();
if(flag){
//取出列值
//通过索引
/*
int id = rs.getInt(1);
String name = rs.getString(2);
String bossName = rs.getString(3);
System.out.println(id+","+name+","+bossName);


//列名称,不区分大小写
int id = rs.getInt("id");
String name = rs.getString("name");
String bossName = rs.getString("bossname");
System.out.println(id+","+name+","+bossName);
}*/
//遍历结果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String bossName = rs.getString("bossname");
System.out.println(id+","+name+","+bossName);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, stmt);
}
}
}


参考:   https://www.cnblogs.com/xiaodf/p/5027200.html

 https://blog.csdn.net/mChenys/article/details/80498964

posted @ 2019-04-25 22:03  konglingbin  阅读(2497)  评论(0编辑  收藏  举报