什麼是JDBC?
Java語言訪問數據庫的一種規範,是一套API
JDBC (Java Database Connectivity) API,即Java數據庫編程接口,是一組標準的Java語言中的接口和類,使用這些接口和類,Java客戶端程序可以訪問各種不同類型的數據庫。比如建立數據庫連接、執行SQL語句進行數據的存取操作。
JDBC規範採用接口和實現分離的思想設計了Java數據庫編程的框架。接口包含在java.sql及javax.sql包中,其中java.sql屬於JavaSE,javax.sql屬於JavaEE。這些接口的實現類叫做數據庫驅動程序,由數據庫的廠商或其它的廠商或個人提供。
爲了使客戶端程序獨立於特定的數據庫驅動程序,JDBC規範建議開發者使用基於接口的編程方式,即儘量使應用僅依賴java.sql及javax.sql中的接口和類。
JDBC驅動程序:
什麼是JDBC驅動程序?
這些是各個數據庫廠家根據JDBC的規範製作的JDBC實現類
JDBC驅動程序的四種類型:
1. 第一種類型的驅動程序的實現是通過將JDBC的調用全部委託給其它編程接口來實現的,比如ODBC。這種類型的驅動程序需要安裝本地代碼庫,即依賴於本地的程序,所以便攜性較差。比如JDBC-ODBC橋驅動程序
2. 第二種類型的驅動程序的實現是部分基於Java語言的。即該驅動程序一部分是用Java語言編寫,其它部分委託本地的數據庫的客戶端代碼來實現。同類型1的驅動一樣,該類型的驅動程序也依賴本地的程序,所以便攜性較差
3. 第三種類型的驅動程序的實現是全部基於JAVA語言的。該類型的驅動程序通常由某個中間件服務器提供,這樣客戶端程序可以使用數據庫無關的協議和中間件服務器進行通信,中間件服務器再將客戶端的JDBC調用轉發給數據庫進行處理
4. 第四種類型的驅動程序的實現是全部基於JAVA語言的。該類型的驅動程序中包含了特定數據庫的訪問協議,使得客戶端可以直接和數據庫進行通信
JDBC類結構:
DriverManager
Driver Driver
Connection Connection
Statement Statement
Resultset Resultset
DriverManager:這個是一個實現類,它是一個工廠類,用來生產Driver對象的
Driver:這是驅動程序對象的接口,它指向一個實實在在的數據庫驅動程序對象,那麼這個數據庫驅動程序對象是從哪裏來的呢?
DriverManager工廠中有個方法:getDriver(String URL),通過這個方法可以得到驅動程序對象,這個方法是在各個數據庫廠商按JDBC規範設計的數據庫驅動程序包裏的類中靜態實現的,也就是在靜態塊中
Connection:這個接口可以制向一個數據庫連接對象,那麼如何得到這個連接對象呢?
是通過DriverManager工廠中的getConnection(String URL)方法得到的
Statement:用於執行靜態的SQL語句的接口,通過Connection中的createStatement方法得到的
Resultset:用於指向結果集對象的接口,結果集對象是通過Statement中的execute等方法得到的
JAVA使用JDBC訪問數據庫的步驟:
1. 得到數據庫驅動程序
2. 創建數據庫連接
3. 執行SQL語句
4. 得到結果集
5. 對結果集做相應的處理(增,刪,改,查)
6. 關閉資源:這裏釋放的是DB中的資源
設置classpath:
1. 在java文件中起的包名一定要是工程基目錄下的子目錄,classpath:基目錄
2. .jar包,需要將這個.jar包的路徑包括這個文件的全名添加到classpath中來
Oracle連接字符串的書寫格式:
“oracle:jdbc:thin:@ip:1521: 數據庫名”,”數據庫用戶名”,”數據庫密碼”
簡單的例子:
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)
{
}
}
}
}
常用數據庫的驅動程序及JDBC URL:
Oracle數據庫:
驅動程序包名:ojdbc14.jar
驅動類的名字:oracle.jdbc.driver.OracleDriver
JDBC URL:jdbc:oracle:thin:@dbip:port:databasename
說明:驅動程序包名有可能會變
JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部分需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
dbip –爲數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
port –爲數據庫的監聽端口,需要看安裝時的配置,缺省爲1521。
databasename –爲數據庫的SID,通常爲全局數據庫的名字。
舉例如果要訪問本地的數據庫allandb,端口1521,那麼URL寫法如下:
jdbc:oracle:thin:@localhost:1521:allandb 下載地址如下:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
SQL Server數據庫
驅動程序包名:msbase.jar mssqlserver.jar msutil.jar
驅動類的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename
說明:驅動程序包名有可能會變
JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
dbip –爲數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
port –爲數據庫的監聽端口,需要看安裝時的配置,缺省爲1433。
databasename –數據庫的名字。
舉例如果要訪問本地的數據庫allandb,端口1433,那麼URL寫法如下:
jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb
下載地址:http://www.microsoft.com/downloads/details.aspx
MySQL數據庫
驅動程序包名:mysql-connector-java-3.1.11-bin.jar
驅動類的名字:com.mysql.jdbc.Driver
JDBC URL:jdbc:mysql://dbip:port/databasename
說明:驅動程序包名有可能會變
JDBC URL中黑色字體部分必須原封不動的保留,爲該驅動識別的URL格式。紅色字體部需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
dbip –爲數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
port –爲數據庫的監聽端口,需要看安裝時的配置,缺省爲3306。
databasename –數據庫的名字。
舉例如果要訪問本地的數據庫allandb,端口1433,那麼URL寫法如下:
jdbc:mysql://localhost:3306/allandb
下載地址:http://dev.mysql.com/downloads/connector/j/
Access數據庫
驅動程序包名:該驅動程序包含在JavaSE中,不需要額外安裝。
驅動類的名字:sun.jdbc.odbc.JdbcOdbcDriver
JDBC URL:jdbc:odbc:datasourcename
說明:該驅動只能工作在Windows系統中,首先需要在操作系統中建立一個可以訪問Access數據庫的本地數據源(ODBC),如果名字爲allandb,那麼URL寫法如下:
jdbc:odbc:allandb
PreparedStatement接口:
預編譯的sql語句對象
作用: 解決了書寫sql語句時一些特殊的字符與sql保留字符衝突的問題,非常方便
/**
*知識點:
*PreparedStatement接口及方法的使用
*程序目標:
*java文件:
*PreparedInsert.java:連接數據庫,插入一條數據
*JdbcUtil.java:實現一個工具類,功能:1.連接數據庫 2.關閉資源
*/
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){
}
}
}
數據庫的增刪改查的例子:
/**
*知識點:
*JDBC+SQL+ORACLE
*程序目標:
*UserDao.java:實現了數據庫的增刪改查
*JdbcUtil.java:工具類,有連庫和關閉資源的方法
*/
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:工具類,連接數據庫,關閉資源
*sqlExecutor.java:命令行參數輸入sql語句,並執行該語句
*/
package moudule1.fangfa;
import java.sql.*;
import moudule1.com.*;
public class sqlExecutor{
public static void main(String[] args){
Connection con=null;
Statement st=null;
<span style="color: black; font-family: Ve