上一节说到Java的驱动是由各个数据库实现并提供,通常我们连接一个数据,需要有一个入口,这个入口就是java.sql.Driver实现,这也是狭义上的驱动。

首先我们写个最简单的JDBC调用程序访问数据库

JDBC访问数据库DEMO

public static void main(String[] args) throws Exception {
      // 1、加载驱动类
      Class.forName("com.mysql.jdbc.Driver");
 
      // 定义url、用户名和密码
      String url = "jdbc:mysql://localhost:3306/test?socketTimeout=30000";
      String user = "root";
      String password = "123456";
 
      // 2、创建连接
      Connection connection = DriverManager.getConnection(url, user, password);
 
      // 3、创建执行声明
      PreparedStatement statement = connection.prepareStatement("select * from test");
 
      // 简单执行,不返回结果
      statement.execute("select 1");
 
      // 4、返回结果
      ResultSet resultSet = statement.executeQuery();
 
      // 5、遍历结果
      while (resultSet.next()) {
          // 获取当前行的第一列数据
          Object dataAtColumn1 = resultSet.getString(1);
 
          // 也可以直接用列名获取当前行的名叫testName的列的数据
          Object dataAtColumnName = resultSet.getString("<testName>");
      }
       
       
      resultSet.close();
      statement.close();
      connection.close();
  }

1、注册驱动类(驱动器)

也就是Driver的数据库实现,比如mysql的Driver实现叫com.mysql.jdbc.Driver,Oracle的叫oracle.jdbc.driver.OracleDriver;通过Class.forName加载驱动到JVM的安全上下文中(实际上是驱动主动调用DriverManager.registerDriver),这样驱动管理器就可以根据url里的协议匹配要用的驱动了;

比如url是jdbc:mysql://localhost,就会遍历所以加载到的驱动,去匹配这个url,如果匹配到就使用这个驱动。

2、创建连接

注册驱动类后,驱动管理器会自动根据url来匹配驱动类,创建连接,获得连接后,表示建立和数据库的通信,可以向数据库发送命令了;

3、创建查询实体

连接建立后如果直接发送命令,会有很多功能实现上的不便,需要从连接创建一个statement,可以理解为一次查询的抽象,这里简单的认为是SQL语句的对象化,至于为什么要这样可以参考我之前写的一篇文章为什么要有Statement?

一个比较常见的Statement实现是PreparedStatement,比如一个SQL(select * from people where job = @job and age > @age;)有两个参数job和age,需要设置,此时就需要PreparedStatement。

例如,我们利用teacher和20两个参数去查询:

带参数SQL的执行

String sql = "select * from people where job = ? and age > ?";
Connection connection;
 
// 创建PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
 
// 根据参数位置设置参数
preparedStatement.setString(1, "teacher");
preparedStatement.setInt(2, 20);
 
// 此时SQL是什么样子的?
 
// 执行
ResultSet resultSet = preparedStatement.executeQuery();

通常带参数的SQL可以通过PreparedStatement这种方式防注入。

4、执行查询返回结果

执行statement查询得到结果集ResultSet,这里只说最常见的使用,还有批量执行、无结果执行、更新等操作;

5、遍历结果

ResultSet就是你认为的那个东西了,结果集,结果集并不是一次性从数据库拿回所有结果,而是相当于描述结果信息和结果存放区域的对象。

这里的信息可以分为两类:

  • 元数据,ResultMetaData,它包括查询结果列数、列名、列的数据类型

  • 数据行,数据行通过提供一个迭代器(也可以形象的称为游标)去遍历,游标移动到哪一行就可以获取哪一行的数据。

偷得浮生半日闲,心情半佛半神仙。