JDBC入门
JDBC简介
JDBC是一个能够处理任何类型数据表的Java API,尤其是处理关系型数据。JDBC能够帮助你写的Java程序来管理以下三种程序:
连接数据源,比如连接数据库
发送查询和更新命令到数据库
相应检索和查询从数据库中得到的查询结果
有了JDBC向数据库发送SQL指令就变成了一件很容易的事情,我们不必为每一种数据库专门编写数据库访问和操作程序。现在我们只关心JDBC API就够了,只要会写SQL会用JDBC API就可以用SQL操作任意类型的数据库,不管是ORACLE,Sysbase,Mysql还是SQL Server。
JDBC组件
JDBC包含了4大组件:
The JDBC API
JDBC API提供了Java语言访问关系数据的程序代码支持,使用JDBC API可以执行SQL命令,获取返回结果和数据库事物操作。目前JDBC 4.0 API被分割在了java.sql 和javax.sql软件包下。
JDBC Driver Manger
JDBC Driver Manger定义了能够通过JDBC连接到Java程序的一系列对象。
JDBC Test Suite
JDBC驱动程序测试套件帮助您确定JDBC驱动程序将运行的程序。
JDBC-ODBC Bridge
JDBC-ODBC Bridge 使得Java程序通过ODBC桥提供的JDBC驱动程序访问关系型数据。
看到这里您或许对JDBC有点疑惑了,这都四大组件了,还简单呢?Don’worry,其实我们平时常用的就只有前面的两大组件,下面的两个组件由于限定了特殊的环境因素,所以并不是很常用,当然也不是没用。
JDBC架构
JDBC API通常提供“两层”和“三层”两种模型来访问数据库:
两层模型:
三层模型:
究竟怎样使用JDBC 来访问和操作数据库?
首先你要有数据库,并且可以访问,然后你还要对JDBC API有所了解。OK,首先要说明选择什么样的数据库并不是很重要,这里我们要把重点放在对JDBC API 的了解和掌握上,OK?我们并不关心你某某数据库学习怎么样,到了后面我们可以看到只要是DBA让我们访问数据库,嘿嘿,就该我们使用JDBC大显身手了。OK,一步一步来吧。
OK,你可以先安装一个数据库(数据库服务器而不是客户端),当然这个并不重要,如果你有现成的数据库可以访问,那么久可以掠过了。然后我们还需要你有个开发工具,或者说是IDE。然后根据你的数据库来选择数据库驱动。如果你已经完整安装了最新的JDK和NetBeans with Sun Application Server那么OK,你的装备已经很完整了。
现在来说一下使用JDBC来访问和操作数据库的步骤,暂且称之为JDBC五部曲吧。
加载数据库驱动
建立数据库连接
交待SQL指令
处理SQL返回结果
关闭资源
跟着JDBC五部曲走
加载数据库驱动
首先我们要加载数据库驱动,驱动?做什么用的呢?现在我们已经知道Java通过JDBC技术来访问不同的数据库,JDBC可以看做是Java应用程序和数据库之间的一个桥梁。要知道现在又很多种数据库,主流数据库加上N多叫不上名字的数据库,万一下一秒又诞生一个数据库JDBC就能马上支持?No,它还没有那么神,JDBC的设计采用了接口和实现相分离的设计思想,将接口和一些基本操作类放在java.sql和javax.sql下,而接口的实现类就叫做数据库驱动程序,数据库驱动程序由数据库厂商提供。事实证明JDBC的这种设计规范是明智的。
现在的数据库驱动程序大的数据库厂商都有提供,因为各个数据库驱动程序的下载地址不同,在这里不详细提供。数据库驱动程序通常是一个编译好的.jar文件。这里为了说明上方便,我使用Mysql数据库及数据库驱动程序作为说明。
有了数据库驱动程序接下来该怎样加载驱动呢?加载驱动其实非常简单仅仅需要一行代码而已。如果你使用的是Mysql数据库那么就可以这样来写:
Class.forName(“com.mysql.jdbc.Driver”);
或许你也发现了,引号中间的那个字符串其实是一个类名,不同的数据库有所不同,数据库驱动文档会提供给你这个类名的,不需要去记忆。
建立数据库连接
OK,驱动加载完毕,接下来我们开始和数据库建立连接。建立连接的方式也很简单,因为之前驱动已经加载好了,按照接口和实现分离的设计思想,试想下获取连接的方式肯定不在驱动程序上,因为JDBC要和每个数据库打交道肯定预先设计好了统一的连接方式,而究竟怎样连接具体的数据库才由驱动程序决定。
连接数据库仅仅需要一行代码,如果你使用的是Mysql数据库那么就可以这样来写:
DriverManager.getConnection("jdbc:mysql://localhost:3306/database");
或许你有发现了,引号中间的那个字符串是有几个部分组成的,当然这个不需要去记忆,在数据库驱动文档中会提供给你。jdbc:数据库名:数据库位置/数据库名称。这里我的数据库在本地所以就使用了localhost,如果你是通过网络来访问远程数据库,那么可以使用远端的IP地址。后面有个3306代表的是数据库对外提供的访问端口号。我们通常把上述字符串称之为连接字符串,连接字符串中的数据库位置和访问端口号可以问下DBA。
有时候这样做了并不算完,因为我们平时用客户端软件访问数据库时通常还要输入用户名和密码,除非DBA已经允许匿名访问,要不在建立数据库连接时我们是要填写用户名和密码的。如果是这样的话(通常是这样)我们可以这么来做:
DriverManager.getConnection(“”,“”,“”); 依次填入三个字符串,连接字符串,用户名,密码。
交待SQL指令
交待SQL指令就是我们事先定义好SQL语句,定义SQL语句是使用字符串的方式。比如我们可以写:
String sqlStr = “INSERT INTO STU(NO,NAME,SOCRES) VALUES(110314001,‘TOM’,90)”
OK我们看到这就是我们平时所写的SQL(Smith为字符串在数据库中需要用’’包含起来),SQL语句交待完毕。
执行SQL返回结果
执行SQL语句我们使用的是Statement对象的一些列execute()或executeUpdate()方法。不过前提是我们要有Stamemet对象,但java.sql.Statement是一接口,看来要从之前的资源中获得Statement对象了。在上面我们已经获得的连接,得到了连接对象。DriverManger.getConnection()返回了一个Connection对象,然后我们就拿这个Connection对象来继续做文章,我们可以看到在JDBC API中Connection对象有一个createStatement()方法。OK,通过createStatement()方法我们得到了Statement对象,然后我们就可以调用execute()方法了。
如果要处理我们上面的SQL那么我们可以这样来写:(假设conn为Connection的实例,stmt为Statement的实例):
Statement stmt = conn.createStatement();
stmt.execute(sqlStr);
这样SQL就被执行了,SQL执行后会产生结果,对于SQL返回的结果的处理由于方法的返回值和处理的SQL语句种类不同所以处理的方式也不同,这里暂且不讨论处理结果的问题,总之通过execute方法后SQL被执行了就够了。
关闭资源
当我们在进行SQL处理操作也就是和数据库打交道时会产生一定的资源开销,如果操作完SQL如果没有关闭资源的话,那问题也就随之而来了。假设在使用银行的交易系统时同时有一千万个用户来登录并且交易,那么我们的资源开销会很大,如果不关闭,再来一千万,然后随着时间的积累,后果可想而知。为了避免这种问题的出现我们需要关闭使用的资源。我们可以依次调用close()方法来关闭资源,我们应当首先关闭Statement,然后再关闭Connection对象,细想一下关闭是要有顺序的,如果要关闭资源我们可以这样来做:
stmt.close();
conn.close();
Connection对象在关闭后驱动资源的关闭就不用我们操心啦,数据库会有特定的机制来关闭。
但是如果一千万个用户用完后都要关闭资源,试想下也是一个不小的开销。那究竟怎么办呢?有好办法没?这个问题就留给大家了,这个是一个值得讨论的事情。
简单实例
五部曲就到此为止了,下面我们来简单操作一下看看。这里我使用的是WIN XP SP3,数据库是使用的Mysql5.1,IDE使用的是Eclipse Helios。
首先呢我们在我们的Mysql上创建一个Table:STUDENT(这里我们使用Mysql自带的Test数据库)
接下来我们在Eclipse上创建一个jdbc的项目,创建完成后我们就跟着我们的JDBC五部曲走。首先要把数据库驱动加载进来。我们之前说过数据库驱动厂商会封装成一个jar包,然后我们在代码上也看到过如何加载数据库驱动程序,好了使用IDE在实际操作中我们需要将这个jar包和我们的Java应用程序组成一个整体,在Eclipse中究竟怎样做呢?
首先右击我们的jdbc的项目:
选择相应的jar包就OK了。
下面简单列出一个Demo,后面我们会慢慢改善下面的代码。OK就到这里了。
package net.lele.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class HelloJDBC {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
// 1.加载数据库驱动
try {
Class.forName("com.mysql.jdbc.Driver");
}catch (ClassNotFoundException e) {
System.out.println("Can not find class,Load Driver was failed.");
}
// 2.建立数据库连接
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","hello");
}catch (SQLException e) {
System.out.println("Connecte to database was failed.");
}
// 3.交待SQL指令
String sqlStr = "INSERT INTO STUDENT(NAME,SCORE) VALUES('TOM',90)";
// 4.处理SQL返回结果
try {
stmt = conn.createStatement();
}catch (SQLException e) {
System.out.println("Create the object of Statement was failed.");
}
try {
int rowNum = stmt.executeUpdate(sqlStr); //rowNum为执行SQL后所影响的行数
System.out.println(rowNum + " row affected");
}catch (SQLException e) {
System.out.println("Execute SQL was failed.");
}
//关闭资源
if(stmt != null) {
try {
stmt.close();
}catch (SQLException e) {
System.out.println("Close the object of Statement was failed");
}
}
if(conn != null) {
try {
conn.close();
}catch (SQLException e) {
System.out.println("Close the object of Connection was failed");
}
}
}
}