鍍金池/ 教程/ Java/ JDBC
Struts2
Java 泛型
排序算法
Java 內(nèi)存管理
Webservice
Spring
輸入輸出流
Socket
字符串與數(shù)組
面向?qū)ο缶幊?/span>
海量數(shù)據(jù)處理
Hibernate
Netty
基本類型與運算符
常見設(shè)計模式
Java 虛擬機
Java 多線程
JDBC
搭建 Java 開發(fā)環(huán)境
Java 數(shù)據(jù)庫操作
異常處理
集合類
Servlet 與 JSP

JDBC

什么是 JDBC? Java 語言訪問數(shù)據(jù)庫的一種規(guī)范,是一套 API JDBC (Java Database Connectivity) API,即 Java 數(shù)據(jù)庫編程接口,是一組標準的 Java 語言中的接口和類,使用這些接口和類,Java 客戶端程序可以訪問各種不同類型的數(shù)據(jù)庫。比如建立數(shù)據(jù)庫連接、執(zhí)行 SQL 語句進行數(shù)據(jù)的存取操作。

JDBC 規(guī)范采用接口和實現(xiàn)分離的思想設(shè)計了 Java 數(shù)據(jù)庫編程的框架。接口包含在 java.sql 及 javax.sql 包中,其中 java.sql 屬于 JavaSE,javax.sql 屬于 JavaEE。這些接口的實現(xiàn)類叫做數(shù)據(jù)庫驅(qū)動程序,由數(shù)據(jù)庫的廠商或其它的廠商或個人提供。

為了使客戶端程序獨立于特定的數(shù)據(jù)庫驅(qū)動程序,JDBC 規(guī)范建議開發(fā)者使用基于接口的編程方式,即盡量使應(yīng)用僅依賴 java.sql 及 javax.sql 中的接口和類。

http://wiki.jikexueyuan.com/project/java-special-topic/images/36.jpg" alt="" />

JDBC 驅(qū)動程序: 什么是 JDBC 驅(qū)動程序? 這些是各個數(shù)據(jù)庫廠家根據(jù) JDBC 的規(guī)范制作的 JDBC 實現(xiàn)類 JDBC 驅(qū)動程序的四種類型:

  1. 第一種類型的驅(qū)動程序的實現(xiàn)是通過將 JDBC 的調(diào)用全部委托給其它編程接口來實現(xiàn)的,比如 ODBC。這種類型的驅(qū)動程序需要安裝本地代碼庫,即依賴于本地的程序,所以便攜性較差。比如 JDBC-ODBC 橋驅(qū)動程序
  2. 第二種類型的驅(qū)動程序的實現(xiàn)是部分基于 Java 語言的。即該驅(qū)動程序一部分是用 Java 語言編寫,其它部分委托本地的數(shù)據(jù)庫的客戶端代碼來實現(xiàn)。同類型1的驅(qū)動一樣,該類型的驅(qū)動程序也依賴本地的程序,所以便攜性較差
  3. 第三種類型的驅(qū)動程序的實現(xiàn)是全部基于 JAVA 語言的。該類型的驅(qū)動程序通常由某個中間件服務(wù)器提供,這樣客戶端程序可以使用數(shù)據(jù)庫無關(guān)的協(xié)議和中間件服務(wù)器進行通信,中間件服務(wù)器再將客戶端的 JDBC 調(diào)用轉(zhuǎn)發(fā)給數(shù)據(jù)庫進行處理
  4. 第四種類型的驅(qū)動程序的實現(xiàn)是全部基于 JAVA 語言的。該類型的驅(qū)動程序中包含了特定數(shù)據(jù)庫的訪問協(xié)議,使得客戶端可以直接和數(shù)據(jù)庫進行通信

JDBC 類結(jié)構(gòu):

http://wiki.jikexueyuan.com/project/java-special-topic/images/37.jpg" alt="" />

DriverManager:這個是一個實現(xiàn)類,它是一個工廠類,用來生產(chǎn) Driver 對象的 這個類的結(jié)構(gòu)設(shè)計模式為工廠方法 Driver:這是驅(qū)動程序?qū)ο蟮慕涌?它指向一個實實在在的數(shù)據(jù)庫驅(qū)動程序?qū)ο?那么這個數(shù)據(jù)庫驅(qū)動程序?qū)ο笫菑哪睦飦淼哪? DriverManager 工廠中有個方法:getDriver(String URL),通過這個方法可以得到驅(qū)動程序?qū)ο?這個方法是在各個數(shù)據(jù)庫廠商按JDBC規(guī)范設(shè)計的數(shù)據(jù)庫驅(qū)動程序包里的類中靜態(tài)實現(xiàn)的,也就是在靜態(tài)塊中 Connection:這個接口可以制向一個數(shù)據(jù)庫連接對象,那么如何得到這個連接對象呢? 是通過 DriverManager 工廠中的 getConnection(String URL)方法得到的 Statement:用于執(zhí)行靜態(tài)的 SQL 語句的接口,通過 Connection 中的 createStatement 方法得到的 Resultset:用于指向結(jié)果集對象的接口,結(jié)果集對象是通過 Statement 中的 execute 等方法得到的

JAVA 使用 JDBC 訪問數(shù)據(jù)庫的步驟:

  1. 得到數(shù)據(jù)庫驅(qū)動程序
  2. 創(chuàng)建數(shù)據(jù)庫連接
  3. 執(zhí)行 SQL 語句
  4. 得到結(jié)果集
  5. 對結(jié)果集做相應(yīng)的處理(增,刪,改,查)
  6. 關(guān)閉資源:這里釋放的是 DB 中的資源

http://wiki.jikexueyuan.com/project/java-special-topic/images/38.jpg" alt="" />

設(shè)置 classpath:

  1. 在 java 文件中起的包名一定要是工程基目錄下的子目錄,classpath:基目錄
  2. .jar 包,需要將這個 .jar 包的路徑包括這個文件的全名添加到 classpath 中來 Oracle 連接字符串的書寫格式: “oracle:jdbc:thin:@ip:1521: 數(shù)據(jù)庫名”,”數(shù)據(jù)庫用戶名”,”數(shù)據(jù)庫密碼”

簡單的例子:

package moudule1.first;

import java.sql.*;

public class FirstJdbc
{
      public static void main(String[] args)
      {
                 String sql="select * from yuchen_user";
                 Connection con=null;
                 Statement st=null;
                 ResultSet rs=null;

       try
       { 
                 Class.forName("oracle.jdbc.driver.OracleDriver");
                 con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
                 st=con.createStatement();
                 rs=st.executeQuery(sql);
                 while(rs.next())
                 {
                            System.out.println(rs.getInt("id"));
                            System.out.println(rs.getString("name"));
                 }
       }catch(Exception e)
       {
                 e.printStackTrace();
       }finally
       {
                 try
                 {
                      con.close();
                 }catch(Exception e)
                 {}

                 try
                 {
                      st.close();
                 }catch(Exception e)
                 {
                 }

                 try
                 {
                      rs.close();
                 }catch(Exception e)
                 {
                 }

       }

      }

}

常用數(shù)據(jù)庫的驅(qū)動程序及 JDBC URL: Oracle 數(shù)據(jù)庫: 驅(qū)動程序包名:ojdbc14.jar 驅(qū)動類的名字:oracle.jdbc.driver.OracleDriver JDBC URL:jdbc:oracle:thin:@dbip:port:databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部分需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為1521。 databasename –為數(shù)據(jù)庫的 SID,通常為全局數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1521,那么 URL 寫法如下: jdbc:oracle:thin:@localhost:1521:allandb 下載地址如下: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

SQL Server 數(shù)據(jù)庫 驅(qū)動程序包名:msbase.jar mssqlserver.jar msutil.jar 驅(qū)動類的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為1433。 databasename –數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1433,那么 URL 寫法如下: jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb 下載地址:http://www.microsoft.com/downloads/details.aspx

MySQL 數(shù)據(jù)庫 驅(qū)動程序包名:mysql-connector-java-3.1.11-bin.jar 驅(qū)動類的名字:com.mysql.jdbc.Driver JDBC URL:jdbc:mysql://dbip:port/databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為3306。 databasename –數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1433,那么 URL 寫法如下: jdbc:mysql://localhost:3306/allandb 下載地址:http://dev.mysql.com/downloads/connector/j/

Access 數(shù)據(jù)庫 驅(qū)動程序包名:該驅(qū)動程序包含在 JavaSE 中,不需要額外安裝。 驅(qū)動類的名字:sun.jdbc.odbc.JdbcOdbcDriver JDBC URL:jdbc:odbc:datasourcename 說明:該驅(qū)動只能工作在 Windows 系統(tǒng)中,首先需要在操作系統(tǒng)中建立一個可以訪問Access 數(shù)據(jù)庫的本地數(shù)據(jù)源(ODBC),如果名字為 allandb,那么 URL 寫法如下: jdbc:odbc:allandb

PreparedStatement 接口: 預編譯的 sql 語句對象 作用: 解決了書寫 sql 語句時一些特殊的字符與 sql 保留字符沖突的問題,非常方便

/**
*知識點:
*PreparedStatement 接口及方法的使用
*程序目標:
*java文件:
*PreparedInsert.java:連接數(shù)據(jù)庫,插入一條數(shù)據(jù)
*JdbcUtil.java:實現(xiàn)一個工具類,功能:1.連接數(shù)據(jù)庫 2.關(guān)閉資源
*/ 
package moudule1.preparedstatement;

import java.sql.*;
import moudule1.com.*;

public class PreparedInsert
{
      public static void main(String[] args)
      {
           String sql="insert into yuchen_user (id,name) values (?,?)";
           System.out.println(sql);

           Connection con=null;
           PreparedStatement ps=null;

           try{
                 con=JdbcUtil.getConnection();
                 ps=con.prepareStatement(sql);

                 ps.setInt(1,2);
                 ps.setString(2,"zhangsan");
                 ps.executeUpdate();

                 ps.setInt(1,3);
                 ps.setString(2,"lisi");
                 ps.executeUpdate();

           }catch(Exception e){
                 e.printStackTrace();
           }finally{
                 JdbcUtil.close(con,ps);
                 }
           }
      }

package moudule1.com;

import java.sql.*;

public class JdbcUtil{

      public static Connection getConnection() throws Exception{
           Class.forName("oracle.jdbc.driver.OracleDriver");
       return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
           }

      public static void close(Connection con,Statement st){

           close(con);
           close(st);

           }

      public static void close(Connection con,Statement st,ResultSet rs){

           close(con,st);
           close(rs);

           }

      public static void close(Connection con){
           try{

                 con.close();

           }catch(Exception e){

                 }

           }

      public static void close(Statement st){

           try{

                 st.close();

           }catch(Exception e){

                 }
           }

      public static void close(ResultSet rs){

           try{

                 rs.close();

           }catch(Exception e){

                 }

           }

      }

數(shù)據(jù)庫的增刪改查的例子:
/**
*知識點:
*JDBC+SQL+ORACLE
*程序目標:
*UserDao.java:實現(xiàn)了數(shù)據(jù)庫的增刪改查
*JdbcUtil.java:工具類,有連庫和關(guān)閉資源的方法
*/

package moudule1.idus;

import java.sql.*;
import moudule1.com.*;

public class UserDao{

      private String sql;
      private Connection con;
      private Statement st;
      private ResultSet rs;

      public UserDao(){
           sql=null;
           con=null;
           st=null;
           rs=null;
           }

      public void insert(){

           sql="insert into yuchen_user (id,name) values(";
           sql+="4,'zhouwu')";
           System.out.println(sql);

           try{

           con=JdbcUtil.getConnection();
           st=con.createStatement();
           st.executeUpdate(sql);

           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,st);

                 }

           }

      public void delete(){

           sql="delete from yuchen_user where id=2";
           System.out.println(sql);

           try{

                 con=JdbcUtil.getConnection();
            st=con.createStatement();
            st.executeUpdate(sql);

           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,st);

                 }
           }

      public void update(){

           sql="update yuchen_user set name='liumang' where id=1";
           System.out.println(sql);

           try{

                 con=JdbcUtil.getConnection();
            st=con.createStatement();
            st.executeUpdate(sql);

           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,st);

                 }
           }

      public void select(){

           sql="select * from yuchen_user";
           System.out.println(sql);

           try{

                 con=JdbcUtil.getConnection();
            st=con.createStatement();
             rs=st.executeQuery(sql);

            while(rs.next()){

               System.out.println(rs.getInt(1));
               System.out.println(rs.getString(2));

               }

           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,st,rs);

                 }

           }

      public static void main(String[] args){

           UserDao ud=new UserDao();
           ud.select();
           ud.insert();
           ud.select();
           ud.update();
           ud.select();
           ud.delete();
           ud.select();
           }
      }

一些常用的方法:
/**
*知識點:
*execute方法,getResultSet(),getUpdateCount()
*程序目標:
*JdbcUtil.java:工具類,連接數(shù)據(jù)庫,關(guān)閉資源
*sqlExecutor.java:命令行參數(shù)輸入sql語句,并執(zhí)行該語句
*/
package moudule1.fangfa;

import java.sql.*;
import moudule1.com.*;

public class sqlExecutor{

      public static void main(String[] args){

           Connection con=null;
           Statement st=null;

           try{

                 con=JdbcUtil.getConnection();
                 st=con.createStatement();
                 boolean str=st.execute(args[0]);

                 if(str){

                      ResultSet rs=st.getResultSet();

                      while(rs.next()){
                            System.out.println(rs.getInt("id")+":"+rs.getString("name"));
                            }

                            rs.close();

                 }else{
                      int row=st.getUpdateCount();
                      System.out.println(row);
                      }

           }catch(Exception e){

                 e.printStackTrace();

           }finally{

                 JdbcUtil.close(con,st);

                 }
           }
      }