1、JDBC概述
JDBC(Java DataBase Connectivity,java資料庫連接配接)是一種用于執行SQL語句的Java API。JDBC是Java通路資料庫的标準規範,可以為不同的關系型資料庫提供統一通路,它由一組用Java語言編寫的接口(大部分)和類組成。
資料庫驅動:JDBC連接配接資料庫需要驅動,驅動是兩個裝置要進行通信,必須滿足一定通信資料格式,資料格式由裝置提供商規定,裝置提供商為裝置提供驅動軟體,通過軟體可以與該裝置進行通信。如mysql的驅動mysql-connector-java-5.1.37-bin.jar
實際上,資料庫驅動指的是由廠商提供的實作了JDBC規範的Java程式的集合
JDBC中最常用的有一個核心類和三個核心接口:
DriverManager類:用于實作資料庫連接配接,具體為實作注冊驅動和建立資料庫連接配接對象
Connection接口:用于表示與資料庫的連接配接對象,從DriverManager對象擷取
Statement接口:用于表示SQL語句的對象,從Connection對象擷取
ResultSet接口:用于表示查詢操作的結果集,當對Statement對象執行查詢操作時,會傳回該接口的對象
2、JDBC原生實作連接配接資料庫并執行增删改查的操作步驟如下:
a、使用DriverManager類注冊Mysql驅動
此操作由DriverManager.registerDriver(new com.mysql.jdbc.Driver());實作,但是實際上,com.mysql.jdbc.Driver類中的靜态代碼塊中包含如下語句:java.sql.DriverManager.registerDriver(new Driver);,這段代碼說明隻要這個com.mysql.jdbc.Driver類被用到,DriverManager類就會自動被注冊為mysql驅動,故隻需要加載該類即可:Class.forName("com.mysql.jdbc.Driver");
b、調用DriverManager類中的靜态方法public static Connection getConnection(String url,String user, String password) throws SQLException()來擷取連接配接對象,這個方法的實參分别代表的是指定需要連接配接的資料庫的位址,該資料庫的使用者名,該資料庫的密碼。
c、擷取到連接配接對象後,通過Connection接口的createStatement()方法來擷取Statement對象,此處不關心實作類,Statement對象可用于執行SQL語句
d、使用Statement對象執行executeQuery(String sql);或者executeUpdate(String sql);方法來進行增删改查操作
e、如果d步驟中執行的操作為查詢,那麼該方法的傳回值是ResutSet對象,擷取到該對象後,使用該對象調用next()方法,該方法的傳回值為布爾類型,再在循環中調用get方法擷取對應的值即可。如果d步驟執行的操作為增删改,那麼傳回值為int類型的資料,代表實際影響到的行數
f、操作完成後需要關閉Connection、Statement、ResultSet資源
上述操作中的a、b、f步驟可以被抽取到工具類中,同時,擷取資料庫連接配接的三要素,和實際加載的jdbc驅動的的類名,這四個參數可以放入properties檔案中,實作配置化。該工具類隻需要提供擷取資料庫的連接配接傳回資料連接配接,并提供關閉資源的方法即可。工具類代碼和調用的測試類代碼如下:
package jdbc.practice_01;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* JDBC連接配接資料庫和關閉資源工具類
* @author limeng
*
*/
public class JDBCUtils {
private static String drivername;
private static String url;
private static String user;
private static String password;
/**
* 通過靜态代碼塊,初始化資料庫連接配接配置資料,并且注冊資料庫驅動
*/
static {
try {
Properties pr = new Properties();
//通過讀取Properties檔案給屬性指派,即每次使用該工具類都會讀取最新配置進行連接配接
pr.load(new FileInputStream(new File("jdbc_config.properties")));
drivername = pr.getProperty("drivername");
url = pr.getProperty("url");
user = pr.getProperty("user");
password = pr.getProperty("password");
Class.forName(drivername);
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
throw new RuntimeException("擷取資料庫連接配接異常,請檢查配置資料");
}
}
/**
* 擷取資料庫連接配接對象
* @return
*/
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("擷取資料庫連接配接異常,請檢查配置資料");
}
return con;
}
/**
* 關閉JDBC相關資源
* @param con
* @param sta
* @param rs
*/
public static void closeResource(Connection con,Statement sta,ResultSet rs) {
try {
if(con!=null) {
con.close();
}
if(sta!=null) {
sta.close();
}
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package jdbc.practice_01;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 通過JDBC工具類進行增删改查操作
* @author Limeng
*
*/
public class JDBCDemoByUtils {
private static String sqlStatement;
public static void main(String[] args) throws Exception {
//通過工具類擷取資料庫連接配接對象
Connection con = JDBCUtils.getConnection();
//通過連接配接建立資料庫執行對象
Statement sta = con.createStatement();
//為查詢的結果集準備接收對象
ResultSet rs = null;
//查詢
sqlStatement = "SELECT * FROM DEPT";
qry(sta,sqlStatement,rs);
//增加
sqlStatement = "INSERT INTO DEPT VALUES('50','TEST','CHINA')";
System.out.println("插入執行結果:"+update(sta,sqlStatement));
//更新
sqlStatement = "UPDATE DEPT SET loc='SHAOXING' WHERE DEPTNO = '50'";
System.out.println("更新執行結果:"+update(sta,sqlStatement));
//删除
sqlStatement = "DELETE FROM DEPT WHERE DEPTNO = '50'";
System.out.println("删除執行結果:"+update(sta,sqlStatement));
JDBCUtils.closeResource(con, sta, rs);
}
/**
* 查詢
* @param sta
* @param sql
* @param rs
* @throws SQLException
*/
private static void qry(Statement sta,String sql,ResultSet rs) throws SQLException {
rs = sta.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getObject("deptno"));
}
}
/**
* 增删改
* @param sta
* @param sql
* @return
* @throws SQLException
*/
private static int update(Statement sta,String sql) throws SQLException {
return sta.executeUpdate(sql);
}
}
3、PreparedStatement預處理對象
該接口為Statement的子接口,用于表示預編譯的SQL語句的對象,SQL語句已預編譯并存儲在
PreparedStatement
對象中。 然後可以使用該對象多次有效地執行此語句。
接口特點:
性能高
會把sql語句先編譯
能過濾掉使用者輸入的關鍵字。
使用該接口的具體步驟如下:
a、通過Connection接口實作類對象擷取到預處理接口實作類的對象(用接口接收,不關心實作類),此處擷取預處理對象是需要提供已經使用占位符處理後的SQL語句
b、調用Set方法對占位符的實際數值進行設定,其中占位符的下标由1開始,并非0(看代碼)
c、調用方法
int executeUpdate(); --執行insert update delete語句.
ResultSet executeQuery(); --執行select語句.
boolean execute(); --執行select傳回true 執行其他的語句傳回false.、
下面的PreparedStatementPra類通過預處理對象實作增删改查操作:
package jdbc.practice_01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 通過JDBC工具類和PreparedStatement實作增删改查(PreparedStatement類為Statement的子類)
* @author limeng
*
*/
public class PreparedStatementPra {
private static String sqlStatement;
public static void main(String[] args) throws SQLException {
//通過工具類擷取資料庫連接配接對象
Connection con = JDBCUtils.getConnection();
//通過連接配接建立資料庫執行對象
PreparedStatement ps = null;
//為查詢的結果集準備接收對象
ResultSet rs = null;
//查詢
sqlStatement = "SELECT * FROM DEPT WHERE DEPTNO = ?";
ps = con.prepareStatement(sqlStatement);
ps.setObject(1, "10");
qry(ps,rs);
//增加
sqlStatement = "INSERT INTO DEPT VALUES(?,?,?)";
ps = con.prepareStatement(sqlStatement);
ps.setObject(1, "50");
ps.setObject(2, "TEST");
ps.setObject(3, "SHAOXING");
System.out.println("插入執行結果:"+update(ps,sqlStatement));
//更新
sqlStatement = "UPDATE DEPT SET loc=? WHERE DEPTNO = ?";
ps = con.prepareStatement(sqlStatement);
ps.setObject(1, "SHAOXING");
ps.setObject(2, "50");
System.out.println("更新執行結果:"+update(ps,sqlStatement));
//删除
sqlStatement = "DELETE FROM DEPT WHERE DEPTNO = ?";
ps = con.prepareStatement(sqlStatement);
ps.setObject(1, "50");
System.out.println("删除執行結果:"+update(ps,sqlStatement));
JDBCUtils.closeResource(con, ps, rs);
}
/**
* 查詢
* @param sta
* @param sql
* @param rs
* @throws SQLException
*/
private static void qry(PreparedStatement sta,ResultSet rs) throws SQLException {
rs = sta.executeQuery();
while(rs.next()) {
System.out.println(rs.getObject("deptno"));
}
}
/**
* 增删改
* @param sta
* @param sql
* @return
* @throws SQLException
*/
private static int update(PreparedStatement sta,String sql) throws SQLException {
return sta.executeUpdate();
}
}