JDBC快速入门,JDBC各个接口和类详解,JDBC管理事务

一、JDBC

1.概念:

  • 1.Java DataBase Connectivity。 java数据库连接,java语言操作数据库。
  • 2.JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2.快速入门

1.步骤:
  • 1.导入驱动jar包
    • 1.复制jar包到项目的libs目录下(目录随便起)
    • 2.右键---->add as Library
  • 2.注册驱动
  • 3.获取数据库的连接对象----Connection
  • 4.定义sql
  • 5.获取执行sql语句的对象----Statement
  • 6.执行sql,接收返回结果
  • 7.处理结果
  • 8.释放资源
2.代码实现:
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://主机ip:MySQL开放端口/数据库名称", "用户名", "密码");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement statement = conn.createStatement();
//6.执行sql
# executeUpdate 执行insert,delete,update语句,返回值为int类型。它返回的是sql语句执行完成后影响的记录条数
int count = statement.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
statement.close();
conn.close();

3.详解各个对象

  • 1.DriverManager: 驱动管理对象
    • 1.功能:
      • 1.注册驱动:告诉程序该使用哪一个数据库驱动jar包
        • static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager.

        • 写代码使用: Class.forName(“com.mysql.jdbc.Driver”);

        • 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块:

          static{
          	try{
          		java.sql.DriverManager.registerDriver(new Driver());
          	}
          	catch(SQLException E){
          		throw new RuntimeException("Can't register driver!")
          	}
          }
          
        • 注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤。

      • 2.获取数据库连接
        • 1.方法:static Connection getConnection(String url, String user, String password)
        • 2.参数:
          • url:指定的连接路径
            • 语法:jdbc:mysql://主机ip:MySQL开放端口/数据库名称
          • user:用户名
          • password:密码
  • 2.Connection: 数据库连接对象
    • 1.功能:
      • 1.获取执行sql的对象
        • 1.Statement createStatement()
        • 2.PreparedStatement prepareStatement(String sql)
      • 2.管理事务
        • 1.开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
        • 2.提交事务:commit()
        • 3.回滚事务rollback()
  • 3.Statement: 执行sql的对象
    • 1.执行sql
      • 1.boolean execute(String sql):可以执行任意的sql 了解即可
      • 2.int executeUpdate(String sql): 执行DML(insert update delete)语句,也可以执行DDL语句。
        • int返回值:返回的是sql语句执行完成后影响的记录条数
        • 可以通过这个影响的行数判断DML语句是否执行成功。返回值大于0则执行成功。
      • 3.ResultSet executeQuery(String sql):执行DQL(select)语句
  • 4.ResultSet: 结果集对象,封装查询结果
    • 1.boolean next()方法:游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
    • 2.getXxx(参数):获取数据
      • Xxx:代表数据类型。 如:int getInt()
      • 参数:
        • 1.int:代表列的编号,从1开始,不是索引。
        • 2.String:代表列名称。
    • 3.注意:
      • 使用步骤:
        • 1.游标向下移动一行
        • 2.判断是否有数据
        • 3.获取数据
  • 5.PreparedStatement: 执行sql的对象
    • 1.sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
      • 1.输入用户随便,输入密码:a’ or ‘a’ = 'a
    • 2.解决sql注入问题:使用PreparedStatement对象来解决
    • 3.预编译的sql:参数使用?作为占位符
    • 4.步骤:
      • 1.导入驱动jar包
        • 1.复制jar包到项目的libs目录下(目录随便起)
        • 2.右键---->add as Library
      • 2.注册驱动
      • 3.获取数据库的连接对象----Connection
      • 4.定义sql
        • 注意:sql的参数使用?作为占位符
      • 5.获取执行sql语句的对象----PreparedStatement Connection.preparedStatement(String sql)
      • 6.给?赋值:
        • 方法:setXxx(参数1,参数2)
          • 参数1:?的位置编号,从1开始
          • 参数2:?的值
      • 7.执行sql,接收返回结果,不需要传递sql语句
      • 8.处理结果
      • 9.释放资源
    • 5.注意:后期都会使用PreparedStatement 来完成增删改查的的所有操作
      • 1.可以防止sql注入
      • 2.效率更高

4.抽取JDBC工具类: JDBCUtils

  • 1.目的:简化书写
  • 2.分析:
    • 1.注册驱动的抽取
    • 2.抽取一个方法获取连接对象
      • 需求:不想传递参数(麻烦),还得保证工具类的通用性
      • 解决:使用配置文件 jdbc.properties
    • 3.抽取一个方法释放资源

5.JDBC控制事务

  • 1.事务:一个包含多个步骤的业务操作。如果这个业操作被事务管理,则这个步骤要么同时成功,要么同时失败。
  • 2.操作:
    • 1.开启事务
    • 2.提交事务
    • 3.回滚事务
  • 3.适应Connection对象来管理事务
    • 1.开启事务:setAutoCommit(boolean autoCommit):调动该方法设置参数为false,即开启事务
      • 在执行sql之前开启事务
    • 2.提交事务:commit()
      • 当所有的sql都执行完提交事务
    • 3.回滚事务 :rollback()
      • 在catch中回滚事务
  • 4.代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
    事务操作
 */
public class jdbcDemo09 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement1 = null;
        PreparedStatement preparedStatement2 = null;
        try {
            //1.获取连接
            connection = JDBCUtils.getConnection();

            //开启事务
            connection.setAutoCommit(false);

            //2.定义sql
            //2.1。张三 - 500
            String sql1 = "update account set balance = balance - ? where id = ?";
            //2.2 李四 + 500
            String sql2 = "update account set balance = balance + ? where id = ?";
            //3.获取执行sql对象
            preparedStatement1 = connection.prepareStatement(sql1);
            preparedStatement2 = connection.prepareStatement(sql2);
            //4.设置参数
            preparedStatement1.setDouble(1,500);
            preparedStatement1.setInt(2,1);

            preparedStatement2.setDouble(1,500);
            preparedStatement2.setInt(2,2);

            //5.执行sql
            preparedStatement1.executeUpdate();
            preparedStatement2.executeUpdate();

            //提交事务
            connection.commit();
        } catch (Exception e) {
            //事务回滚
            try {
                if (connection != null){
                    connection.rollback();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtils.close(preparedStatement1,connection);
            JDBCUtils.close(preparedStatement2,null);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值