第十一章 Java数据库编程入门
11.1 了解JDBC
一、JDBC的工作机制
在Java中对数据库的访问主要是通过JDBC进行的。JDBC是Java数据库连接技术(Java DataBase Connectivity)的简称,它是用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
使用JDBC来完成对数据库的访问主要包括以下五个层次:
JDBC可做三件事:
① 加载JDBC驱动程序并创建数据库连接;
② 发送操作数据库的语句给DBMS并让DBMS执行它;
③ 对返回结果进行处理。
Driver d=new sun.jdbc.odbc.JdbcOdbcDriver; // 创建驱动程序实例
DriverManager.registerDriver(d); // 注册驱动程序
// 创建与数据库之间的连接
Connection con = DriverManager.getConnection("jdbc:odbc:wombat", "login", "password");
// 调用连接对象的createStatement()方法创建语句对象
Statement stmt = con.createStatement();
// 调用语句对象的executeQuery()方法,查询数据库
// 结果存放在ResultSet对象rs中
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
// 循环读取rs中内容,对返回结果进行处理
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}
// 依次关闭结果、语句和连接对象,以释放相应资源
rs.close();
stmt.close();
conn.close();
二、JDBC API简介
JDBC 4.0 API中包括了java.sql包和javax.sql 包,其中,java.sql包被称为JDBC的核心API,利用其中的类和接口可建立与数据库的连接(包括加载JDBC驱动程序)、向数据库发送SQL语句、获取和更新查询结果等。
javax.sql包被称为JDBC可选包API,它扩展了JDBC API的功能,将它从客户端API扩展到服务器端API,该包是Java企业版的重要组成部分。
11.2 掌握加载JDBC驱动程序的方法
一、JDBC驱动程序分类
1.JDBC-ODBC桥驱动程序
JDBC-ODBC桥驱动程序实际是把所有的JDBC调用传递给ODBC,再由ODBC调用本地数据库驱动程序。
2.本地库Java驱动程序
本地库Java驱动程序首先将JDBC调用转变为DBMS的标准调用,然后再去访问数据库。
3.JDBC网络纯Java驱动程序
这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上,所用的具体协议取决于提供者。
4.本地协议纯Java驱动程序
它是完全由纯Java语言实现的一种驱动,它直接把JDBC调用转换为由DBMS使用的网络协议。这种驱动程序允许从客户机直接访问数据库服务器。
二、加载JDBC驱动程序的方法
1.使用DriverManager类加载
DriverManager类是JDBC的驱动程序管理类,使用该类提供的registerDriver()方法可以加载JDBC驱动程序,其格式如下:
DriverManager.registerDriver(Driver driver)
例如:
Driver d=new sun.jdbc.odbc.JdbcOdbcDriver();
DriverManager.registerDriver(d);
2.调用Class.forName()方法加载
另一种加载JDBC驱动程序的方法是调用Class.forName()方法,它会自动加载驱动程序类,其格式如下:
Class.forName(String DriverName)
例如 :
String d=" sun.jdbc.odbc.JdbcOdbcDriver ";
Class.forName(d);
11.3 掌握创建数据库连接的方法
一、建立数据库连接的方法
建立数据库连接的一般做法如下:
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");
二、JDBC url 参数详解
JDBC url的标准格式由三部分组成,各部分间用冒号分隔,如下所示:
jdbc:<子协议><子名称>
(1)jdbc协议:JDBC url中的协议总是jdbc。
(2)<子协议>:驱动程序名或数据库连接机制的名称。子协议的典型示例是odbc,它表示JDBC使用的是JDBC-ODBC桥驱动程序。
(3)<数据库子名称>:通常为数据库的标识名,它必须为定位数据库提供足够的信息。
三、ODBC数据源设置方法
步骤1 打开“控制面板”窗口,单击其中的“性能和维护”图标 。
步骤2 在“性能和维护”窗口中单击“管理工具”图标 。
步骤3 在“管理工具”窗口中双击“数据源(ODBC)”图标 。
步骤4 在打开的“ODBC数据源管理器”对话框,并打开“系统DSN” 选项卡。
步骤5 单击“添加”按钮,打开“创建新数据源”对话框,从中选择“Driver do Microsoft Access(*.mdb)” 。
步骤6 单击“完成”按钮,打开“ODBC Microsoft Access安装”对话框。在“数据源名”编辑框中输入“javaodbc”,然后单击 “选择”按钮,在打开的“选择数据库”对话框中选择一个Access数据库 。
步骤7 选定数据库后,单击“确定”按钮,返回“ODBC Microsoft Access安装”对话框。再次单击“确定”按钮,返回“ODBC数据源管理器”对话框。新建的数据源已出现在系统数据源列表中 。
步骤8 单击“确定”按钮,设置结束,我们在后面的Java程序中就可以使用它了。
11.4 掌握访问数据库的方法
使用JDBC操作数据库的方法主要分为以下三步。
(1)调用数据库连接Connection类的createStatement()方法定义Statement对象。Statement对象用于执行静态SQL语句并返回它所生成结果的对象。
(2)调用Statemnet对象的executeQuery()方法或executeUpdate()方法,让DBMS执行具体的SQL语句,以便对数据执行查询、增、删、改等操作。
(3)对数据库返回结果进行处理。
一、增加记录
在对数据库的操作中,经常需要向数据库表中增加一行记录。为数据库增加记录的SQL语句的语法格式如下:
insert into 表名(字段列表)values (值列表)
// InsertRecordTest.java
package Chapter11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertRecordTest {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// 以下两条语句可省略,即无需再加载JDBC-ODBC桥驱动程序
String msodbc = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(msodbc); // 加载驱动程序
String url = "jdbc:odbc:javaodbc"; // 定义url
Connection con = DriverManager.getConnection(url); // 建立连接
Statement st = con.createStatement(); // 创建Statemnet对象
// 定义插入记录的sql语句
String sql = "insert into 丛书名录(序号,丛书代号,丛书名称)"
+ "values(1000,'xx','Java系列丛书')";
st.executeUpdate(sql); // 执行数据库更新
st.close(); // 关闭语句
con.close(); // 关闭连接
}
}
二、删除记录
删除记录的SQL语句的语法格式如下:
delete from 表名 where 条件
// DeleteRecordTest.java
package Chapter11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteRecordTest {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// 以下两条语句可省略,即无需再加载JDBC-ODBC桥驱动程序
String msodbc = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(msodbc); // 加载驱动程序
String url = "jdbc:odbc:javaodbc"; // 定义url
Connection con = DriverManager.getConnection(url); // 建立连接
Statement st = con.createStatement(); // 创建Statemnet对象
// 定义删除记录的sql语句
String sql = "delete from 丛书名录 where 丛书代号='xx'";
st.executeUpdate(sql); // 执行数据库更新
st.close(); // 关闭语句
con.close(); // 关闭连接
}
}
三、修改记录
用于修改记录的SQL语句的语法格式如下:
update 表名 set 字段名=数值 where条件
// UpdateRecordTest.java
package Chapter11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateRecordTest {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// 以下两条语句可省略,即无需再加载JDBC-ODBC桥驱动程序
String msodbc = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(msodbc); // 加载驱动程序
String url = "jdbc:odbc:javaodbc"; // 定义url
Connection con = DriverManager.getConnection(url); // 建立连接
Statement st = con.createStatement(); // 创建Statemnet对象
// 定义修改记录的sql语句
String sql = "update 丛书名录 set 丛书代号='yy',"
+ "丛书名称='C++系列丛书' where 丛书代号='xx'";
st.executeUpdate(sql); // 执行数据库更新
st.close(); // 关闭语句
con.close(); // 关闭连接
}
}
四、查询记录
查询记录的SQL语句的语法格式如下:
select 字段1,字段2,字段3,……from 表名 where 条件
// QueryRecordTest.java
package Chapter11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class QueryRecordTest {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
// 以下两条语句可省略,即无需再加载JDBC-ODBC桥驱动程序
String msodbc = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(msodbc); // 加载驱动程序
String url = "jdbc:odbc:javaodbc"; // 定义url
Connection con = DriverManager.getConnection(url); // 建立连接
Statement st = con.createStatement(); // 创建Statemnet对象
// 定义修改记录的sql语句
String sql = "select 书名,ISBN,主编,版别,定价 " + "from 书目名录 where 丛书代号='A'";
// 执行查询数据库操作,并将查询结果存放在ResultSet对象rs中
ResultSet rs = st.executeQuery(sql);
// 显示查询结果
while (rs.next()) {
System.out.println("书名:" + rs.getString("书名") + " ISBN:"
+ rs.getString("ISBN") + " 主编:" + rs.getString("主编")
+ " 版别:" + rs.getString("版别") + " 定价:"
+ rs.getFloat("定价"));
}
rs.close(); // 关闭查询结果记录集
st.close(); // 关闭语句
con.close(); // 关闭连接
}
}
综合实例——图书查询
// BookQuery.java
package Chapter11;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
public class BookQuery extends Frame implements ActionListener {
private static final long serialVersionUID = 1093264799018513820L;
TextField seriesName;
TextArea bookName;
Button button;
BookQuery() { // 构造方法
super("图书查询");
setBounds(150, 150, 300, 300);
seriesName = new TextField(16);
bookName = new TextArea(5, 10);
button = new Button("确定");
Panel p1 = new Panel(), p2 = new Panel();
p1.add(new Label("请输入丛书名:"));
p1.add(seriesName);
p2.add(button);
add(p1, "North");
add(p2, "South");
add(bookName, "Center");
button.addActionListener(this);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setLocationRelativeTo(null); // 使窗体在屏幕上居中放置
setVisible(true); // 显示窗体
}
public void actionPerformed(ActionEvent e) {
// 如果当前单击对象为按钮
if (e.getSource() == button) {
try {
bookName.setText(null); // 清空文本区
ListStudent();
} catch (SQLException ee) {
}
}
}
private void ListStudent() throws SQLException {
String bn1, bn2;
try {
// 加载JDBC-ODBC驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
}
// 创建数据库连接
Connection con = DriverManager.getConnection("jdbc:odbc:javaodbc");
// 创建Statement对象
Statement st = con.createStatement();
// 读出全部记录,得到结果集ResultSet对象
ResultSet rs = st.executeQuery("select * from 书目名录");
boolean boo = false;
while (rs.next()) {
bn1 = rs.getString("丛书代号"); // 读取丛书代号
bn2 = rs.getString("书名"); // 读取书名
// 如果丛书代号相符,则在文本区显示书名
if (bn1.equals(seriesName.getText())) {
bookName.append(bn2 + "\n");
boo = true; // 该系列丛书不为空
}
}
con.close();
if (boo == false) {
bookName.append("该系列丛书不存在!");
}
}
public static void main(String[] args) {
new BookQuery();
}
}
// BookQueryImprove.java
package Chapter11;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
public class BookQueryImprove extends Frame implements ActionListener {
private static final long serialVersionUID = 5477686699015910381L;
TextField seriesName;
TextArea bookName;
Button button;
BookQueryImprove() { // 构造方法
super("图书查询");
setBounds(150, 150, 300, 300);
seriesName = new TextField(16);
bookName = new TextArea(5, 10);
button = new Button("确定");
Panel p1 = new Panel(), p2 = new Panel();
p1.add(new Label("请输入丛书名:"));
p1.add(seriesName);
p2.add(button);
add(p1, "North");
add(p2, "South");
add(bookName, "Center");
button.addActionListener(this);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setLocationRelativeTo(null); // 使窗体在屏幕上居中放置
setVisible(true); // 显示窗体
}
public void actionPerformed(ActionEvent e) {
// 如果当前单击对象为按钮
if (e.getSource() == button) {
try {
bookName.setText(null); // 清空文本区
ListStudent();
} catch (SQLException ee) {
}
}
}
private void ListStudent() throws SQLException {
String bn1, bn2, sqlcmd;
// 获取输入的丛书代号
bn1 = seriesName.getText();
// 如果丛书代号为空,则直接返回
if (bn1.length()==0){
return;
}
try {
// 加载JDBC-ODBC驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e) {
}
// 创建数据库连接
Connection con = DriverManager.getConnection("jdbc:odbc:javaodbc");
// 创建Statement对象
Statement st = con.createStatement();
// 读出全部记录,得到结果集ResultSet对象
// 创建SQL语句,like表示模糊匹配,%表示任意字符串
// “丛书代号 like '输入的丛书代号字符串%'”表示查找丛书代号为
// 以输入的丛书代号字符串开头的全部丛书
sqlcmd = "select * from 书目名录 where 丛书代号 like '";
sqlcmd = sqlcmd + bn1 + "%'";
// 执行SQL语句
ResultSet rs = st.executeQuery(sqlcmd);
boolean boo = false;
while (rs.next()) {
bn2 = rs.getString("书名"); // 读取书名
bookName.append(bn2 + "\n");
boo = true; // 该系列丛书不为空
}
con.close();
if (boo == false) {
bookName.append("该系列丛书不存在!");
}
}
public static void main(String[] args) {
new BookQueryImprove();
}
}
本章小结
本章介绍了使用JDBC进行数据库程序开发的基础知识,具体介绍了JDBC的工作机制,驱动程序的加载方法,建立数据库连接的方法,以及访问数据库的几种常用SQL语句的语法等。