[小结]Java数据库连接 - JDBC方式

 

 

1. JDBC方式 - 连接数据库

一般步骤:

1.1 加载驱动

每个驱动程序类必须实现的接口。 Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。 DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL

强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。 在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序 Class.forName("com.mysql.jdbc.Driver")

 

e.g.

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

 

1.2 建立数据库连接

管理一组 JDBC 驱动程序的基本服务。

作为初始化的一部分,DriverManager 类会尝试加载在 "jdbc.drivers" 系统属性中引用的驱动程序类。这允许用户自定义由他们的应用程序使用的 JDBC Driver。例如:

a) ~/.hotjava/properties 文件中,用户可以指定:jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver

b) 程序还可以在任意时间显式地加载 JDBC 驱动程序:Class.forName("com.mysql.jdbc.Driver");

 

注:DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。

 

e.g.

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/addressbook", "root", "root");

 

 

1.3 创建一个 Statement 对象来将 SQL 语句发送到数据库

用于执行静态 SQL 语句并返回它所生成结果的对象。

 

在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。

 

相关语法:

Statement createStatement(int resultSetType,

                          int resultSetConcurrency,

                          int resultSetHoldability)

                          throws SQLException

创建一个 Statement 对象,该对象将生成具有给定类型并发性可保存性 ResultSet 对象。此方法与默认无参 createStatement 方法相同,但它允许重写默认结果集类型、并发性和可保存性。

 

参数:

resultSetType - 以下 ResultSet 常量之一:ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE

 

resultSetConcurrency - 以下 ResultSet 常量之一:ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE

 

resultSetHoldability - 以下 ResultSet 常量之一:ResultSet.HOLD_CURSORS_OVER_COMMIT ResultSet.CLOSE_CURSORS_AT_COMMIT

 

e.g.

Statement stmt = conn.createStatement();

 

 

1.4 执行数据库操作

java.sql.Statement类中的成员方法:

ResultSet executeQuery(String sql)

          执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

 

int executeUpdate(String sql)

          执行给定 SQL 语句,该语句可能为 INSERTUPDATE DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

 

e.g.

ResultSet rs = stmt.executeQuery("select * from user;");

if(rs.next())

    System.out.println(rs.getString("username") + "\t" + rs.getString("password"));

 

1.5 释放数据库连接资源(有先后顺序)

e.g.

rs.close();

stmt.close();

conn.close();

 

 

完整数据库连接代码:

e.g.

 

/**

 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)

 * All right reserved.

 *

 * Created on Aug 1, 2011 4:38:46 PM

 * http://jarg.iteye.com/

 * Author: Jarg Yee <[email protected]>

 */

package com.iteye.jarg.dao;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

/**

 * TODO JDBC方式 - 基本数据库工具类

 */

public class DBUtil

{

   

    private String driverClassName = "com.mysql.jdbc.Driver";

    private String url = "jdbc:mysql://localhost:3306/addressbook";

    private String username = "root";

    private String password = "root";

   

    private Connection conn = null;

    private Statement stmt = null;

    private ResultSet rs = null;

   

    /**

     * 初始化数据库配置信息

     * */

    public DBUtil()

    {

       build();

    }

   

    /**

     * 建立数据库连接

     * */

    public void build()

    {

       try

       {

           Class.forName(driverClassName);

           conn = DriverManager.getConnection(url, username, password);

           stmt = conn.createStatement();

       }

       catch (ClassNotFoundException e)

       {

           System.out.println("建立数据库连接出错\n" +  e.getMessage());

           this.closeConnection();

           System.exit(0);

       }

       catch (SQLException e)

       {

           System.out.println("建立数据库连接出错\n" +  e.getMessage());

           this.closeConnection();

           System.exit(0);

       }

      

    }

   

    /**

     * 数据库查询

     * */

    public ResultSet executeQuery(String sql)

    {

       try

       {

           rs = stmt.executeQuery(sql);

       }

       catch (SQLException e)

       {

           System.out.println("数据查询出错\n" + e.getMessage());

           return null;

       }

       return rs;

    }

   

    /**

     * 数据库更新

     * */

    public int executeUpdate(String sql)

    {

       int count = 0;

       try

       {

           count = stmt.executeUpdate(sql);

       }

       catch (SQLException e)

       {

           System.out.println("数据库更新出错\n" + e.getMessage());

           return 0;

       }

       return count;

    }

   

    /**

     * 释放数据库连接资源

     * */

    private void closeConnection()

    {

       try

       {

           if(conn != null && !conn.isClosed())

           {

              conn.close();

           }

       }

       catch (SQLException e)

       {

           System.out.println("释放数据库连接资源出错\n" + e.getMessage());

       }

    }

   

    /**

     * 释放SQL语句声明资源

     * */

    private void closeStatement()

    {

       try

       {

           if(stmt != null && !stmt.isClosed())

           {

              stmt.close();

           }

       }

       catch (SQLException e)

       {

           System.out.println("释放SQL语句声明资源出错\n" + e.getMessage());

       }

    }

   

    /**

     * 释放结果集资源

     * */

    private void closeResultSet()

    {

       try

       {

           if(rs != null && !rs.isClosed())

           {

              rs.close();

           }

       }

       catch (SQLException e)

       {

           System.out.println("释放结果集资源出错\n" + e.getMessage());

       }

    }

   

    /**

     * 释放数据库资源

     * */

    public void close()

    {

       this.closeResultSet();

       this.closeStatement();

       this.closeConnection();

    }

   

    /**

     * for debugging.

     * */

    public static void main(String[] args) throws Exception

    {

       DBUtil db = new DBUtil();

      

       String username = "ye";

       String password = "ye";

      

       String sql = "select * from user where username = '" + username + "' and password = '" + password + "';";

       ResultSet rs = db.executeQuery(sql);

       if(rs.next())

           System.out.println(rs.getString("username") + "\t" + rs.getString("password"));

      

       db.close();

    }

}

 

你可能感兴趣的:(数据库连接)