第10章 JDBC
本章目录
10.1 关系型数据库的驱动与连接
10.2 用SQL指令操作数据库
10.1 关系型数据库的驱动与连接
一、JDBC技术概述
JDBC(Java DateBase Connectivity)是一种可用于执行SQL语句指令的Java API,它由一些Java语言写的类和接口组成,主要存放在java.sql包中。常用的包括DriverManager类
,Connection接口,Statement接口,ResultSetMetaDada接口,ResultSet接口等,在J2EE中又对JDBC的有关功能进行了增强和扩展,新的内容放在了javax.sql包中。
Java语言程序使用JDBC与数据库进行通讯,其主要的功能是实现与各种数据库的连接,实现了API与特定驱动器的分离。
JDBC提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。在Java语言的程序中不必考虑数据库的类型而采用统一的程序代码完成数据
库的管理,可以很方便地将SQL语句指令传送给几乎任何一种数据库。通过使用JDBC,大大地扩展了Java语言处理数据库的能力。现在随着Java语言为越来越多的大公司所支持,大
多数流行的商业化的数据库管理系统都已经包含有JDBC驱动器,而且由于Java语言的开放式策略,市场上还有第三方的产品可供选择,使用JDBC也越来越方便。
JDBC可以完成以下三个任务:
⒈同一个数据库建立连接;
⒉向数据库发送SQL语句;
⒊处理数据库返回的结果。
JDBC是一种底层的API,它使用语句级的方式直接调用SQL命令。
可以利用JDBC与ODBC之间的桥接器方便地实现对Microsoft ODBC的访问,具有平台无关性、安全性、完整性、鲁棒性等特点。
二、JDBC的驱动管理器
JDBC中的驱动管理器就是DriverManager类,是JDBC的管理层,它在数据库和用户驱动器之间工作,在数据库和合适的驱动器之间建立连接。真正进行数据库连接的是Driver类中的
connect()方法。编程人员除了可以调用DriverManager类的getConnection()方法之外,还可以调用该类的getDriver(),getDrivers(),registerDriver()等方法进一步完成程序
的功能。DriverManager类维护着一系列驱动器程序Driver类,这些类是通过实现Java类库中的Driver接口而得到的,这些类通过调用DriverManager类的getConnection()方法来注
册自己,然后在DriverManager类被调用时载入,而且在数据库驱动器载入时被自动调动。调用DriverManager类的getConnection()方法是在数据库和驱动器之间建立连接的标准方
法,具体格式为
String url = "jdbc:odbc:wombat";
Connection con = DriverManager.getConnection( url, "oboy", "12Java" );
三、JDBC驱动程序的类型
JDBC驱动程序规范把JDBC驱动程序分为4种类型,分别应用于某种针对DBMS(DataBase Management System)的特定需求。
JDBC-ODBC驱动程序。
Java/本地代码驱动程序。
Java协议。
被称为“第四类数据库协议”的纯Java实现的JDBC驱动程序。
10.2 用SQL指令操作数据库
利用JDBC查询数据库的处理过程分下面5个步骤:载入JDBC驱动程序,连接到DBMS,创建并执行语句,处理DBMS返回的数据,终止与DBMS的连接。
一、载入JDBC驱动程序
通过调用
Class.forName( " com.mysql.jdbc.Driver" );
方法,实现载入JDBC驱动程序。
二、连接到DBMS
getConnection()方法有三个重载体:
getConnection( String url )
getConnection( String url, Properties info )
getConnection( String url, String user, String password )
作用是请求DBMS访问数据库,如果访问请求被允许将返回一个Connection对象,否则该方法将抛出一个SQLException异常。
执行连接的具体形式为:
String url = "jdbc:mysql://localhost:3306/graduation_design";
Connection connect = DriverManager.getConnection( url );
连接池技术:
通常一个需要与数据库交互的用户必须打开一个连接,在处理过程中如果一直保持连接的话有可能会占用数据库的连接从而影响其他用户,如果在每次访问数据库之后都关闭连接
而在需要时又打开连接又会消耗系统时间并且降低性能。JDBC 2.1版引入了连接池技术。连接池就是一个数据库连接的集合,在使用的时候只需打开一次并载入内存即可被重复使
用,既不必每次使用都重新连接DBMS也不消耗系统时间。
三、创建并执行语句
在成功地连接了数据库之后,就可以操作和查询数据库了。这个过程是通过Statement对象发送SQL语句返回查询结果实现的。
JDBC的查询发送机制提供了三种对象来实现查询语句的发送执行,它们是Statement对象、PreparedStatement对象和CallableStatement对象。
它们都可以作为执行SQL语句的容器对象,分别用于发送不同类型的SQL语句:
Statement对象用于执行简单的SQL语句,也就是没有参数的SQL语句;
PreparedStatement对象用于执行需要重复执行的预编译过的SQL语句;
CallableStatement对象用于执行一个数据库的存储过程。
⒈创建Statement对象可以通过Connection类方法createStatement()来实现:
Statement stmt = connect.createStatement();
Statement提供了三种不同的方法可以执行SQL语句:
executeQuery( String sql );//执行给定的SQL查询语句,返回ResultSet对象。
executeUpdate( String sql );//执行给定的SQL更新语句,返回INSERT、UPDATE或DELETE语句的行计数,或者返回0表示不返回任何内容。
execute( String sql ); //执行给定的SQL查询语句,该语句可能返回多个结果。
查询完成之后要将Statement对象关闭,形式为:
stmt.close();
⒉创建PreparedStatement对象可以通过Connection类方法PreparedStatement来实现:
String query = "SELECT * FROM namelist WHERE x=?";
PreparedStatement pstmt = connect.PreparedStatement( query );
使用PreparedStatement对象是为了处理预编译的SQL语句的对象。
使用PreparedStatement对象查询的方式与使用Statement对象查询的方式相似。
⒊创建CallableStatement对象可以通过Connection类方法prepareCall来实现:
String query = "{call getTestData(?,?)}";
CallableStatement cstmt = connect.prepareCall( query );
使用CallableStatement对象用来从J2EE对象中调用一个存储过程。
四、处理DBMS返回的数据
JDBC接收查询结果是通过ResultSet对象来实现的,称为结果集。一个ResultSet对象包含了执行某个SQL查询语句后满足条件的所有的行,ResultSet接口中提供了对这些行的访问
方法,用户可以通过一组get方法来访问。可滚动结果集和可更新结果集。在处理查询结果集的时候,经常要用到元数据。所谓元数据是描述数据的数据信息,包括描述数据库的元
数据和描述结果集的元数据。描述数据库的元数据通过接口DatabaseMetaData定义,可以经由调用Connection接口的getMetaData()方法获取DatabaseMetaData对象,并利用接口
DatabaseMetaData中的方法得到数据库中的数据的主要信息。描述结果集的元数据通过接口ResultSetMetaData定义,可以经由调用ResultSet接口的getMetaData()方法获取
ResultSetMetaData对象,利用接口ResultSetMetaData中的方法得到结果集中的数据的信息,有助于程序员处理数据。
五、终止与DBMS的连接
当完成对数据库的访问之后,通过调用Connection接口的close()方法关闭Connection对象,终止与数据库的连接,如果在关闭连接时遇到问题,该方法将会抛出一个异常。关闭与
数据库的连接时将自动关闭结果集,但是出于程序稳定性的考虑,最好在关闭连接之前用一个显式的语句先将结果集明确地关闭。
具体形式为:
results.close();
connect.close();
JDBC技术使用在Application程序和Servlet程序中。可以和界面技术、输入流、输出流等结合在一起,设计出功能复杂的程序。
一个典型的Application实例和一个完整的查询数据库的实例:
1、安装mysql
2、下载mysql驱动
3、建数据库
create database graduation_design;
4、建表
create table namelist(number smallint(2) not null,
name varchar(20) not null,
sex char(10) not null,
college varchar(20) not null,
speciality varchar(20) not null,
phone varchar(10) not null,
primary key(number));
5、将下面的内容保存成sql.txt文档,放在mysql安装路径的bin下。
1 吕雷 男 计算 计算机科学与技术 13904310001
2 吕雷2 男 计算 计算机科学与技术 13904310002
3 吕雷3 男 计算 计算机科学与技术 13904310003
4 吕雷4 女 软件 软件工程 13904310004
5 吕雷5 男 软件 软件工程 13904310005
6 吕雷6 男 软件 软件工程 13904310006
7 吕雷7 男 经济 计算机科学与技术 139043100076、load data local infile "sql.txt" into table namelist;
7、用eclipse把下面的代码输进去。
8、在eclipse里面把驱动家进去。在工程出右键:
build path-->add libraries-->user library
9、运行。
//Example 2 of Chapter 10
import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
public class JDBCDemo2 extends JFrame
{
private ScrollPane scrollPane;
private JTextArea area;
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/graduation_design";
private String user = "root";
private String password = "";
private Connection connect;
private Statement stmt;
private ResultSet results;
public JDBCDemo2()
{
super( "JDBC查询演示" );
getContentPane().setLayout( new BorderLayout() );
scrollPane = new ScrollPane();
area = new JTextArea();
area.setEditable( false );
scrollPane.add( area );
getContentPane().add( scrollPane, BorderLayout.CENTER );
try{
//载入JDBC驱动程序
Class.forName( driver );
//连接到数据库
Connection connect = DriverManager. getConnection( url, user, password );
//创建Statement对象
stmt = connect.createStatement();
//获取查询结果
String query = "SELECT * FROM namelist";
results = stmt.executeQuery( query );
//处理查询结果
StringBuffer s = new StringBuffer();
//获取数据描述信息
ResultSetMetaData metaData = results.getMetaData();
int columns = metaData.getColumnCount();
//输出数据表列名
for ( int i = 1; i <= columns; i++ )
s.append( metaData.getColumnName( i ) + " " );
s.append( "/n" );
//输出数据记录
while ( results.next() )
{
for ( int i = 1; i <= columns; i++ )
s.append( " " + results.getObject( i ) );
s.append( "/n" );
}
area.append( s.toString() );
}
catch ( SQLException sqlException )
{
area.append( "发生SQLException异常/n" );
}
catch ( ClassNotFoundException classNotFound )
{
area.append( "发生ClassNotFoundException异常/n" );
}
finally{
try{
results.close();
stmt.close();
connect.close();
}
catch ( SQLException sqlException )
{
sqlException.printStackTrace();
}
catch ( NullPointerException nullpointerException )
{
nullpointerException.printStackTrace();
}
}
setSize( 420, 240 );
setVisible( true );
}
public static void main( String args[] )
{
JDBCDemo2 window = new JDBCDemo2();
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
运行效果得
number name sex college speciality phone
1 吕雷 男 计算 计算机科学与技术 13904310001
2 吕雷2 男 计算 计算机科学与技术 13904310002
3 吕雷3 男 计算 计算机科学与技术 13904310003
4 吕雷4 女 软件 软件工程 13904310004
5 吕雷5 男 软件 软件工程 13904310005
6 吕雷6 男 软件 软件工程 13904310006
7 吕雷7 男 经济 计算机科学与技术 13904310007