JDBC 就是用 JAVA 语言操作关系型数据库的一套 API

全称:(Java DataBase Connectivity) Java 数据库连接

快速入门

写 JDBC 前需导入驱动 jar 包(以 mysql 数据库为例)

//注册驱动(mysql5 之后的版本此步可省略)
Class.forName("com.mysq.jdbc.Driver");
//获取连接,Java代码需要发送SQL给MySQL服务端,就需要先建立连接
Connection conn = DriverManager.getConnection(url, username, password);
//定义SQL语句
String sql =  “update…” ;
//获取执行SQL对象,执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象
Statement stmt = conn.createStatement();
//执行SQL
stmt.executeUpdate(sql);  
//处理结果
...;
//释放资源
stmt.close();
conn.close();

API 详解

1.DriverManager

  • 注册驱动

    DriverManager.registerDrever();
    

    Class.forName() 底层便是通过调用该方法来实现驱动的注册

  • 获取数据库连接

    static Connection getConnection(String url, String user, String password) 尝试建立与给定数据库URL的连接

    参数说明:

    • url : 连接路径

      语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…

      示例:jdbc:mysql://127.0.0.1:3306/db1

      细节:

      • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对

      • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

    • user :用户名

    • poassword :密码

2.Connection

作用:获取执行 SQL 的对象,管理事务

  • 获取执行对象

    • 普通执行SQL对象

      Statement createStatement()
      

      快速入门中就是通过该方法获取的执行对象

    • 预编译SQL的执行SQL对象:防止SQL注入

      PreparedStatement  prepareStatement(sql)
      

      通过这种方式获取的 PreparedStatement SQL语句执行对象可以防止SQL注入

    • 执行存储过程的对象

      CallableStatement prepareCall(sql)
      

      通过这种方式获取的 CallableStatement 执行对象是用来执行存储过程的

  • 事务管理

    • 开启事务

      void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态

      参与autoCommit 表示是否自动提交事务,true表示自动提交事务,false表示手动提交事务。而开启事务需要将该参数设为为false。

    • 提交事务

      void commit() 提交事务,并释放此 Connection对象当前持有的所有数据库锁
    • 回滚事务

      void rollback() 回滚事务,并释放此 Connection对象当前持有的所有数据库锁
    • 例:

      try {
          // ============开启事务==========
          conn.setAutoCommit(false);
          //5. 执行sql
          int count1 = stmt.executeUpdate(sql1);//受影响的行数
          //6. 处理结果
          System.out.println(count1);
          int i = 3/0;
          //5. 执行sql
          int count2 = stmt.executeUpdate(sql2);//受影响的行数
          //6. 处理结果
          System.out.println(count2);
          // ============提交事务==========
          //程序运行到此处,说明没有出现任何问题,则需求提交事务
          conn.commit();
      } catch (Exception e) {
          // ============回滚事务==========
          //程序在出现异常时会执行到这个地方,此时就需要回滚事务
          conn.rollback();
          e.printStackTrace();
      }
      

3.Statement

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样

  • 执行DDL、DML语句

    int executeUpdate(String sql) 执行给定的SQL语句
  • 执行DQL语句

    ResultSet executeQuery(String sql) 执行给定的SQL语句,返回单个ResultSet对象

4.ResultSet

作用:封装了SQL查询语句的结果

注意:使用后需释放资源

而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:

ResultSet  executeQuery(sql);

要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法

boolean  next()
  • 将光标从当前位置向前移动一行
  • 判断当前行是否为有效行
xxx  getXxx(参数)

xxx : 数据类型;如: int getInt(列的编号) ;String getString(列的名称)

5.PreparedStatement

作用:通过将敏感字符进行转义预防SQL注入问题

  • 获取 PreparedStatement 对象

    // SQL语句中的参数值,使用?占位符替代
    String sql = "select * from user where username = ? and password = ?";
    // 通过Connection对象获取,并传入对应的sql语句
    PreparedStatement pstmt = conn.prepareStatement(sql);
    
  • 为设置为 ? 参数赋值

    PreparedStatement对象:setXxx(?的位置编号<从1 开始>,?的值);

  • 执行SQL语句

    executeUpdate(); 执行DDL语句和DML语句
    executeQuery(); 执行DQL语句

    注意:调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。

数据库连接池

负责分配、管理数据库连接(Connection),它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

  • 标准接口:DataSource

    官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:

    Connection getConnection()
    

    那么以后就不需要通过 DriverManager 对象获取 Connection 对象,而是通过连接池(DataSource)获取 Connection 对象。

    常用的数据库连接池:Druid(德鲁伊)

    • Druid连接池是阿里巴巴开源的数据库连接池项目

    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

  • Driud使用

    public static void main(String[] args) throws Exception {
        //1.导入jar包
        //2.定义配置文件
        //3. 加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("配置文件路径"));
        //4. 获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    
        //5. 获取数据库连接 Connection
        Connection connection = dataSource.getConnection();
        //获取到了连接后就可以继续做其他操作了
    }