2013年1月23日 星期三

Java 使用JDBC存取MySQL


Java 存取資料庫是很常見的一種應用,紀錄一下Java存取 MySQL範例說明 ,這裏使用Connector/J來連接MySQL,所以要先下載Connector/J(http://www.mysql.com/downloads/connector/j/),下載完成後解壓縮,可以得要一個mysql-connector-java-5.1.17-bin.jar就是MySQL的JDBC-Driver了, 接著在Eclipse建立一個Java Project,簡易步驟如下:




建立Java Project

選好JRE版本後,按下Finish..建立完成

mysql-connector-java-5.1.17-bin.jar


Project建立完成後,再把mysql-connector-java-5.1.17-bin.jar加到Buildpath中


 mysql-connector-java-5.1.17-bin.jar,若不在專案內請選擇 Add External JARs..若事先將mysql-connector-java-5.1.17-bin.jar複製到專案內請選擇Add JARs..


 設定完成後,就可以開始實做了,在專案裡 new 一個Class,範例的名稱為mysql,程式碼和說明如下。


程式流程:
與建立DB連線->新增資料表->刪除資料表->新增資料表->新增一筆資料->查詢資料表->印出結果


public class mysql {
   public static void main(String[] args) throws Exception 
   { 
  
     //建立DB連線
     jdbcmysql db = new jdbcmysql(); 
     //建立Table
     db.createTable();
     //刪除Table
     db.dropTable();
     //建立Table
     db.createTable();
     //寫入溫度計資料
     db.insertTemperature("01010101", 28.0);
     //讀取溫度計資料
     db.SelectTemperature();

          }
}
//資料庫
//建立jdbc類別
class jdbcmysql { 
 
   //連接object 
   private Connection con = null; //Database objects 
   //執行,傳入之sql為完整字串 
   private Statement stat = null; 
   //結果集 
   private ResultSet rs = null; 

   private PreparedStatement pst = null; 
  
   //select:查詢溫度所有資料
   private String selectTemperature2DBSQL = "select * from temperature "; 
   
   //insert:執行sql,先利用?來做標示傳入變數之位置 
   private String insertTemperature2SQL = "insert into temperature(deviceid,time,value) " + 
      "VALUES (?,default,?)"; 
   
   //Drop table
   private String dropdbSQL = "DROP TABLE temperature "; 
   
   //Create table
   private String createdbSQL = "CREATE TABLE temperature (" + 
     "    deviceid     varchar(30) " + 
     "  , time    timestamp " + 
     "  , value  float(7,2))"; 
   
 
   public jdbcmysql() 
   { 
     try { 
        //註冊driver 
        Class.forName("com.mysql.jdbc.Driver"); 
        
        //取得connection
        //localhost是主機名,fcu_db是database名
        //useUnicode=true&characterEncoding=Big5使用的編碼 
        con = DriverManager.getConnection( 
        "jdbc:mysql://localhost/fcu_db?useUnicode=true&characterEncoding=Big5", 
        "root",""); 
      } catch(ClassNotFoundException e) { //sqlexception 
      System.out.println("DriverClassNotFound :"+e.toString()); 
   }catch(SQLException x) { 
      System.out.println("Exception :"+x.toString()); 
   } 
  
   } 

   //刪除Table, 
   public void dropTable() 
   { 
     try 
     { 
       stat = con.createStatement(); 
       stat.executeUpdate(dropdbSQL); 
     } 
     catch(SQLException e) 
     { 
       System.out.println("DropDB Exception :" + e.toString()); 
     } 
     finally 
     { 
       Close(); 
     } 
   }
   //建立table
   public void createTable() 
   { 
     try 
     { 
       stat = con.createStatement(); 
       stat.executeUpdate(createdbSQL); 
     } 
     catch(SQLException e) 
     { 
       System.out.println("CreateDB Exception :" + e.toString()); 
     } 
     finally 
     { 
       Close(); 
     } 
   } 

   //查詢溫度資料 
   public void SelectTemperature() 
   { 
     try 
     { 
       stat = con.createStatement(); 
       rs = stat.executeQuery(selectTemperature2DBSQL); 
       System.out.println("deviceid\t\ttime\t\tvalue"); 
       while(rs.next()) 
       { 
         System.out.println(rs.getInt("deviceid")+"\t\t"+ 
             rs.getString("time")+"\t\t"+rs.getString("value")); 
       } 
     } 
     catch(SQLException e) 
     { 
       System.out.println("DropDB Exception :" + e.toString()); 
     } 
     finally 
     { 
       Close(); 
     } 
   } 

   //新增溫度資料 
   public void insertTemperature( String id,double value) 
   { 
     try 
     { 
       pst = con.prepareStatement(insertTemperature2SQL); 
       
       pst.setString(1,id); 
       pst.setDouble(2, value); 
       pst.executeUpdate(); 
     } 
     catch(SQLException e) 
     { 
       System.out.println("InsertDB Exception :" + e.toString()); 
     } 
     finally 
     { 
       Close(); 
     } 
   } 

   //完整使用完資料庫後,記得要關閉所有Object 
   //否則在等待Timeout時,可能會有Connection poor的狀況 
   private void Close() 
   { 
     try 
     { 
       if(rs!=null) 
       { 
         rs.close(); 
         rs = null; 
       } 
       if(stat!=null) 
       { 
         stat.close(); 
         stat = null; 
       } 
       if(pst!=null) 
       { 
         pst.close(); 
         pst = null; 
       } 
     } 
     catch(SQLException e) 
     { 
       System.out.println("Close Exception :" + e.toString()); 
     } 
   } 
}

執行結果:
deviceid  time  value
1010101  2013-01-24 14:42:11.0  28.00

沒有留言:

張貼留言