JDBC的小结

1.什么是JDBC

JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

2.如何使用JDBC

使用 JDBC 连接数据库的步骤如下:

  1. 加载 JDBC 驱动程序。
  2. 创建一个数据库连接对象。
  3. 创建一个 SQL 语句对象。
  4. 执行 SQL 语句。
  5. 处理结果集。
  6. 关闭数据库连接对象。

以下是一个使用 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对象。

  1. Class.forName(“com.mysql.jdbc.Driver”);//加载驱动类

  2. String url = “jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false”;

  3. String username = “root”;

  4. String password = “root”;

  5. Connection con = DriverManager.getConnection(url, username, password);

注意,上面代码可能出现的两种异常:

  1. ClassNotFoundException:这个异常是在第1句上出现的,出现这个异常有两个可能:
  • 你没有给出oracle的jar包;
  • 你把类名称打错了,查看类名是不是com.mysql.jdbc.Driver
  1. 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);
		}
	}
  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值