JDBC
概念
1.Java + DataBase + Connectivity:Java連接數據庫的技術。
2.是一套由Java代碼編寫開發數據庫應用程序的標準(接口)。
3.對程序員而言,JDBC就是一套訪問數據庫的API,能夠實現對數據庫的增刪改查。
4.對於數據庫廠商而言,JDBC是一套底層的實現接口的模型。
工作原理
1.Java application:應用程序
2.JDBC API:Java程序與各種不同的數據庫交互的標準接口。
1)Connection
2)Statement
3)ResultSet
3.JDBC Driver Manager:驅動程序管理器
JDBC API
1.DriverManager類:裝載驅動程序,併爲創建的數據庫連接提供的文件。
2.Connection接口:負責連接數據庫。
3.Statement接口:由Connection產生,負責執行SQL語句。
4.ResultSet接口:保存和處理Statement處理後的結果(查詢)
5.PreparedStatement接口:屬於Statement接口的子接口,負責執行SQL語句,性能和安全性比較高,可讀性維護性好。
JDBC操作步驟
1.加載驅動:calss.forName();將給定的jdbc驅動類加載到jvm;
2.建立數據庫連接:url數據庫服務地址(協議名稱+數據庫服務器IP:端口號/數據庫名稱),user,password
3.發送SQL語句
4.執行SQL語句
5.返回處理結果
6.釋放連接
常見包
1.PO:持久化對象,一個PO就是數據庫中的一條記錄
2.VO:視圖層對象,一個VO對象對應一個界面的所有數據
3.POJO:簡單的Java對象,只有私有屬性及公開的get、set方法,只能裝載對象。
4.DTO:數據傳輸對象,只傳需要的數據字段。
非託管資源
需要手動關閉的資源.close();
代碼實例
1.初始硬編碼
package com.hpe.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
* 存在的問題:
* 1.通過配置文件加載數據:違背開閉原則
* 2.頻繁打開關閉連接:數據庫連接池(c3p0,dbcp)
*/
public class TestJDBC {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.加載驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.創建連接
String url = "jdbc:mysql://localhost:3306/students";
String user = "root";
String password = "1234";
connection = DriverManager.getConnection(url, user, password);
// 3.編寫SQL語句
//String stuId = " '' OR 1=1 --";//存在SQL注入攻擊危險
int stuId = 1;
//String sql = "SELECT stuId,stuName FROM student WHERE stuId="+stuId;
String sql = "SELECT stuId,stuName,stuAge,stuAddress FROM student WHERE stuId=?";
// 將編寫好的SQL語句發送給數據庫服務器執行SQL語句
//Statement statement = connection.createStatement();
//ResultSet resultSet = statement.executeQuery(sql);
//System.out.println(resultSet.next());
// 4.預編譯對象,將編寫好的SQL語句發送給數據庫服務器
ps = connection.prepareStatement(sql);
// 5.填充佔位符,索引從1開始
ps.setInt(1, stuId);
// 6.執行SQL語句,通過預編譯對象調用executeQuery方法執行SQL語句
rs = ps.executeQuery();
// 7.判斷結果集中有沒有數據
if(rs.next()) {
// 8.獲取結果集中的數據
// 獲取具體數據getXXX(String columLable)或者getInt(int columnIndex)
int id = rs.getInt(1);
String stuName = rs.getString("stuName");
int age = rs.getInt("stuAge");
String address = rs.getString("stuAddress");
System.out.println("編號:"+id+"姓名:"+stuName+"地址:"+address+"年齡:"+age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 9.關閉連接:最早打開,最晚關閉
try {
rs.close();
ps.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.修正問題後的編碼
1)先寫連接數據庫的必要參數,單獨再src下新建的File類型文件,名爲db.properties,代碼如下:
jdbc.url=jdbc:mysql://localhost:3306/students?characterEncoding=utf-8
jdbc.user=root
jdbc.password=1234
jdbc.driver=com.mysql.jdbc.Driver
注意上面代碼變量與值之間不能加空格、不能加引號。
2)編寫獲取連接,釋放連接工具類:
package com.hpe.util;
/**
* 類描述:數據庫操作工具類
* 作者: chuliju
* 創建日期:2020年3月23日
* 修改人:
* 修改日期:
* 修改內容:
* 版本號: 1.0.0
*/
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
// 數據庫的url地址
private static String url;
// 用戶名
private static String user;
// 密碼
private static String password;
// 驅動
private static String driver;
// 加載驅動,只執行一次
static {
// 讀取配置文件
InputStream is = DBUtil.class.getResourceAsStream("/db.properties");
// 從輸入流中加載數據到集合中
Properties properties = new Properties();
try {
properties.load(is);
// 讀取用戶名、密碼、url地址,驅動
url = properties.getProperty("jdbc.url");
user = properties.getProperty("jdbc.user");
password = properties.getProperty("jdbc.password");
driver = properties.getProperty("jdbc.driver");
// 加載驅動
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法描述:獲取連接
* @return 連接對象
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 方法描述:釋放資源
* @param rs 結果集
* @param ps 預編譯對象
* @param conn 連接對象
*/
public static void releaseDB(ResultSet rs,PreparedStatement ps,
Connection conn) {
try {
if(rs != null) {
rs.close();
}
if(ps != null) {
ps.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}