一.介紹
JDBC(Java DataBase Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應用程序,同時,JDBC也是個商標名。
有了JDBC,向各種關系數(shù)據(jù)發(fā)送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為訪問Mysql數(shù)據(jù)庫專門寫一個程序,為訪問Oracle數(shù)據(jù)庫又專門寫一個程序,或為訪問Informix數(shù)據(jù)庫又編寫另一個程序等等,程序員只需用JDBC API寫一個程序就夠了,它可向相應數(shù)據(jù)庫發(fā)送SQL調(diào)用。同時,將Java語言和JDBC結(jié)合起來使程序員不必為不同的平臺編寫不同的應用程序,只須寫一遍程序就可以讓它在任何平臺上運行,這也是Java語言“編寫一次,處處運行”的優(yōu)勢。
二.知識點介紹
1、JDBC的連接模式?
2、JDBC常用類
3、JDBC操作流程
三.上課對應視頻的說明文檔
1、JDBC的連接模式
(1)加載驅(qū)動(對應數(shù)據(jù)庫,下載對應的jar包)
(2)MySQL數(shù)據(jù)庫 Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost:3306/myDB?user=
soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB為數(shù)據(jù)庫名
Connection conn= DriverManager.getConnection(url);
(3)Oracle8/8i/9i數(shù)據(jù)庫(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數(shù)據(jù)庫的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2、JDBC常用類
(1)DriverManager:
DriverManager是JDBC的管理層,作用于用戶和驅(qū)動程序之間。
DriverManager跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫和相應的驅(qū)動程序之間建立連接。
DriverManager處理驅(qū)動程序登陸時間限制、跟蹤消息的顯示等。
(2)Connection:
Connection與特定數(shù)據(jù)庫的連接(會話),在連接上下文中執(zhí)行 SQL 語句并返回結(jié)果。
DriverManager的getConnection()方法建立在JDBC URL中定義的數(shù)據(jù)庫Connection連接上:
Connection con= DriverManager.getConnection(url,login,password);
(3)Statement
用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象。
一般情況下使用connection.createStatement()方法可以得到Statement實例。
A、三種Statement對象:
Statement:用于執(zhí)行不帶參數(shù)的簡單SQL 語句
PreparedStatement:用于執(zhí)行帶或不帶IN參數(shù)的預編譯SQL語句
CallableStatement:用于執(zhí)行對數(shù)據(jù)庫現(xiàn)有存儲過程的調(diào)用。
B、常用的Statement方法:
execute():運行語句,返回是否有結(jié)果集。(有:true,無:false)
executeQuerty():運行查詢語句,返回ResultSet結(jié)果集。
executeUpdate():運行更新操作,返回更新的行數(shù)。
C、PreparedStatement
第一步:通過連接獲得PreparedStatement對象,用占位符(?)的sql語句構(gòu)造。
PrepareStatement pstm=con.prepareStatement(“select * from userinfo where id=?”);
第二步:設置參數(shù)
pstm.setString(1,”ganbin”);
第三步:執(zhí)行SQL語句
rs=pstm.excuteQuery();
(4)ResultSet
Statement執(zhí)行SQL語句時返回ResultSet結(jié)果集。
ResultSet提供的檢索不同類型字段的方法,常用的有:
getString():獲得在數(shù)據(jù)庫里是varchar、char等數(shù)據(jù)類型的對象。
getFloat():獲得在數(shù)據(jù)庫里是Float類型的對象。
getDate():獲得在數(shù)據(jù)庫里面是Date類型的數(shù)據(jù)。
getBoolean():獲得在數(shù)據(jù)庫里面是Boolean類型的數(shù)據(jù)。
getObject():在Sql中無對應類型,獲得序列化對象。
3、JDBC操作流程

(1) 加載對應數(shù)據(jù)庫(mysql,db2,oracle,sqlServer等)的驅(qū)動jar包
(2) 加載驅(qū)動:Class.forName("");
(3) 創(chuàng)建連接:
Connection?DriverManger.getConnection(url,name,password);
(4) 創(chuàng)建 SQL語句
A、 增(insert into)、刪(delete),修改(update)
B、 查詢(select)
(5) 加載SQL
PreparedStatement?conn.prepareStatement(sql);
(6) 補齊SQL中的通配符
ps.setString(1, "男");//setString()表示字段類型,1表示位置,"男"表示對應的值
ps.setInt(2, 20);
(7) 執(zhí)行SQL
A、 有返回值
ResultSet rs=ps.executeQuery();
B、 沒有返回值
ps.executeUpdate();
案例:
(1) 加載驅(qū)動創(chuàng)建鏈接
代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/* JDBC連接
* (1)導入驅(qū)動jar包,不同數(shù)據(jù)庫有不同jar包
* (2)代碼介入
* */
public class JdbcLj {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;//得到數(shù)據(jù)庫連接對象
try {
Class.forName("org.gjt.mm.mysql.Driver"); // 加載驅(qū)動
System.out.println("加載驅(qū)動");
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ww", "root", "root");// 獲取連接
System.out.println("獲取連接");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(2) 完成增加操作
代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/* JDBC連接
* (1)導入驅(qū)動jar包,不同數(shù)據(jù)庫有不同jar包
* (2)代碼介入
* */
public class JdbcLj {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;//得到數(shù)據(jù)庫連接對象
try {
Class.forName("org.gjt.mm.mysql.Driver"); // 加載驅(qū)動
System.out.println("加載驅(qū)動");
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ww", "root", "root");// 獲取連接
System.out.println("獲取連接");
//表的操作,都是SQL
String sql="insert into students(name,xh,sex,age) values(?,?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);//加載SQL
ps.setString(1, "李四");
ps.setInt(2, 0001);
ps.setString(3, "女");
ps.setInt(4,19);
//PreparedStatement 加載SQL語句,可以操作有參的SQL
//Statement 操作無參
ps.executeUpdate();//執(zhí)行查詢語句并接收結(jié)果
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(3) 完成修改操作
代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/* JDBC連接
* (1)導入驅(qū)動jar包,不同數(shù)據(jù)庫有不同jar包
* (2)代碼介入
* */
public class JdbcLj {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;//得到數(shù)據(jù)庫連接對象
try {
Class.forName("org.gjt.mm.mysql.Driver"); // 加載驅(qū)動
System.out.println("加載驅(qū)動");
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ww", "root", "root");// 獲取連接
System.out.println("獲取連接");
//表的操作,都是SQL
String sql="update students name=? where id=?";
PreparedStatement ps=conn.prepareStatement(sql);//加載SQL
ps.setString(1, "李四");
ps.setInt(2, 1);
//PreparedStatement 加載SQL語句,可以操作有參的SQL
//Statement 操作無參
ps.executeUpdate();//執(zhí)行查詢語句并接收結(jié)果
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(4) 完成刪除操作
代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/* JDBC連接
* (1)導入驅(qū)動jar包,不同數(shù)據(jù)庫有不同jar包
* (2)代碼介入
* */
public class JdbcLj {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;//得到數(shù)據(jù)庫連接對象
try {
Class.forName("org.gjt.mm.mysql.Driver"); // 加載驅(qū)動
System.out.println("加載驅(qū)動");
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ww", "root", "root");// 獲取連接
System.out.println("獲取連接");
//表的操作,都是SQL
String sql="delete from students where id=? ";
PreparedStatement ps=conn.prepareStatement(sql);//加載SQL
ps.setInt(1, 9);
//PreparedStatement 加載SQL語句,可以操作有參的SQL
//Statement 操作無參
ps.executeUpdate();//執(zhí)行查詢語句并接收結(jié)果
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(5) 完成查詢操作
代碼示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/* JDBC連接
* (1)導入驅(qū)動jar包,不同數(shù)據(jù)庫有不同jar包
* (2)代碼介入
* */
public class JdbcLj {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;//得到數(shù)據(jù)庫連接對象
try {
Class.forName("org.gjt.mm.mysql.Driver"); // 加載驅(qū)動
System.out.println("加載驅(qū)動");
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/ww", "root", "root");// 獲取連接
System.out.println("獲取連接");
//表的操作,都是SQL
String sql="select * from students where sex=? and age>?";
PreparedStatement ps=conn.prepareStatement(sql);//加載SQL
ps.setString(1, "男");
ps.setInt(2, 20);
//PreparedStatement 加載SQL語句,可以操作有參的SQL
//Statement 操作無參
ResultSet rs=ps.executeQuery();//執(zhí)行查詢語句并接收結(jié)果
while(rs.next()){
System.out.println(rs.getString("name")+"? "+rs.getInt("age"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}