創作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦。
JDBC是Java程序連接數據庫的一個重要接口,是搭建Java程序與數據庫連接的重要橋樑,描述了一個訪問關係型數據庫的標準類庫,並且爲數據庫廠商提供了一個標準的體系結構。JDBC允許用戶訪問任何形式的表格數據,執行流程:1.連接數據源 2.爲數據庫傳遞查詢和更新指令 3.處理數據庫響應並返回的結果。
如何對常用的SQL語句還不熟悉那就先跳轉到這裏吧!!史上超強最常用SQL語句大全
JDBC常用的接口和類庫
1.DriverManager:驅動JDBC驅動的服務類
主要功能是註冊驅動、獲取Connection對象
1. 註冊驅動:告訴程序該使用哪一個數據庫驅動jar
//註冊與給定的驅動程序 DriverManager
static void registerDriver(Driver driver) ;
//寫代碼使用
Class.forName("com.mysql.jdbc.Driver");
2. 獲取數據庫連接:
方法:static Connection getConnection(String url, String user, String password)
參數:
url:指定連接的路徑
user:用戶名
password:密碼
語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱,user,password
細節:如果連接的是本機mysql服務器,並且mysql服務默認端口是3306,則url可以簡寫爲:jdbc:mysql:///數據庫名稱
//獲取數據庫連接對象Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");
2.Connection:數據庫連接對象
每一個Connection代表一個物理連接會話,要訪問數據庫,必須先獲得數據庫連接。
常用方法:
1. 獲取執行sql 的對象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2. 管理事務:
開啓事務:setAutoCommit(boolean autoCommit) :調用該方法設置參數爲false,即開啓事務
提交事務:commit()
回滾事務:rollback()
3. Statement:執行sql的對象
Statemet是一個執行sql語句的工具接口,該對象既可以執行DDL、DCL語句,也可以執行DML語句,當執行SQL查詢時,它會返回查詢到的結果集。
主要方法
1. boolean execute(String sql) :該方法可以執行任意的sql語句。瞭解即可
2. int executeUpdate(String sql) :執行DML(insert、update、delete)語句、DDL(create,alter、drop)語句
返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功
返回值>0的則執行成功,反之,則失敗。
3. ResultSet executeQuery(String sql) :執行DQL(select)語句
該方法只能用於執行查詢語句,並返回查詢結果對應的ResultSet對象。
4. PreparedStatement:執行sql的對象
PreparedStatement是一個預編譯的Statement對象,PreparedStatement是Statement的子接口,它允許數據庫預編譯SQL語句,以後每次只需改變SQL命令參數,避免數據庫每次都編譯SQL語句,因此性能更好。預編譯SQL解決了SQL注入的問題, 預編譯的SQL:參數使用?作爲佔位符。
常用方法
boolean execute():執行此PreparedStatement對象中的SQL語句,該語句可以是任何類型的SQL語句。
int executeUpdate() :執行此PreparedStatement對象中的SQL語句,它必須是一個SQL數據操縱語言(DML)語句,比如
INSERT
,UPDATE
或DELETE
; 或不返回任何內容的SQL語句,例如DDL語句。ResultSet executeQuery() :在此PreparedStatement對象中執行SQL查詢,並返回
ResultSet
查詢生成的對象。
由於PreparedStatement是Statement的子接口,所以他們的常用方法很一致。PreparedStatement主要是預編譯SQL,解決了SQL注入的問題,提高性能。
5. ResultSet:結果集對象,封裝查詢結果
ResultSet是一個結果對象,該對象包含查詢結果的方法,ResultSet可以通過索引或列名類獲得列中的數據。
常用方法
boolean next(): 遊標向下移動一行,判斷當前行是否是最後一行末尾(是否有數據),如果是,則返回false,如果不是則返回true
void beforeFirst():將ResultSet的記錄指針定位到首行之前,初始位置。
boolean absolute(int row):將結果集的記錄指針移動到第row行。
getXxx(參數):獲取數據
Xxx:代表數據類型 如: int getInt() , String getString()
參數:
1. int:代表列的編號,從1開始 如: getString(1)
2. String:代表列名稱。 如: getDouble("balance")
使用JDBC的步驟
靜態編譯SQL步驟:使用Statement
1. 導入驅動jar包 mysql-connector-java-5.1.37-bin.jar 1.複製mysql-connector-java-5.1.37-bin.jar到項目的libs目錄下 2.右鍵-->Add As Library 2. 註冊驅動 3. 獲取數據庫連接對象 Connection 4. 定義sql 5. 獲取執行sql語句的對象 Statement 6. 執行sql,接受返回結果 7. 處理結果 8. 釋放資源 |
動態編譯SQL步驟:使用PreparedStatement對象
1. 導入驅動jar包 mysql-connector-java-5.1.37-bin.jar 2. 註冊驅動 3. 獲取數據庫連接對象 Connection 4. 定義sql * 注意:sql的參數使用?作爲佔位符。 如:select * from user where username = ? and password = ?; 5. 獲取執行sql語句的對象 PreparedStatement Connection.prepareStatement(String sql) 6. 給?賦值: * 方法: setXxx(參數1,參數2) * 參數1:?的位置編號 從1 開始 * 參數2:?的值 7. 執行sql,接受返回結果,不需要傳遞sql語句 8. 處理結果 9. 釋放資源 |
public static void main(String[]args)throwsException{
//1.導入驅動jar包
//2.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//3.獲取數據庫連接對象Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");
//4.定義SQL
Stringsql="update emp set salary=8001 WHERE id=1001;";
//5.執行SQL語句對象Statement
Statementstmt=conn.createStatement();
//6.執行SQL,接收返回結果
intcount=stmt.executeUpdate(sql);
//7.處理結果
System.out.println(count);
//8.釋放資源
stmt.close();
conn.close();
}
登錄練習
JDBC工具類
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* JDBC工具類
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的讀取,只需要讀取一次即可拿到這些值。使用靜態代碼塊
*/
static{
//讀取資源文件,獲取值。
try {
//1. 創建Properties集合類。
Properties pro = new Properties();
//獲取src路徑下的文件的方式--->ClassLoader 類加載器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
//2. 加載文件
pro.load(new FileReader(path));
//3. 獲取數據,賦值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. 註冊驅動
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 獲取連接
* @return 連接對象
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void close(Statement stmt,Connection conn){
if( stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if( rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
登錄代碼
public class DemoLogin {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入賬號:");
String userName = sc.nextLine();
System.out.println("請輸入密碼:");
String password = sc.nextLine();
boolean flag = new DemoLogin().login2(userName, password);
if (flag) {
System.out.println("登錄成功!");
} else {
System.out.println("賬號或密碼錯誤!");
}
}
public boolean login(String name, String password) {
//賬號密碼正確性校驗
if (name == null || password == null) {
return false;
}
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConn();
statement = conn.createStatement();
String sql = "SELECT*FROM login WHERE username='" + name + "'andpassword='" + password + "';";
System.out.println(sql);
resultSet = statement.executeQuery(sql);
return resultSet.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCUtils.close(conn, statement, resultSet);
}
return false;
}
//使用PreparedStatement傳參
public boolean login2(String name, String password) {
//賬號密碼正確性校驗
if (name == null || password == null) {
return false;
}
Connection conn = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConn();
String sql = "SELECT*FROM login WHERE username=? and password=?;";
//預編譯SQL
statement = conn.prepareStatement(sql);
System.out.println(sql);
//給參數賦值
statement.setString(1, name);
statement.setString(2, password);
//執行查詢
resultSet = statement.executeQuery();
return resultSet.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCUtils.close(conn, statement, resultSet);
}
return false;
}
}