天天看點

JDBC(原生JDBC實作資料庫增删改查)

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();
	}
}