標籤:
一、概述
本文主要介紹Java接連資料庫的基本方法和步驟,並對其中的幾個要點進行簡要說明。
二、資料庫訪問步驟
在Java中串連資料庫進行的訪問主要有以下幾個步驟:
- 載入資料庫驅動
- 註冊資料庫驅動
- 建立到資料庫的串連
- 訪問資料庫
首先,要調用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))");
Java訪問資料庫Mysql