Java訪問數據庫Mysql


一、概述

  本文主要介紹Java接連數據庫的基本方法和步驟,並對其中的幾個要點進行簡要說明。

二、數據庫訪問步驟

  在Java中連接數據庫進行的訪問主要有以下幾個步驟:

  1. 加載數據庫驅動
  2. 注冊數據庫驅動
  3. 建立到數據庫的連接
  4. 訪問數據庫

  首先,要調用Class.ForName()加載並注冊mysql驅動程序類,加載驅動程序驅動類后,需要注冊驅動程序類的一個實例,DriverManager類負責管理驅動程序,這個類提供了registerDriver()方法來注冊驅動程序類的實例,並且我們不需要親自調用這個方法,因為Drive接口的驅動程序類都包含了靜態代碼塊,在這個代碼塊中會調用registerDriver()方法來注冊自身的一個實例。

  然后調用DriverManager類的getConnection方法建立到數據庫的連接。在建立連接后,需要對數據庫進行訪問。在java.sql包中定義了三個接口:Statement、PrepareStatement和CallableStatement,分別對應不同的調用方式。其中:  

  Statement:用於執行靜態的sql語句。

  PrepareStatement:從Statement接口繼承而來,它的對象表示一條預編譯過的sql語句,通過調用Connection對象的prepareStatement()方法得到。

  CallableStatement:用於執行sql存儲過程,該接口從PrepareStatement接口繼承而來,通過調用Connection對象的prepareCall()方法得到CallableStatement對象。

  完整的訪問數據庫代碼如下:

package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateDB
{
    public static void main(String[] args)
    {
        String url="jdbc:mysql://localhost:3306";
        String user="root";
        String password="281889";
        String driverclass="com.mysql.jdbc.Driver";//JDBC類名
        try
        {
            //加載JDBC驅動,當這個類被加載時,類加載器會執行該類的靜態代碼塊從而注冊驅動程序的一個實例
            Class.forName(driverclass);  
            
            //建立數據庫的連接
            Connection conn=DriverManager.getConnection(url,user,password);
            
            //訪問數據庫
            Statement stmt=conn.createStatement();
            stmt.execute("use information_schema");
            int i=0;
            ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
            while(rs1.next())  //判斷是否含有student數據庫
                i++;
            if(i==0)
                stmt.executeUpdate("create database student");
            
            stmt.executeUpdate("use student");
            
            int j=0;
            ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
            while(rs2.next()) //判斷數據庫中是否含有stuinfo表
                j++;
            if(j==0)
                stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");
            
            stmt.addBatch("insert into stuinfo values(0420,'阿斌',25,'男')");
            stmt.executeBatch();
            stmt.close();
            stmt=null;
            conn.close();
            conn=null;
        } 
        catch (ClassNotFoundException e)
        {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        } 
        catch (SQLException e)
        {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    }
}

 三、要點說明

  1、execute(String sql)、executeUpdate(String sql)和executeQuery(String sql)的區別:

  execute:執行返回多個結果集的sql語句。

  Returns:true if the first result is a ResultSet object

       false if it is an update count or there are no results

  executeUpdate:執行類似insert、update或者delete的sql語句。

  Returns:(1) the row count for SQL Data Manipulation Language (DML) statements

        (2) 0 for SQL statements that return nothing     

   executeQuery:執行指定的sql語句,返回一個ResultSet對象,用於查看執行的結果。

   Returns:a ResultSet object that contains the data produced by the given query;

  ps:executeQuery返回的ResultSet永遠都不會為null

  2、ResultSet對象

  ResultSet對象以邏輯表格的形式封裝了執行數據庫操作的結果集,其對象維護了一個指向當前數據行的游標,初始狀態下游標在第一行之前,可以通過next()方法移動游標到下一行。

  3、Statement 與 PreparedStatement的區別(摘錄自http://www.jb51.net/article/58343.htm):

1.語法不同

Statement只支持靜態編譯,SQL語句是寫死的。

PreparedStatement支持預編譯,用?號來占位。

2.效率不同

Statement每次都要發送一條SQL語句,不支持緩存,執行效率低。

PreparedStatement支持預編譯,緩存在數據庫,只需發送參數,執行效率快。

3.安全性不同

Statement容易被注入。

注入:狡猾的分子可以編寫特殊的SQL語句來入侵數據庫。

例如:要查詢某個用戶的信息

一般情況:SELECT * FROM user_list where username=xxx and password=xxx;(這里的xxx本應為用戶填寫自己的用戶名和密碼)

注入情況:SELECT * FROM user_list where username='abc' or 1=1 -- password=xxx;

這樣1=1恆等,而且在password前加上了“--”號,后面的內容成為了注釋不被執行。也就是說,這樣就能不用密碼地查詢所有的用戶信息。

PreparedStatement,因為規定了SQL語句中的參數,所以可以防止注入。

4、判斷mysql中是否已存在某數據庫:

  stmt.execute("use information_schema");
   int i=0;
   ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
   while(rs1.next())  //判斷是否含有student數據庫
      i++;
   if(i==0)
     stmt.executeUpdate("create database student");

  5、判斷數據庫中是否已存在某表:

  int j=0;
   ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
   while(rs2.next()) //判斷數據庫中是否含有stuinfo表
      j++;
   if(j==0)
      stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM