圖解java【JDBC】小白也能弄懂

目錄

JDBC簡介

工作原理:

工作過程:

JDBC驅動與連接

JDBC驅動

連接JDBC驅動

1.下載特定數據庫的JDBCjar包

2.加載並註冊數據庫驅動

3.連接驅動

JDBC常見API

JDBC數據查詢

一般查詢

1.接口詳解

2.一般查詢示例程序

JDBC數據維護

數據維護一般流程

更新數據

插入數據

1.插入單條記錄

2.批量插入數據

刪除數據

拓展

JDBC中設置Date類型參數

1.手動設置時間

2.自動獲取本地時間


JDBC簡介

JDBC:JDBC在應用程序與數據庫之間起到了一個橋樑作用,當應用程序使用JDBC訪問特定的數據庫時,只需要通過不同的數據庫驅動與其對應的數據庫進行連接,連接後即可對該數據庫進行相應的操作。

工作原理:

工作過程:

JDBC驅動與連接

JDBC驅動

由JDBC驅動直接訪問數據庫

優點:純java,快,跨平臺

缺點:訪問不同的數據庫需要下載專用的JDBC驅動

連接JDBC驅動

1.下載特定數據庫的JDBCjar包

到使用的數據庫的官網上下載,本文會提供mysql-connector-java-5.1.39-bin.jar jar包

2.加載並註冊數據庫驅動

方法一:寫代碼(只用於一次程序,不推薦)

//Class.forName("Driver全名");
Class.forName("com.mysql.jdbc.Driver");//以mysql數據庫爲例

方法二:將jar包複製到java運行環境jre文件中(適用於JDBC4.0以後)

(1)找到java文件,將jar包放到jdk下,jre下,lib下,ext中。

(2)找到java文件,將jar包放到jre下,lib下,ext中。

注意:如果使用第三方軟件編程(如:eclipse)則一定要複製jar包到公共jre中

3.連接驅動

(1)getConnection方法詳解

DriverManager.getConnection(String url,String user,String password);
/*url:定位符,找到本機數據庫
*jdbc:數據庫服務名://主機名:端口號:/創建的數據庫名*/
//user:連接數據庫時登錄的用戶名
//password:連接數據庫時的登錄密碼
//例:
    //1、加載並註冊數據庫驅動。
	Class.forName("com.mysql.jdbc.Driver");
    //2、通過DriverManager獲取數據庫連接。
	Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");

JDBC常見API

1.Driver:Driver接口是所有JDBC驅動程序必須實現的接口,用於加載驅動。一次程序的運行中,只需要加載一次。

2.DriverManager:使用該類註冊驅動

3.Connection:連接數據庫的對象

4.Statement:執行靜態的SQL語句,並返回一個結果對象(繁瑣,不安全)

5.ResultSet:結果集對象(封裝了查詢結果的數據)

6.PreparedStatement:Statement的子接口,用於執行預編譯的SQL語句。(通過Connection進行獲取)

JDBC數據查詢

一般查詢

1.接口詳解

一般查詢需要JDBC API中的Statement接口與ResultSet接口

Statement接口:

(1)由Connection產生;

(2)Statement對象用於將SQL語句發送到數據庫中;

(3)在JDBC API 中通常有3種Statement對象,它們都可以作爲在給定連接上執行SQL語句的容器。

3種Statement對象
Statement 用於無參數的查詢

PreparedStatement

(預編譯SQL語句)

用於帶參數的查詢,當SQL語句多次運行,使用該對象可提高運行效率。
CallableStatement 用於調用存儲過程

(4)Statement與PreparedStatement對象的創建

//使用Connection對象的createStatement方法,創建Statement對象(conn爲Connection對象)
Statement stmt=conn.createStatement();
//使用Connection對象的prepareStatement方法,創建PreparedStatement對象
PreparedStatement pstmt =conn.prepareStatement("要執行的SQL語句");

(5)Statement對象的方法

//適用於執行select語句
public ResultSet executeQuery()throws SQLException;
//適用於執行insert,update,delete等數據修改和維護語句
public 行數 executeUpdate(String sql)throws SQLException;

 

ResultSet接口:

(1)ResultSet對象用於包含符合SQL語句中條件的所有記錄,它的組織結構類似於一張臨時表。

(2)ResultSet接口自帶遊標,只有使用next()方法纔可使遊標轉到ResultSet對象中的第一行。

(3)getXxx()方法,用於返回當前行中指定列索引columnNumber或列名字columnName的數據。

/*語法:
XXX getXXX (int columnNuber);
XXX getXXX (String columnName);*/
//例:
int id =resultSet.getInt("id");
String name=resultSet.getString("name");

(4)close()用於關閉ResultSet對象

 

2.一般查詢示例程序

(1)一般查詢執行步驟

(2)一般查詢執行程序

	public static void main(String[] args) {
		try {
			//1.註冊驅動(已將JDBC Driver jar包放入ext文件中可不寫)
			Class.forName("com.mysql.jdbc.Driver");
			//2.獲取數據庫連接對象
			//如果對象是主機,並端口號是默認值:3306,url可簡寫:"jdbc:mysql:///jdbc"
			Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
			//3.獲取SQL語句的執行對象
                        //此處使用Statement接口的子接口PreparedStatement更安全
			PreparedStatement pstmt=conn.prepareStatement("select*from users");
			//4.執行SQL語句,調用executeQuery查詢方法
			ResultSet resultSet=pstmt.executeQuery();
			//5.處理結果集
			while(resultSet.next()){//next方法返回值爲boolean類型
				int id =resultSet.getInt("id");//getXxx方法:可以根據列號與列名獲取
				String name=resultSet.getString("name");
				String password=resultSet.getString(3);
				String email=resultSet.getString(4);
				
				System.out.println(id+" "+name+" "+password+" "+email);
			}
			//6.關閉流釋放資源
			conn.close();
			pstmt.close();
			resultSet.close();
		} catch (Exception e) {
			
			e.printStackTrace();
		}
	}

JDBC數據維護

會使用到的Statement的方法

//適用於執行insert,update,delete等數據修改和維護語句
public 行數 executeUpdate(String sql)throws SQLException;

數據維護一般流程

更新數據

例1:
public static void main(String[] args) throws Exception {
		//1.註冊驅動
	    //Class.forName("com.mysql.jdbc.Driver");
		//2.獲取數據庫連接
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
		//3.獲取SQL語句的執行者
		PreparedStatement pstmt=conn.prepareStatement("UPDATE users SET NAME='tc' WHERE id=?");
		//給佔位符進行填充數據
		pstmt.setObject(1, "1");//
		//4.執行SQL語句
		int count=pstmt.executeUpdate();//返回值是int數組
		//5.處理結果集
		if(count>0){
			System.out.println(count+"行受到影響");
		}else{
			System.out.println("更改失敗");
		}
		//6.釋放資源
		conn.close();
		pstmt.close();
	}
例2:
String sql="update users set email='[email protected]' where name='ert'";

插入數據

1.插入單條記錄

請回顧Statement接口詳解

例1:
public static void main(String[] args) {
		try{
			//1.註冊驅動
			//Class.forName("com.mysql.jdbc.Driver");
			//2.獲取數據庫連接
			Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
			//3.準備insert SQL語句
			String sql="INSERT INTO users(name,password,email,birthday) VALUES(?,?,?,?)";
			//4.設置參數,注意所使用的參數的數據類型
			PreparedStatement pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, "cm");pstmt.setString(2, "1234556");
			pstmt.setString(3, "[email protected]");
			SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//設置日期格式
			java.util.Date date = sdf.parse( "2002-5-6" );//設置日期參數
			long lg = date.getTime(); // 日期 轉 時間戳
			pstmt.setDate(4, new java.sql.Date( lg ));
			//5.執行SQL語句
			int count=pstmt.executeUpdate();
			//6.判斷執行結果,返回值大於1則成功插入一條數據
			if(count>0){
				System.out.println("記錄成功");
			}else{
				System.out.println("記錄失敗");
			}
			conn.close();
			pstmt.close();
		}catch(Exception e){
			e.printStackTrace();
		}

	}
例2:

public static void main(String[] args) {
		try{
			//1.註冊驅動
			//Class.forName("com.mysql.jdbc.Driver");
			//2.獲取數據庫連接
			Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
			//3.準備insert SQL語句
			String sql="insert into users(name,password,email,birthday) values('wm','123456','[email protected]','1984-05-17');";
			PreparedStatement pstmt=conn.prepareStatement(sql);
			SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );//設置日期格式
			java.util.Date date = sdf.parse( "2002-5-6" );//設置日期參數
			long lg = date.getTime(); // 日期 轉 時間戳
			pstmt.setDate(4, new java.sql.Date( lg ));
			//4.執行SQL語句
			int count=pstmt.executeUpdate();
			//5.判斷執行結果,返回值大於1則成功插入一條數據
			if(count>0){
				System.out.println("記錄成功");
			}else{
				System.out.println("記錄失敗");
			}
            //6.關閉接口
			conn.close();
			pstmt.close();
		}catch(Exception e){
			e.printStackTrace();
		}

	}

2.批量插入數據

採用批量提交的方式,使用addBatch(String sql)方法添加批量操作SQL語句,然後用executeBath()方法對所提交的多個SQL語句進行批量操作。

注:批量操作只適用於DML(增刪改操作)

Satement對象的executeBath()方法

public int[] executeBatch() throws SQLException;//該語句不能執行具有返回結果集的SQL語句
//例:
public static void main(String[] args) throws Exception {
				//1.加載驅動
				//Class.forName("com.mysql.jdbc.Driver");
				//2.獲取數據庫連接
				Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
				//3.準備3個插入SQL語句
				String sql="INSERT INTO users(name,password,email)VALUES(?,?,?)";
				//4.
				PreparedStatement pstmt=conn.prepareStatement(sql);
				//5.設置參數
				pstmt.setString(1, "jdh");
				pstmt.setString(2, "3452");
				pstmt.setString(3, "[email protected]");
				//6.添加一次預定義參數
				pstmt.addBatch();
				//7.設置參數
				pstmt.setString(1, "jdsh");
				pstmt.setString(2, "34322");
				pstmt.setString(3, "[email protected]");
				//8.再添加一次預定義參數
				pstmt.addBatch();
				//9.批量執行預定義SQL
				int []count=pstmt.executeBatch();
				//10.判斷執行結果,返回值大於1則成功插入一條數據
				if(count[0]>0){
					System.out.println("記錄成功");
				}else{
					System.out.println("記錄失敗");
				}
				conn.close();
				pstmt.close();
				
	}

刪除數據

例1:
public static void main(String[] args) throws Exception {
		//1.註冊驅動
		//Class.forName("com.mysql.jdbc.Driver");
		//2.獲取數據庫連接
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345");
		//3.準備insert SQL語句
		String sql="DELETE FROM users WHERE id=?";
		//4.使用Connection接口的prepareStatement方法創建PreparedStatement對象
			//將SQL語句發送到數據庫中
		PreparedStatement ps=conn.prepareStatement(sql);
		//5.設置參數
		ps.setString(1,"1");
		//6.//執行SQL語句
		int ret=ps.executeUpdate();
		//7.//判斷執行結果
		if(ret>0){
			System.out.println("記錄刪除成功!!");
		}else{
			System.out.println("記錄刪除失敗!!");
		}
		//8.關閉Connection和PreparedStatement對象
		conn.close();
		ps.close();
	}
例2:
String sql="delete from users where name='tsa'";

拓展

JDBC中設置Date類型參數

1.手動設置時間

PreparedStatement 的 setDate 方法使用的是 java.sql.Date 類型的日期參數。

設置這種參數的方法,例子:

SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );//設置時間格式

java.util.Date date = sdf.parse( "2015-5-6 10:30:00" );//設置時間

long lg = date.getTime();    // 日期 轉 時間戳

PreparedStatement pst = conn.prepareStatement(sql);   // 創建 PreparedStatement 對象

ps.setDate( 3, new java.sql.Date( lg ) );

2.自動獲取本地時間

如果要在java代碼中向數據庫插入數據,可使用TimeStamp對象:創建java.util.Date對象,轉換成TimeStamp對象(java.sql.Date對象不能保存時間,utils的可以)插入數據庫(TimeStamp繼承自java.sql.Date,數據庫中自動轉換成Date)

(1)ps.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));

(2)java.sql.Date date = new java.sql.Date(System.currentTimeMillis());//獲取當前時間

java.util.Date date = new java.util.Date();    // 獲取一個Date對象

Timestamp timeStamp = new Timestamp(date.getTime()); 

   //   將日期時間轉換爲數據庫中的timestamp類型

pstmt.setTimestamp(2, timeStamp);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章