1.什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
2.如何使用JDBC
使用 JDBC 连接数据库的步骤如下:
- 加载 JDBC 驱动程序。
- 创建一个数据库连接对象。
- 创建一个 SQL 语句对象。
- 执行 SQL 语句。
- 处理结果集。
- 关闭数据库连接对象。
以下是一个使用 JDBC 连接数据库的简单示例:
import java.sql.*;
public class JDBCExample {
public static void main(String[] args) throws SQLException {
// 加载 JDBC 驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建一个数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
// 创建一个 SQL 语句对象
Statement statement = connection.createStatement();
// 执行 SQL 语句
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
// 处理结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
// 关闭数据库连接对象
connection.close();
}
}
3.JDBC的核心类
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet
1.DriverManager是JDBC的驱动管理器,它负责加载和管理JDBC驱动程序。当程序需要连接到数据库时,它会通过DriverManager来获取一个Connection对象。
-
Class.forName(“com.mysql.jdbc.Driver”);//加载驱动类
-
String url = “jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false”;
-
String username = “root”;
-
String password = “root”;
-
Connection con = DriverManager.getConnection(url, username, password);
注意,上面代码可能出现的两种异常:
- ClassNotFoundException:这个异常是在第1句上出现的,出现这个异常有两个可能:
- 你没有给出oracle的jar包;
- 你把类名称打错了,查看类名是不是com.mysql.jdbc.Driver
- SQLException:这个异常出现在第5句,出现这个异常就是三个参数的问题,往往username和password一般不是出错,所以需要认真查看url是否打错。
2.Connection是JDBC的连接对象,它表示与数据库的物理连接。Connection对象可以用来执行SQL语句、获取结果集、管理事务等。
3.Statement是JDBC的语句对象,它用于执行SQL语句。Statement对象可以是静态的,也可以是动态的。静态Statement对象只能执行预编译的SQL语句,而动态Statement对象可以执行任意SQL语句。
4.ResultSet是JDBC的结果集对象,它表示SQL语句执行后返回的数据集。ResultSet对象可以用来遍历结果集中的记录,并获取记录中的各个字段的值。
ResultSet表示结果集,它是一个二维的表格!ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标:
- void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置, 默认的结果集是无效的;
- void afterLast():把光标放到最后一行的后面, 默认的结果集是无效的;
- boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功, 默认的结果集是无效的;
- boolean last():把光标放到最后一行的位置上, 默认的结果集是无效的;
- boolean isBeforeFirst():当前光标位置是否在第一行前面;
- boolean isAfterLast():当前光标位置是否在最后一行的后面;
- boolean isFirst():当前光标位置是否在第一行上;
- boolean isLast():当前光标位置是否在最后一行上;
- boolean previous():把光标向上挪一行;默认的结果集是无效的
- boolean next():把光标向下挪一行;
- boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行, 默认的结果集是无效的;
- boolean absolute(int row):绝对位移,把光标移动到指定的行上, 默认的结果集是无效的;
- int getRow():返回当前光标所有行。
- 获取结果集元数据!
- 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;
- 获取结果集列数:int getColumnCount()
- 获取指定列的列名:String getColumnName(int colIndex)
这些类是JDBC编程的基础,在使用JDBC时需要对它们有一定的了解。
4 JDBC中的事务问题
Connection的三个方法与事务相关:
- setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值就是true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置false,那么就相当于开启了事务了;con.setAutoCommit(false)表示开启事务!!!
- commit():提交结束事务;con.commit();表示提交事务
- rollback():回滚结束事务。con.rollback();表示回滚事务
jdbc处理事务的代码格式:
try {
con.setAutoCommit(false);//开启事务…
….
…
con.commit();//try的最后提交事务
} catch() {
con.rollback();//回滚事务
}
eg:
public void transfer(boolean b) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = JdbcUtils.getConnection();
//手动提交
con.setAutoCommit(false);
String sql = "update account set balance=balance+? where id=?";
pstmt = con.prepareStatement(sql);
//操作
pstmt.setDouble(1, -10000);
pstmt.setInt(2, 1);
pstmt.executeUpdate();
// 在两个操作中抛出异常
if(b) {
throw new Exception();
}
pstmt.setDouble(1, 10000);
pstmt.setInt(2, 2);
pstmt.executeUpdate();
//提交事务
con.commit();
} catch(Exception e) {
//回滚事务
if(con != null) {
try {
con.rollback();
} catch(SQLException ex) {}
}
throw new RuntimeException(e);
} finally {
//关闭
JdbcUtils.close(con, pstmt);
}
}