JDBC访问数据库

来自CloudWiki
58.56.27.221讨论2018年5月8日 (二) 03:08的版本 加入异常处理信息
跳转至: 导航搜索

JDBC连接数据库的流程

  1. 加载驱动:提前下载驱动包,加入到项目之中
  2. 注册驱动:在Java程序中注册要使用的驱动程序。
  3. 创建连接:通过DriverManager类创建数据库连接对象Connection。
  4. 创建Statement对象:为执行静态 SQL 语句做准备。
  5. 调用Statement对象:调用Statement对象的相关方法执行相对应的 SQL 语句。
  6. 关闭数据库连接


用JDBC实现查询功能

下面通过一个例子来看一下JDBC访问数据库的代码编写方法,该例用于显示所有用户的账号,姓名和城市信息。具体代码如下:

加载指定数据库的驱动程序

Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件。

你可以从群邮件里下载MySQL驱动 jar 包:mysql-connector-java-5.1.39-bin.jar

导入数据库驱动程序

Eclipse导入数据库驱动程序

创建测试数据

接下来我们在 MySQL 中创建 cloud 数据库,并创建 user 数据表,表结构如下:

mysql> create database cloud;
    
Query OK, 1 row affected (0.00 sec)

mysql> use cloud;
Database changed
mysql>  CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(100) NOT NULL,
   `password` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )  
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql>  CREATE UNIQUE INDEX uname on user(name);
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

插入一些数据:

mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123456');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123457');
ERROR 1062 (23000): Duplicate entry 'ma' for key 2

</nowiki>

连接数据库

package main;
import java.sql.*;

/*本类对应实训: */
public class MainClass {

	// JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/cloud";
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "000000";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        
            // 注册 JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");
        
            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, password FROM user";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("password");
    
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 用户名: " + name);
                System.out.print(", 密码: " + url);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
         System.out.println("用户信息输出完毕!");
    }
}

加入异常处理信息

加上了try-catch语句之后的代码:

package main;
import java.sql.*;

/*本类对应实训: */
public class MainClass {
	// JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  //MySQL-JDBC驱动路径
    static final String DB_URL = "jdbc:mysql://localhost:3306/cloud";//MySQL-JDBC-URL
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";//数据库登录账号
    static final String PASS = "000000";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
           // 注册 JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");
        
            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, password FROM user";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("password");
    
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 用户名: " + name);
                System.out.print(", 密码: " + url);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
           System.out.println(se.getMessage());
        }catch(Exception e){
           // 处理 Class.forName 错误
           System.out.println(e.getMessage());
        }
        System.out.println("Goodbye!");
    }
}

参考文档: [1] http://www.runoob.com/java/java-mysql-connect.html

JDBC核心组件

JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括:

DriverManager类

主要负责加载各种不同的数据库驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。其常用方法如下:

registerDriver(driver);//注册驱动对象 
Connection getConnection(url,user,password);//获取连接对象

Driver接口

驱动程序接口,所有具体的数据库系统厂商要必须实现此接口,形成自己特有的驱动程序包。

装载驱动的语句是Class.forName("驱动类")。

Connection接口

应用程序和数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建和具体数据库系统的连接实例。

例如,获取MySQL连接对象的语句如下:

String url = "jdbc:mysql://localhost:3306/goods";
String user = "root", pwd = "123456";
Connection conn = DriverManager.getConnection(url,user,pwd);

其中,数据库的URL一般由协议名+数据库系统标识+IP地址(域名)+端口+数据库名称组成,用户名和密码是指登录数据库时所使用的用户名和密码。

  • Statement接口:用于执行静态的sql语句(单次执行),通过Connection对象创建实例。
 Statement stmt=conn.createStatement(); //创建Statement对象

其常用方法如下:

  • execute(sql)方法
若sql是查询语句且有结果集则返回true;若是非查询语句或者没有结果集则返回false。例如,boolean flag = stmt.execute(sql); 
  • executeQuery(sql)方法
执行查询语句,并返回结果集。例如,ResultSet rs = stmt.executeQuery(sql); 
  • executeUpdate(sql)方法
执行DML语句,并返回影响的记录数。例如,int count = stmt.executeUpdate(sql);
  • PreparedStatement接口
是Statement接口的子接口,用于执行预编译sql语句,一般包含动态参数。
  • CallableStatement接口
是PreparedStatement接口的子接口,用于执行存储过程。
  • ResultSet接口
执行查询SQL语句后返回的结果集,由ResultSet接口接收。

常见的处理方式是遍历或存在性判断(如登录功能)。例如,

String sql = "select * from admin"; 
ResultSet rs = stmt.executeQuery(sql); 
while (rs.next()) { 
        out.println(rs.getInt("id")+"," +rs.getString("username") ); 
} 

查询的结果存放在ResultSet对象的行结构中,指针的最初位置在首行之上,可以使用next()方法在行间移动;使用getXXX( )方法取得字段的内容,其参数可以是字段索引(从1开始),也可以是字段名(如getInt(“id”)表示获取当前行内字段名为id的数据,getString(2)表示获取当前行内第2个字段的字符串数据)。

SQLException类

代表在数据库连接的建立、关闭及SQL语句的执行过程中发生的异常。

知识点提炼

  1. JDBC的核心组件:DriverManager、Connection、Statement、ResultSet
  2. JDBC连接数据库的步骤:
(1)导入驱动
(2)加载驱动:Class.forName
(3)获取连接:Connection
(4)构建语句对象:Statement
(5)执行SQL语句,并返回结果:ResultSet
(6)释放资源:close

返回 Java程序设计