JDBC 接口学习

说明:文章所有内容皆选自实验楼教程【JDBC 入门教程】,想要学习更多JDBC,可以点击教程进行学习~

JDBC 简介

JDBC 的全称是 Java Database Connectivity,叫做 Java 数据库连接。它是一种用于执行 SQL 语句的Java API,它由一组用 Java 编程语言编写的类和接口组成。严格来讲它是 J2EE 的一部分。

我们要写数据库的程序,是通过 C 语言或者 C++ 语言直接访问数据库的接口,如下图所示。

以前的数据库连接

对于不同的数据库,我们需要知道不同数据库对外提供的系统 API,这就影响了我们程序的扩展和跨平台的实现。

那么有没有一种方法来实现跨数据库平台呢?那么这里木木就要向大家介绍分层的思想。分层的好处便是上一层只用和下一层进行通讯。我们将不同数据库的接口统一成一个接口是不是就可以跨数据库平台了呢?

现在的数据库连接

ODBC 是 Open Database Connect 即开放数据库互连的简称,它是微软于1991年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件。我们的应用程序在调用数据的时候,就无需去管具体的数据库,直接由应用程序访问 ODBC 就可以了。

而在 Java 上面只有一种数据库连接统一接口——JDBC。JDBC 为数据库开发人员提供了一个标准的 API,据此可以构建更高级的工具和接口使数据库开发人员能够用纯 Java API 编写数据库应用程序。

对于我们自己写的程序这一端,接口是统一的,而对于不同数据库产品的连接是通过不同的 JDBC 类库实现的。

JDBC

JDBC 接口

主要学习 Statement、PreparedStatement、CallableStatement 等JDBC 接口的相关知识。

1 JDBC 接口概述

JDBC 核心 API

当我们连接上了数据库后,就会通过 sql 语句对数据库进行操作。随着Java语言应用面的逐步拓宽,Sun 公司开发了一个标准的 SQL 数据库访问界面———JDBC API。它可以使 Java 编程人员通过一个一致的界面,访问多种关系数据库。而今天我们就来学习一下,如何利用 JDBC 的一些核心 API 与数据库进行交互。

在 JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送 SQL 或 PL/SQL 命令和从数据库接收数据。它们还定义了许多方法,帮助 Java 和数据库之间转换数据的差异。

接口 应用场景
Statement 当在运行时使用静态 SQL 语句时(Statement接口不能接受的参数)
CallableStatement 当要访问数据库中的存储过程时(CallableStatement对象的接口还可以接受运行时输入参数)
PreparedStatement 当计划多次使用 SQL 语句时(PreparedStatement 接口接收在运行时输入参数)

2 Statement

我们要使用 Statement 接口,第一步肯定是创建一个 Statement 对象了。我们需要使用 Connection 对象的 createStatement() 方法进行创建。


Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

一旦创建了一个Statement对象,我们就可以用它来执行SQL语句了,首先我们先来看看 Statement 里面有哪些方法吧!

方法 说明
boolean execute(String SQL) 如果 ResultSet 对象可以被检索返回布尔值 true,否则返回 false。使用这个方法来执行 SQL DDL 语句,或当需要使用真正的动态 SQL
int executeUpdate(String SQL) 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句。返回值是一个整数,指示受影响的行数(即更新计数)
ResultSet executeQuery(String SQL) 返回 ResultSet 对象。用于产生单个结果集的语句,例如 SELECT 语句

正如关闭一个 Connection 对象来保存数据库资源,出于同样的原因,也应该关闭 Statement 对象。

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

注:如果关闭了 Connection 对象首先它会关闭 Statement 对象,然而应该始终明确关闭 Statement 对象,以确保正确的清除。

3 PreparedStatement

PreparedStatement 接口扩展了 Statement 接口,有利于高效地执行多次使用的 SQL 语句。我们先来创建一个 PreparedStatement 对象。
Statement 为一条 SQL 语句生成执行计划。如果要执行两条 SQL 语句,会生成两个执行计划。一万个查询就生成一万个执行计划!
  

select colume from table where colume=1;
select colume from table where colume=2;

PreparedStatement 用于使用绑定变量重用执行计划。

select colume from table where colume=:x;

通过 set 不同数据,只需要生成一次执行计划,并且可以重用。


PreparedStatement pstmt = null;
try {

/*
在JDBC中所有的参数都被代表?符号,这是已知的参数标记。在执行SQL语句之前,必须提供值的每一个参数。
*/
   String SQL = "Update Students SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
/*

setXXX()方法将值绑定到参数,其中XXX表示希望绑定到输入参数值的 Java 数据类型。如果忘了提供值,将收到一个 SQLException。
*/
catch (SQLException e) {
   . . .
}
finally {
//同理,我们需要关闭 PreparedStatement 对象
   pstmt.close();
}

说了这么多,我们还是来看代码吧。即上一次我们创建的数据库 EXAMPLE:

package com.shiyanlou;
import java.sql.*;

public class JdbcTest {
   // JDBC 驱动器的名称和数据库地址
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EXAMPLE";


   static final String USER = "root";
   static final String PASS = "";
   
   public static void main(String[] args) {
	   Connection conn = null;
	   PreparedStatement stmt = null;
	   try{
		   //注册 JDBC 驱动器
		   Class.forName("com.mysql.jdbc.Driver");

		   //打开连接
		   System.out.println("Connecting to database...");
		   conn = DriverManager.getConnection(DB_URL,USER,PASS);

		   //执行查询
		   System.out.println("Creating statement...");
		   //这里我们要更改一个同学的年龄,参数待定
		   String sql = "UPDATE Students set age=? WHERE id=?";
		   stmt = conn.prepareStatement(sql);
      
		   //将值绑定到参数,参数从左至右序号为1,2...
		   stmt.setInt(1, 22);  // 绑定 age 的值(序号为1)
		   stmt.setInt(2, 1); // 绑定 ID 的值
      
		   // 更新 ID 为1的同学的年龄
		   int rows = stmt.executeUpdate();
		   System.out.println("被影响的行数 : " + rows );

		   // 查询所有记录,并显示.
		   sql = "SELECT id, name, age FROM Students";
		   ResultSet rs = stmt.executeQuery(sql);

		   //处理结果集
		   while(rs.next()){
			   //检索
			   int id  = rs.getInt("id");
			   int age = rs.getInt("age");
			   String name = rs.getString("name");
  

			   //显示
			   System.out.print("ID: " + id);
			   System.out.print(", Age: " + age);
			   System.out.print(", Name: " + name);
			   System.out.println();
		   }
		   //清理
		   rs.close();
		   stmt.close();
		   conn.close();
	   }catch(SQLException se){
		   se.printStackTrace();
	   }catch(Exception e){
		   e.printStackTrace();
	   }finally{
		   try{
			   if(stmt!=null)
				   stmt.close();
		   }catch(SQLException se2){
		   }
	try{
         if(conn!=null)
        	 	conn.close();
      }catch(SQLException se){
    	  	se.printStackTrace();
      	}
	   }
   		System.out.println("Goodbye!");
   }
}

运行结果:

此处输入图片的描述

4 CallableStatement

CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用存储过程的方法。存储过程储存在数据库中。对储存过程的调用是 CallableStatement 对象所含的内容。三种类型的参数有:IN,OUT和INOUT。PreparedStatement对象只使用IN参数。 CallableStatement对象可以使用所有三个

参数 描述
IN 它的值是在创建 SQL 语句时未知的参数,将 IN 参数传给 CallableStatement 对象是通过 setXXX() 方法完成的
OUT 其值由它返回的 SQL 语句提供的参数。从 OUT 参数的 getXXX() 方法检索值
INOUT 同时提供输入和输出值的参数,绑定的 setXXX() 方法的变量,并使用 getXXX() 方法检索值

在 JDBC 中调用存储过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。

{call 存储过程名[(?, ?, ...)]} 

返回结果参数的过程的语法为:

{? = call 存储过程名[(?, ?, ...)]} 

不带参数的存储过程的语法类似:

{call 存储过程名} 

CallableStatement 对象是用 Connection 方法 prepareCall 创建的。

CallableStatement cstmt = null;
try {
   String SQL = "{call getEXAMPLEName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

好了,CallableStatement 接口就不再详细地讲解了,同学们可以自己查阅相关的资料,对 CallableStatement 进行深入学习。

最后

以上内容全部截选自实验楼教程【JDBC 入门教程】第三节内容,该教程总共6节内容,分别如下:

  • 认识 JDBC
  • JDBC 基础
  • JDBC 接口
  • JDBC 结果集
  • JDBC 数据类型与事务
  • JDBC 处理

如果你想要深入学习JDBC,点击教程即可学习。

posted @ 2017-09-26 14:04  蓝桥云课  阅读(476)  评论(0编辑  收藏  举报