欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別分析

 更新時間:2023年04月07日 08:54:38   作者:努力奮斗的JAVA小余  
這篇文章主要介紹了JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別,Java Database Connectivity,它是代表一組獨立于任何數(shù)據(jù)庫管理系統(tǒng)(DBMS)的API,聲明在java.sql與javax.sql包中,是SUN(現(xiàn)在Oracle)提供的一組接口規(guī)范

一、概述

JDBC:Java Database Connectivity,它是代表一組獨立于任何數(shù)據(jù)庫管理系統(tǒng)(DBMS)的API,聲明在java.sql與javax.sql包中,是SUN(現(xiàn)在Oracle)提供的一組接口規(guī)范。由各個數(shù)據(jù)庫廠商來提供實現(xiàn)類,這些實現(xiàn)類的集合構成了數(shù)據(jù)庫驅動jar。

二、JDBC使用步驟

注冊驅動

三部曲:

  • 將DBMS數(shù)據(jù)庫管理軟件的驅動jar拷貝到項目的libs目錄中
  • 把驅動jar添加到項目的build path中
  • 將驅動類加載到內存中

注意:MySQL 8是這個Class.forName(“com.mysql.cj.jdbc.Driver”)不寫cj會報錯;MySQL 5是這個Class.forName(“com.mysql.jdbc.Driver”);

獲取Connection連接對象

Connection conn = DriverManager.getConnection(url,username,password);

url:jdbc:mysql://localhost:3306/數(shù)據(jù)庫名?參數(shù)名=參數(shù)值

執(zhí)行sql并處理結果

  • 編寫sql
  • 創(chuàng)建Statement或PreparedStatement對象
  • 執(zhí)行sql 增刪改:調用executeUpate方法;查詢:調用executeQuery方法

處理結果

  • 增刪改:返回的是整數(shù)值即影響的行數(shù)
  • 查詢:返回ResultSet結果,需要使用next()和getXxx()結合進行遍歷

釋放連接

示例代碼1:增、刪、改

public class TestJDBC {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		//1、注冊驅動
		//(1)方式一:Class.forName("驅動類的全名稱")
		Class.forName("com.mysql.cj.jdbc.Driver");
//		(2)創(chuàng)建驅動類的對象
//		new com.mysql.cj.jdbc.Driver();//硬編碼
		//(3)通過DriverManager注冊驅動
//		DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());//硬編碼
		//2、獲取連接,連接數(shù)據(jù)庫
        //TCP/IP協(xié)議編程,需要服務器的IP地址和端口號
		//mysql的url格式:jdbc協(xié)議:子協(xié)議://主機名:端口號/要連接的數(shù)據(jù)庫名
		String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";//其中test是數(shù)據(jù)庫名;serverTimezone是時區(qū)不設置可能報錯
		String user = "root";
		String password = "123456";
		Connection conn = DriverManager.getConnection(url, user, password);
		//3、執(zhí)行sql
		//添加一個部門到數(shù)據(jù)庫的t_department表中
		//(1)編寫sql
		String sql = "insert into t_department values(null,'計算部2','計算鈔票2')";
		/*
		 * 回憶:	TCP/IP程序時
		 * Socket代表連接
		 * socket.getOutputStream()來發(fā)送數(shù)據(jù),
		 * socket.getInputStream()來接收數(shù)據(jù)
		 * 
		 * 可以把Connection比喻成Socket
		 *    把Statement比喻成OutputStream
		 */
		//(2)獲取Statement對象
		Statement st = conn.createStatement();
		//(3)執(zhí)行sql
		int len = st.executeUpdate(sql);
		//(4)處理結果
		System.out.println(len>0?"成功":"失敗");
		//4、關閉
		st.close();
		conn.close();
	}
}

示例代碼2:查詢

public class TestSelect {
	public static void main(String[] args) throws Exception{
		// 1、注冊驅動
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2、連接數(shù)據(jù)庫
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "123456");
		// 3、執(zhí)行sql
		String sql = "SELECT * FROM t_department";
		Statement st = conn.createStatement();
		ResultSet rs = st.executeQuery(sql);//ResultSet看成InputStream
		while(rs.next()){//next()表示是否還有下一行
			Object did = rs.getObject(1);//獲取第n列的值
			Object dname = rs.getObject(2);
			Object desc = rs.getObject(3);
			/*
			int did = rs.getInt("did");//也可以根據(jù)列名稱,并且可以按照數(shù)據(jù)類型獲取
			String dname = rs.getString("dname");
			String desc = rs.getString("description");
			 */
			System.out.println(did +"\t" + dname + "\t"+ desc);
		}
		// 4、關閉
		rs.close();
		st.close();
		conn.close();
	}
}

三、使用PreparedStatement處理CRUD

1、為什么使用PreparedStatement處理CRUD?

Statement的問題:

sql拼接

	String sql = "insert into t_employee(ename,tel,gender,salary) values('" + ename + "','" + tel + "','" + gender + "'," + salary +")";
		Statement st = conn.createStatement();
		int len = st.executeUpdate(sql);

sql注入

	String sql = "SELECT * FROM t_employee where ename='" + ename + "'";
		//如果我此時從鍵盤輸入ename值的時候,輸入:張三' or '1'= '1
		//結果會把所有數(shù)據(jù)都查詢出來
		Statement st = conn.createStatement();
		ResultSet rs = st.executeQuery(sql);

無法處理blob等類型的數(shù)據(jù)

String sql = "insert into user(username,photo) values('chailinyan', 圖片字節(jié)流)";
//此時photo是blob類型的數(shù)據(jù)時,無法在sql中直接拼接

2、PreparedStatement解決問題

避免sql拼接

		String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";
		PreparedStatement pst = conn.prepareStatement(sql);//這里要傳帶?的sql,然后mysql端就會對這個sql進行預編譯
		//根據(jù)字段來設置?的具體值
		/*pst.setString(1, ename);
		pst.setString(2, tel);
		pst.setString(3, gender);
		pst.setDouble(4, salary);*/
		pst.setObject(1, ename);
		pst.setObject(2, tel);
		pst.setObject(3, gender);
		pst.setObject(4, salary);
		int len = pst.executeUpdate();//此處不能傳sql
		System.out.println(len);

不會有sql注入

String sql = "SELECT * FROM t_employee where ename=?";
		//即使輸入'張三' or '1'= '1'也沒問題
		PreparedStatement pst = conn.prepareStatement(sql);
		//中間加入設置?的值
		pst.setObject(1, ename);
		ResultSet rs = pst.executeQuery();

處理blob類型的數(shù)據(jù)

		String sql = "insert into user(username,photo) values(?,?)";
		PreparedStatement pst = conn.prepareStatement(sql);
		//設置?的值
		pst.setObject(1, "xiaoyu");
		FileInputStream fis = new FileInputStream("D:/QMDownload/img/15.jpg");
		pst.setBlob(2, fis);
		int len = pst.executeUpdate();
		System.out.println(len>0?"成功":"失敗");

注意兩個問題:

①my.ini關于上傳的字節(jié)流文件有大小限制,可以在my.ini中配置變量

?    max_allowed_packet=16M

②每一種blob有各自大小限制:

tinyblob:255字節(jié)、blob:65k、mediumblob:16M、longblob:4G

到此這篇關于JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別分析的文章就介紹到這了,更多相關JDBC基本操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)簡單的抽牌游戲

    Java實現(xiàn)簡單的抽牌游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的抽牌游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Java鎖競爭導致sql慢日志原因分析

    Java鎖競爭導致sql慢日志原因分析

    這篇文章主要介紹了Java鎖競爭導致sql慢的日志原因分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • 一篇文章帶你入門java變量與類型

    一篇文章帶你入門java變量與類型

    這篇文章主要給大家介紹了關于Java基本知識點之變量和數(shù)據(jù)類型的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • SpringBoot中使用Swagger的超簡單方法

    SpringBoot中使用Swagger的超簡單方法

    大家一致認為springBoot使用swagger太麻煩了,每次都需要編寫config,今天小編告訴大家一種超簡單配置方法,教大家如何整合swagger,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java的設計模式編程中迪米特法則的應用示例

    Java的設計模式編程中迪米特法則的應用示例

    這篇文章主要介紹了Java的設計模式編程中迪米特法則的應用示例,迪米特法則中主張創(chuàng)建和使用弱耦合的類,需要的朋友可以參考下
    2016-02-02
  • 基于SpringBoot使用MyBatis插件的問題

    基于SpringBoot使用MyBatis插件的問題

    MyBatis-Plus并不能為我們解決所有問題,例如一些復雜的SQL,多表聯(lián)查,我們就需要自己去編寫代碼和SQL語句,我們該如何快速的解決這個問題呢,這個時候可以使用MyBatisX插件,今天小編給大家?guī)砹薙pringBoot使用MyBatis插件問題,感興趣的朋友一起看看吧
    2022-03-03
  • Java 帶參數(shù)與帶返回值的方法的定義和調用

    Java 帶參數(shù)與帶返回值的方法的定義和調用

    在java中,方法就是用來完成解決某件事情或實現(xiàn)某個功能的辦法。方法實現(xiàn)的過程中,會包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計算數(shù)值,這篇文章我們來探究一下帶參數(shù)與帶返回值的方法的定義和調用
    2022-04-04
  • java播放聲音類和一個簡單示例

    java播放聲音類和一個簡單示例

    這篇文章主要介紹了一個java播放聲音類和一個java播放聲音的應用程序,應用程序可以單次播放聲音、循環(huán)播放聲音,需要的朋友可以參考下
    2014-03-03
  • spring boot使用logback實現(xiàn)多環(huán)境日志配置詳解

    spring boot使用logback實現(xiàn)多環(huán)境日志配置詳解

    這篇文章主要介紹了spring boot使用logback實現(xiàn)多環(huán)境日志配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java Scanner類的使用示例

    Java Scanner類的使用示例

    這篇文章主要介紹了Java Scanner類的使用示例,幫助大家更好的理解和學習java,感興趣的朋友可以了解下
    2020-08-08

最新評論