個人主頁:?喜歡做夢
歡迎??👍點贊? ?關注? ??收藏? 💬評論
目錄
🌟一、什么是JDBC?
🌟二、JDBC編程的步驟
?使用步驟
?DriverManger
💫定義
💫DriverManger的主要功能
💫DriverManger的核心方法
💫使用
?DataSource
💥定義
💥使用?
💥代碼優化
?DriverManger和DataSource的區別
🌟一、什么是JDBC?
JDBC(Java Data Base Connectivity,Java數據庫連接)是Java程序和數據庫之間的橋梁,也就是Java語言操作數據庫的標準API,他提供了一套用于執行SQL語句的Java接口。JDBC的主要作用就是:與數據庫連接、發送SQL語句和處理數據庫執行結果。
🌟二、JDBC編程的步驟
?使用步驟
1.加載數據庫廠商的驅動包
2.建立連接,用戶名,密碼
3.創建Statement
4.發送要執行的SQL語句
5.接收返回結果并顯示(結果集,受影響的行數)
6.釋放資源和關閉連接
?DriverManger
💫定義
DriverManger是JDBC中的一個核心類,位于java.sql包下,他負責管理數據庫驅動程序,并為客戶端程序提供獲取數據庫連接的方法。它就像一個“驅動管理器”,協調不同數據庫驅動與應用程序之間的交互。
💫DriverManger的主要功能
- 注冊數據驅動:管理 已加載的數據;
- 獲取數據庫連接:根據連接信息(URL、用戶名、密碼)返回合適的Connection對象;
- 處理驅動程序之間的競爭:當多個驅動可以連接到同一URL時,選擇最合適的驅動。
URL表示統一資源定位符,是互聯網上用來指定一個位置、文件或者資源的標準方式。?
💫DriverManger的核心方法
getConnection()
核心方法 | 功能 |
getConnection(String url) | 通過URL獲取連接 |
getConnection(String url,String? user,String password) | 通過URL、用戶名和密碼獲取連接 |
getConnection(String url,Properties info) | 通過URL和包含連接屬性的Properties對象獲取連接 |
registerDriver(Driver driver) | 注冊驅動(一般不用手動調用) |
deregisterDriver(Driver driver) | 注銷驅動 |
gerDrivers() | 獲取所有已注冊的驅動 |
💫使用
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo1 {public static void main(String[] args) {//聲明數據庫操作的相關對象//數據庫連接對象Connection connection=null;//執行靜態SQL對象,但是SQL注入可能會出現一些問題Statement statement= null;//對靜態SQL的解決方法,預處理PreparedStatement preparedStatement=null;//查詢結果集對象ResultSet resultSet=null;try{//1,加載數據廠商提供的驅動:加載數據庫提供的jdbc驅動類,注冊到DriverManger中Class.forName("com.mysql.cj.jdbc.Driver");//2.獲取數據庫連接--相當于在數據庫中寫use java2;//數據庫連接URL格式:jdbc:mysql://服務器地址:端口/數據庫?參數名=值[&參數名=值]connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");//3.創建Statement對象:Statement用于像數據庫發送SQL語句statement = connection.createStatement();//4.定義SQL語句并執行System.out.println("請輸入學生姓名:");Scanner scanner =new Scanner(System.in);//接收用戶輸入String name=scanner.next();String sql="select id,name,class_id from students where name='"+name+"'";//5.執行SQL,獲取查詢結果//executeQuery用于執行select語句,返回結果集resultSet=statement.executeQuery(sql);//6.對結果集進行遍歷獲取結果//有返回true,沒有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//獲取第一列字段的值String Stuname=resultSet.getString(2);//獲取第二列字段的值long class_id=resultSet.getLong(3);//獲取第三列字段的值System.out.println(MessageFormat.format("學生id={0},姓名={1},班級={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}finally{// 釋放資源(從后往前釋放),關閉連接if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}}
}
?DataSource
💥定義
是Java數據庫連接(JDBC)的一個接口,用于獲取數據庫連接,可方便數據庫連接資源,實現連接池等高級功能。
💥使用?
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo {public static void main(String[] args) {//定義MySQL數據源對象MysqlDataSource mysqlDataSource=new MysqlDataSource();//MySQL驅動直連//數據庫連接mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8");mysqlDataSource.setUser("root");mysqlDataSource.setPassword("123456");//定義jdbc數據源對象DataSource dataSource=mysqlDataSource;Connection connection=null;//預處理PreparedStatement statement=null;//查詢結果集對象ResultSet resultSet=null;try{//1.獲取數據庫連接connection= dataSource.getConnection();//2.創建Statement對象:Statement用于像數據庫發送SQL語句//定義SQL語句并執行String sql="select id,name,class_id from students where name=?";statement = connection.prepareStatement(sql);//3.接收用戶輸入System.out.println("請輸入學生姓名:");Scanner scanner =new Scanner(System.in);String name=scanner.next();// 用真實值替換占位符statement.setString(1,name);//4..執行SQL,獲取查詢結果//executeQuery用于執行select語句,返回結果集resultSet=statement.executeQuery(sql);//5.對結果集進行遍歷獲取結果//有返回true,沒有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//獲取第一列字段的值String Stuname=resultSet.getString(2);//獲取第二列字段的值long class_id=resultSet.getLong(3);//獲取第三列字段的值System.out.println(MessageFormat.format("學生id={0},姓名={1},班級={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} finally{// 釋放資源(從后往前釋放),關閉連接if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}}
}
💥代碼優化
封裝
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;public class DB {//數據源private static DataSource dataSource=null;//數據庫連接串private static final String url="jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8";//用戶private static String user="root";//密碼private static String password="123456";//當類加載到JVM時,執行數據源的初始化static {MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(url);mysqlDataSource.setUser(user);mysqlDataSource.setPassword(password);dataSource = mysqlDataSource;}public static void close(ResultSet resultSet, Statement statement, Connection connection){if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}//構造方法私有化,防止new這個對象private DB(){};//獲取數據連接public static Connection getConnection() throws SQLException{return dataSource.getConnection();}
}
使用jdbc插入數據?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class Demo3{//插入數據public static void main(String[] args) {Connection connection=null;PreparedStatement statement=null;//插入數據,不用獲得結果集,要影響行數即可try{//獲取數據庫connection=DB.getConnection();//定義SQLString sql="insert into students(id,name,class_id) values(?,?,?)";//定義SQL預處理對象statement = connection.prepareStatement(sql);//接收用戶參數Scanner scanner = new Scanner(System.in);System.out.println("請輸入id");Long id= Long.valueOf(scanner.next());System.out.println("請輸入姓名");String name= scanner.next();System.out.println("請輸入班級");Long class_id= Long.valueOf(scanner.next());//用真實數據代替占位符statement.setLong(1,id);statement.setString(2,name);statement.setLong(3,class_id);//獲取結果,影響的行數//executeUpdate執行返回結果是一個整形,通常用于insert、delete、updateint row=statement.executeUpdate();//判斷if(row==1){System.out.println("插入成功");}else{System.out.println("插入失敗");}} catch (SQLException e) {e.printStackTrace();}finally {//關閉連接,釋放資源DB.close(null,statement,connection);}}}
?DriverManger和DataSource的區別
- DriverManger每次調用都會初始化一個新的連接,導致資源浪費;
- DataSource使用連接池的技術,一個連接可以重復使用,用DataDource替代DriverManger.getConnection()直連方式,更直接,靈活。