什么是 JDBC? Java 語言訪問數(shù)據(jù)庫的一種規(guī)范,是一套 API JDBC (Java Database Connectivity) API,即 Java 數(shù)據(jù)庫編程接口,是一組標準的 Java 語言中的接口和類,使用這些接口和類,Java 客戶端程序可以訪問各種不同類型的數(shù)據(jù)庫。比如建立數(shù)據(jù)庫連接、執(zhí)行 SQL 語句進行數(shù)據(jù)的存取操作。
JDBC 規(guī)范采用接口和實現(xiàn)分離的思想設(shè)計了 Java 數(shù)據(jù)庫編程的框架。接口包含在 java.sql 及 javax.sql 包中,其中 java.sql 屬于 JavaSE,javax.sql 屬于 JavaEE。這些接口的實現(xiàn)類叫做數(shù)據(jù)庫驅(qū)動程序,由數(shù)據(jù)庫的廠商或其它的廠商或個人提供。
為了使客戶端程序獨立于特定的數(shù)據(jù)庫驅(qū)動程序,JDBC 規(guī)范建議開發(fā)者使用基于接口的編程方式,即盡量使應(yīng)用僅依賴 java.sql 及 javax.sql 中的接口和類。
http://wiki.jikexueyuan.com/project/java-special-topic/images/36.jpg" alt="" />
JDBC 驅(qū)動程序: 什么是 JDBC 驅(qū)動程序? 這些是各個數(shù)據(jù)庫廠家根據(jù) JDBC 的規(guī)范制作的 JDBC 實現(xiàn)類 JDBC 驅(qū)動程序的四種類型:
JDBC 類結(jié)構(gòu):
http://wiki.jikexueyuan.com/project/java-special-topic/images/37.jpg" alt="" />
DriverManager:這個是一個實現(xiàn)類,它是一個工廠類,用來生產(chǎn) Driver 對象的 這個類的結(jié)構(gòu)設(shè)計模式為工廠方法 Driver:這是驅(qū)動程序?qū)ο蟮慕涌?它指向一個實實在在的數(shù)據(jù)庫驅(qū)動程序?qū)ο?那么這個數(shù)據(jù)庫驅(qū)動程序?qū)ο笫菑哪睦飦淼哪? DriverManager 工廠中有個方法:getDriver(String URL),通過這個方法可以得到驅(qū)動程序?qū)ο?這個方法是在各個數(shù)據(jù)庫廠商按JDBC規(guī)范設(shè)計的數(shù)據(jù)庫驅(qū)動程序包里的類中靜態(tài)實現(xiàn)的,也就是在靜態(tài)塊中 Connection:這個接口可以制向一個數(shù)據(jù)庫連接對象,那么如何得到這個連接對象呢? 是通過 DriverManager 工廠中的 getConnection(String URL)方法得到的 Statement:用于執(zhí)行靜態(tài)的 SQL 語句的接口,通過 Connection 中的 createStatement 方法得到的 Resultset:用于指向結(jié)果集對象的接口,結(jié)果集對象是通過 Statement 中的 execute 等方法得到的
JAVA 使用 JDBC 訪問數(shù)據(jù)庫的步驟:
http://wiki.jikexueyuan.com/project/java-special-topic/images/38.jpg" alt="" />
設(shè)置 classpath:
簡單的例子:
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)
{
}
}
}
}
常用數(shù)據(jù)庫的驅(qū)動程序及 JDBC URL: Oracle 數(shù)據(jù)庫: 驅(qū)動程序包名:ojdbc14.jar 驅(qū)動類的名字:oracle.jdbc.driver.OracleDriver JDBC URL:jdbc:oracle:thin:@dbip:port:databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部分需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為1521。 databasename –為數(shù)據(jù)庫的 SID,通常為全局數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1521,那么 URL 寫法如下: jdbc:oracle:thin:@localhost:1521:allandb 下載地址如下: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
SQL Server 數(shù)據(jù)庫 驅(qū)動程序包名:msbase.jar mssqlserver.jar msutil.jar 驅(qū)動類的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為1433。 databasename –數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1433,那么 URL 寫法如下: jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb 下載地址:http://www.microsoft.com/downloads/details.aspx
MySQL 數(shù)據(jù)庫 驅(qū)動程序包名:mysql-connector-java-3.1.11-bin.jar 驅(qū)動類的名字:com.mysql.jdbc.Driver JDBC URL:jdbc:mysql://dbip:port/databasename 說明:驅(qū)動程序包名有可能會變 JDBC URL 中黑色字體部分必須原封不動的保留,為該驅(qū)動識別的 URL 格式。紅色字體部需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個部分含義如下: dbip –為數(shù)據(jù)庫服務(wù)器的 IP 地址,如果是本地可寫:localhost 或 127.0.0.1。 port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時的配置,缺省為3306。 databasename –數(shù)據(jù)庫的名字。 舉例如果要訪問本地的數(shù)據(jù)庫 allandb,端口1433,那么 URL 寫法如下: jdbc:mysql://localhost:3306/allandb 下載地址:http://dev.mysql.com/downloads/connector/j/
Access 數(shù)據(jù)庫 驅(qū)動程序包名:該驅(qū)動程序包含在 JavaSE 中,不需要額外安裝。 驅(qū)動類的名字:sun.jdbc.odbc.JdbcOdbcDriver JDBC URL:jdbc:odbc:datasourcename 說明:該驅(qū)動只能工作在 Windows 系統(tǒng)中,首先需要在操作系統(tǒng)中建立一個可以訪問Access 數(shù)據(jù)庫的本地數(shù)據(jù)源(ODBC),如果名字為 allandb,那么 URL 寫法如下: jdbc:odbc:allandb
PreparedStatement 接口: 預編譯的 sql 語句對象 作用: 解決了書寫 sql 語句時一些特殊的字符與 sql 保留字符沖突的問題,非常方便
/**
*知識點:
*PreparedStatement 接口及方法的使用
*程序目標:
*java文件:
*PreparedInsert.java:連接數(shù)據(jù)庫,插入一條數(shù)據(jù)
*JdbcUtil.java:實現(xiàn)一個工具類,功能:1.連接數(shù)據(jù)庫 2.關(guān)閉資源
*/
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){
}
}
}
數(shù)據(jù)庫的增刪改查的例子:
/**
*知識點:
*JDBC+SQL+ORACLE
*程序目標:
*UserDao.java:實現(xiàn)了數(shù)據(jù)庫的增刪改查
*JdbcUtil.java:工具類,有連庫和關(guān)閉資源的方法
*/
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:工具類,連接數(shù)據(jù)庫,關(guān)閉資源
*sqlExecutor.java:命令行參數(shù)輸入sql語句,并執(zhí)行該語句
*/
package moudule1.fangfa;
import java.sql.*;
import moudule1.com.*;
public class sqlExecutor{
public static void main(String[] args){
Connection con=null;
Statement st=null;
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
boolean str=st.execute(args[0]);
if(str){
ResultSet rs=st.getResultSet();
while(rs.next()){
System.out.println(rs.getInt("id")+":"+rs.getString("name"));
}
rs.close();
}else{
int row=st.getUpdateCount();
System.out.println(row);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st);
}
}
}