实现第一个JDBC程序

通过上一篇对 JDBC 及其常用API的了解,接下来我们了解一下 JDBC 编程,JDBC编程分为以下几个步骤进行:
(1) 加载并注册数据库驱动,具体如下:

DriverManager。registerDriver(Driver driver);

(2)通过DriverManager获取数据库连接,具体方式如下:

Connection conn=DriverManager.getConnection(String url,String user,String password);

从上述方法可以看出,getConnection() 方法中有三个参数,它们分别表示数据库 url、登录数据库的用户名和密码。数据库 url 通常遵循如下形式的写法:

jdbc:subprotocol:subname

上面的 url 写法中 jdbc部分是固定的,subprotocol 指定连接到特定的数据库的驱动程序,而subname 部分则是很不固定,也没有什么规律,不同数据库的 url 形式可能存在较大的差异,以 MySQL 数据库 url 为例,其形式如下:

jdbc:mysql://hostname:port/databasename

(3) 通过 Connection 对象获取 Statement 对象。Connection 创建 Statement 的方式有如下三种:

a. createStatement() :创建基本的 Statement对象。
b.prepareStatement():创建 PreparedStatement对象。
c.prepareCall():创建 CallableStatement对象。

以创建基本的 Statement 对象为例,具体方式如下:

Statement stmt=conn.createStatement();

(4) 使用 Statement执行 SQL 语句。所有的 Statement都有如下三种方法来执行 SQL语句。

a. execute():可以执行任何 SQL语句。
b. executeQuery():通常执行查询语句,执行后返回代表结果集的 ResultSet 对象。
c. executeUpdate():主要用于执行 DML 和 DDL语句。执行 DML 语句,如 INSERT、UPDATE或DELETE时,返回受SQL语句影响的行数,执行DDL语句返回 0;

以 executeQuery()方法为例,具体方法如下:

//执行SQL语句,获取结果ResultSet
ResultSet rs=stmt.executeQuery();

(5) 操作ResultSet 结果集。如果执行 SQL语句是查询语句,执行结果将返回一个 ResultSet 对象,该对象里保存了 SQL语句查询的结果。程序可以通过操作该 ResultSet 对象来取出查询结果。ResultSet 对象提供的方法主要可以分为以下两类:

a. next()、previous()、first()、last()、beforeFirst()、afterLast()、absoulte()等移动记录指针的方法。
b. getXxx()获取指针指向行,特定的列。

(6)回收数据库的资源。关闭数据连接,释放资源,包括关闭 ResultSet、Statement 和Connection等资源。
至此,JDBC编程的大致步骤已经完成啦,接下来我们来进行编写第一个JDBC程序。下面这个程序从users表中读取数据,并将结果打印在控制台上,具体的步骤如下:

1. 搭建实验环境

在MySQL中创建一个名称为test的数据库,然后在该数据库中创建一个users表,SQL语句如下:

create database test;
use test;
create table users(
    id int primary key auto_increment,
    name varchar(20),
    password varchar(40),
    email varchar(40),
    birthday DATE
) engine=innodb default character set utf8;

数据库和表创建成功之后,再向users表中插入四条数据, SQL语句如下:

insert into users(name,password,email,birthday) values('zhang','123','zhang@sina.com','1999-08-09');
insert into users(name,password,email,birthday) values('li','456','li@sina.com','1989-12-09');
insert into users(name,password,email,birthday) values('wang','123','wang@sina.com','1997-06-19');
insert into users(name,password,email,birthday) values('zhao','123','zhao@sina.com','1995-03-08');

为了查看数据是否添加成功,使用select语句查询users表,执行结果如下:
这里写图片描述

2导入数据库驱动

新建的Java工程test,将要访问的数据库驱动文件添加到classpath中。由于应用程序访问的是MySQL数据库,因此,将MySQL的数据库驱动文件 mysql-connector-java-5.0.8-bin.jar 添加到 classpath 中即可。

3. 编写JDBC 程序

在test中,新建的Java类 Demo,该类用于读取数据库中的users表,并将结果输出,如下所示:

package com.rocky.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
public class Demo {
    public static void main(String[] args) throws Exception {
        //1.注册数据库的驱动
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        //2.通过DriverManager获取数据库连接
        String url="jdbc:mysql://localhost:3306/test";
        String username="root";
        String password="root";
        Connection conn=DriverManager.getConnection(url, username, password);
        //通过connection对象获取statement对象
        Statement stmt=conn.createStatement();
        //使用statement对象执行SQL语句
        String sql ="select * from users";
        ResultSet rs=stmt.executeQuery(sql);
        //操作ResultSet结果集
        System.out.println("id|name|password|email|birthday");
        while(rs.next()){
            //通过列名获取指定的字段
            int id=rs.getInt("id");
            String name=rs.getString("name");
            String psw=rs.getString("password");
            String email=rs.getString("email");
            Date birthday=rs.getDate("birthday");
            System.out.println(id+"|"+name+"|"+psw+"|"+email+"|"+"|"+birthday);
        }
        //回收数据库资源
        rs.close();
        stmt.close();
        conn.close();   
    }
}

程序执行成功,会将从users表中读取的数据打印到控制台上,具体如下图所示:
这里写图片描述
在以上例子中,演示了JDBC访问数据库的步骤。首先注册MySQL的数据库驱动器类,通过DriverManager获取一个Connection对象,然后使用Connection对象创建了一个Statement对象,Statement对象能够通过executeQuery()方法执行SQL语句,并返回结果集ResultSet对象,最后通过遍历ResultSet对象便可得到最终的查询结果。

需要注意的是,在实现第一个JDBC程序的时候,还有两个方面需要改进:

改进方案

1.注册驱动

在注册数据库驱动的时候,虽然 DriverManager.registerDriver(new com.mysql.jdbc.Driver())方法可以完成,但会使数据库驱动被注册两次。这是因为Driver类的源码中,已经在静态代码块中完成了数据库驱动的注册。所以,为了避免数据库驱动被重复注册,只需要在程序中加载驱动类即可,具体的加载方式如下:

Class.forName("com.mysql.jdbc.Driver");

2. 释放资源

由于数据库资源非常宝贵,数据库允许的并发访问连接数量有限。因此,当数据库资源使用完毕之后,一定要记得释放资源。为了保证释放资源,在Java程序中,应该将最终必须要执行的操作放在finally代码块中,具体的操作如下:

//回收数据库资源
        if(rs !=null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs=null;
        }
        if(stmt !=null){
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            stmt.close();
        }
        if(conn !=null){
            try {
                conn.close();
                } catch (Exception e) {
                e.printStackTrace();
            }
            conn=null;
        }

版权声明:本文为Victory_Lei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>