文章出處

1. JDBC簡介

        SUN公司為了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規范,稱之為JDBC,JDBC不能直接操作數據庫,JDBC通過接口加載數據庫的驅動,然后操作數據庫。JDBC:Java Data Base Connectivity,它主要由接口組成。組成JDBC的2個包為java.sql和javax.sql。開發JDBC應用需要這2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。

2. JDBC快速入門

        編程從user表中讀取數據,并打印在控制臺窗口中。

2.1 搭建實驗環境

create database test Character set utf8 collate utf8_general_ci;  
use test  
create table user  
(  
    id int primary Key,  
    name varchar(20),  
    password varchar(20),  
    email varchar(20),  
    birthday Date  
);  
  
insert into user(id,name,password,email,birthday) values(1,'zw','123','zw@sina.com','1990-09-19');  
insert into user(id,name,password,email,birthday) values(2,'ls','123','ls@sina.com','1991-04-19');  
insert into user(id,name,password,email,birthday) values(3,'ww','123','ww@sina.com','1992-06-19');  

2.2 編寫java程序

        新建一個java工程,并導入數據庫驅動 MySQL-connector-java-5.1.20-bin.jar。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
public class Demo1 {
    
    public static void main(String[] args) throws Exception {
        String url="jdbc:mysql://localhost:3306/test";
        String username="root";
        String password="root";
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        
        try{  
            //1.加載驅動  
            //DriverManager.registerDriver(new Driver());  
            Class.forName("com.mysql.jdbc.Driver");  
              
            //2.獲取數據庫的連接  
          conn = DriverManager.getConnection(url, username, password);  
              
            //3.獲得用于向數據庫發送sql語句的statement對象  
            st = conn.createStatement();  
              
            //4.向數據庫發sql,并獲取代表結果集的resultset  
            String sql = "select id,name,password,email,birthday from user";  
             rs = st.executeQuery(sql);  
              
            //取出結果集的數據  
            while(rs.next()){  
                int id = (Integer) rs.getObject("id");  
                String name = (String)rs.getObject("name");  
                String pd = (String)rs.getObject("password");  
                String email = (String)rs.getObject("email");  
                Date birthday = (Date)rs.getObject("birthday");  
                System.out.println(id+","+name+","+pd+","+email+","+birthday);  
            }  
        }
        //關閉連接  
        finally{  
            if(rs != null){  
                try{  
                    rs.close();  
                }catch(Exception e) {  
                    e.printStackTrace();  
                }  
            }  
            if(st != null){  
                try{  
                    st.close();  
                }catch(Exception e) {  
                    e.printStackTrace();  
                }  
            }  
              
            if(conn != null){  
                try{  
                    conn.close();  
                }catch(Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }
}

   JDBC程序中的DriverManager用于加載驅動,并創建與數據庫的連接,這個類的常用方法有:

  1. DriverManager.registerDriver(new Driver());  
  2. DriverManager.getConnection(URL, user, password);  

  注意:在實際開發中不推薦采用registerDriver方法注冊驅動,原因有二:
        a. 查看Driver的源代碼可以看到,如果采用此種方式,會導致驅動程序注冊兩次,也就是在內存中會有兩個Driver對象;
        b. 程序依賴mysql的api,脫離mysql的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。
        推薦方式:Class.forName("com.mysql.jdbc.Driver");
        采用此種方式不會導致驅動對象在內存中重復出現,并且采用此種方式,程序僅僅只需要一個字符串,不需要依賴具體的驅動,使程序的靈活性更高。同樣,在開發中也不建議采用具體的驅動類型指向getConnection方法返回的Connection對象。

 

3. JDBC常用API

 

        JDBC程序中的Connection對象用于代表數據庫的連接,Connection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過Connection對象完成的。這個對象常用的方法有:

  1. createStatement();    //創建向數據庫發送sql的statement對象  
  2. prepareStatement(sql); //創建向數據庫發送預編譯sql的prepareStatement對象。這個更常用  
  3. prepareCall(sql); //創建執行存儲過程中的callableStatement對象  
  4. setAutoCommit(boolean autoCommit); //設置事物是否自動提交  
  5. commit(); //在鏈接上提交事物  
  6. rollback(); //在此鏈接上回滾事物 

  JDBC程序中的Statement對象用于向數據庫發送sql語句,Statement對象常用方法有:

 

  1. executeQuery(String sql);   //用于向數據庫發送查詢語句  
  2. executeUpdate(String sql);  //用于向數據庫發送insert,update或delete語句  
  3. execute(String sql);  //用于向數據庫發送任意sql語句  
  4. addBatch(String sql);  //把多條sql語句放到一個批處理中  
  5. executeBath();  //向數據庫發送一批sql語句執行  

 JDBC程序中的ResultSet對象用于代表sql語句的執行結果。ResultSet封裝執行結果時,采用的類似于表格的方式。ResultSet對象維護了一個指向表格數據行的游標,初始的時候,游標在第一行之前,調用該對象的next()方法,可以使游標指向具體的數據行,進行調用方法獲取該行的數據。由于ResultSet用于封裝執行結果,所以該對象提供的都是用于獲取數據的get方法:

 

  1. //獲取任意類型的數據  
  2. getObject(int index);  //index表示列號  
  3. getObject(String columnName);  //columnName表示列名,建議用這種方法,更好維護  
  4. //獲取指定類型的數據(int,String,Date等)  
  5. getString(int index);  
  6. getString(String columnName);  

 ResultSet除了提供get方法以外,還提供了對結果集進行滾動的方法:

 

  1. next();   //移動到下一行  
  2. previous();  //移動到前一行  
  3. absolute(int row);  //移動到指定行  
  4. beforeFirst();  //移動到resultSet的最前面  
  5. afterLast(); //移動到resultSet的最后面  

    為了確保資源釋放代碼能運行,資源釋放代碼一定要寫在finally語句中。

4. JDBC實現增刪改查

 

        JDBC技術主要是同數據庫打交道,那么免不了增刪改查,由上面的代碼可以看出,在對數據庫進行操作之前需要先建立連接,在操作之后都需要釋放資源,所以我們可以把這兩部分內容抽取出來,寫到JDBCUtils類中來實現:

public class JDBCUtils {  
      
    private static String driver = null;  
    private static String url = null;  
    private static String username = null;  
    private static String password = null;  
      
    //加載驅動  
    static{  
        try {  
                        //db.properties是一個配置文件,里面有連接數據庫所需要的信息  
            InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");  
            Properties prop = new Properties();   
            prop.load(in);//加載配置文件  
            driver = prop.getProperty("driver");  
            url = prop.getProperty("url");  
            username = prop.getProperty("username");  
            password = prop.getProperty("password");  
              
            Class.forName(driver);//加載驅動  
              
        } catch (Exception e) {  
            throw new ExceptionInInitializerError(e);  
        }  
    }  
      
    public static Connection getConnection() throws SQLException{  
                  
        return DriverManager.getConnection(url, username, password);//獲得connection  
    }  
      
    public static void release(Connection conn, Statement st, ResultSet rs){ //釋放資源  
          
        if(rs != null){  
            try{  
                rs.close();  
            }catch(Exception e) {  
                e.printStackTrace();  
            }  
            rs = null;  
        }  
        if(st != null){  
            try{  
                st.close();  
            }catch(Exception e) {  
                e.printStackTrace();  
            }  
            st = null;  
        }  
          
        if(conn != null){  
            try{  
                conn.close();  
            }catch(Exception e) {  
                e.printStackTrace();  
            }  
            conn = null;  
        }     
    }  
  
}  

  db.properties文件:

  1. driver=com.mysql.jdbc.Driver  
  2. url=jdbc:mysql://localhost:3306/day14  
  3. username=root  
  4. password=root  

 這樣我們就完成了數據庫的連接和資源的釋放工具類。下面我們開始編寫對數據庫的增刪改查:

//使用JDBC對數據庫的增刪改查  
public class Demo2 {  
      
    private Connection conn = null;  
    private Statement st = null;  
    private ResultSet rs = null;  
      
    @Test  
    public void insert(){  
      
        try {  
            conn = JDBCUtils.getConnection();  
            st = conn.createStatement();  
            String sql = "insert into user(id,name,password,email,birthday) values(3,'ww','123','ww@sina.com','1982-06-14');";  
            int num = st.executeUpdate(sql);//返回的是該sql語句會影響數據庫的幾行  
            if(num > 0){  
                System.out.println(num);  
                System.out.println("插入成功");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally {  
            JDBCUtils.release(conn, st, rs);  
        }  
          
    }  
      
    @Test  
    public void delete(){  
              
        try {  
            conn = JDBCUtils.getConnection();  
            st = conn.createStatement();  
            String sql = "delete from user where password='123'";  
            int num = st.executeUpdate(sql);  
            if(num > 0){  
                System.out.println(num);  
                System.out.println("刪除成功");  
            }  
        } catch (Exception e) {  
  
            e.printStackTrace();  
        }finally {  
            JDBCUtils.release(conn, st, rs);  
        }  
          
    }  
      
    @Test  
    public void update(){  
                  
        try {  
            conn = JDBCUtils.getConnection();  
            st = conn.createStatement();  
            String sql = "update user set password='456' where name='ww'";  
            int num = st.executeUpdate(sql);  
            if(num > 0) {  
                System.out.println(num);  
                System.out.println("修改成功");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally {  
            JDBCUtils.release(conn, st, rs);  
        }  
          
    }  
      
    @Test  
    public void find(){  
                  
        try {  
            conn = JDBCUtils.getConnection();  
            st = conn.createStatement();  
            String sql = "select id,name,password,email,birthday from user";  
            rs = st.executeQuery(sql);  
            while(rs.next()){  
                int id = (Integer)rs.getObject("id");  
                String name = (String)rs.getObject("name");  
                String password = (String)rs.getObject("password");  
                String email = (String)rs.getObject("email");  
                Date birthday = (Date)rs.getObject("birthday");  
                System.out.println(id+","+name+","+password+","+email+","+birthday);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally {  
            JDBCUtils.release(conn, st, rs);  
        }  
          
    }  
  
}  

  JDBC基本知識點就介紹到這,后面再介紹一些高級點的應用,如有錯誤之處,歡迎留言指正~

  1. DriverManager.registerDriver(new Driver());  
  2. DriverManager.getConnection(URL, user, password);  

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()