91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDBC的基本操作與Statement和PreparedStateMent使用區別是什么

發布時間:2023-04-07 11:00:25 來源:億速云 閱讀:144 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“JDBC的基本操作與Statement和PreparedStateMent使用區別是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“JDBC的基本操作與Statement和PreparedStateMent使用區別是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、概述

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

JDBC的基本操作與Statement和PreparedStateMent使用區別是什么

二、JDBC使用步驟

JDBC的基本操作與Statement和PreparedStateMent使用區別是什么

注冊驅動

三部曲:

  • 將DBMS數據庫管理軟件的驅動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/數據庫名?參數名=參數值

執行sql并處理結果

  • 編寫sql

  • 創建Statement或PreparedStatement對象

  • 執行sql 增刪改:調用executeUpate方法;查詢:調用executeQuery方法

處理結果

  • 增刪改:返回的是整數值即影響的行數

  • 查詢:返回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)創建驅動類的對象
//		new com.mysql.cj.jdbc.Driver();//硬編碼
		//(3)通過DriverManager注冊驅動
//		DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());//硬編碼
		//2、獲取連接,連接數據庫
        //TCP/IP協議編程,需要服務器的IP地址和端口號
		//mysql的url格式:jdbc協議:子協議://主機名:端口號/要連接的數據庫名
		String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";//其中test是數據庫名;serverTimezone是時區不設置可能報錯
		String user = "root";
		String password = "123456";
		Connection conn = DriverManager.getConnection(url, user, password);
		//3、執行sql
		//添加一個部門到數據庫的t_department表中
		//(1)編寫sql
		String sql = "insert into t_department values(null,'計算部2','計算鈔票2')";
		/*
		 * 回憶:	TCP/IP程序時
		 * Socket代表連接
		 * socket.getOutputStream()來發送數據,
		 * socket.getInputStream()來接收數據
		 * 
		 * 可以把Connection比喻成Socket
		 *    把Statement比喻成OutputStream
		 */
		//(2)獲取Statement對象
		Statement st = conn.createStatement();
		//(3)執行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、連接數據庫
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "123456");
		// 3、執行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");//也可以根據列名稱,并且可以按照數據類型獲取
			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
		//結果會把所有數據都查詢出來
		Statement st = conn.createStatement();
		ResultSet rs = st.executeQuery(sql);

無法處理blob等類型的數據

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

2、PreparedStatement解決問題

避免sql拼接

		String sql = "insert into t_employee(ename,tel,gender,salary) values(?,?,?,?)";
		PreparedStatement pst = conn.prepareStatement(sql);//這里要傳帶?的sql,然后mysql端就會對這個sql進行預編譯
		//根據字段來設置?的具體值
		/*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類型的數據

		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關于上傳的字節流文件有大小限制,可以在my.ini中配置變量

    max_allowed_packet=16M

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

tinyblob:255字節、blob:65k、mediumblob:16M、longblob:4G

讀到這里,這篇“JDBC的基本操作與Statement和PreparedStateMent使用區別是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

慈利县| 泰宁县| 策勒县| 织金县| 曲沃县| 桃园县| 绥芬河市| 昌宁县| 班玛县| 炉霍县| 西昌市| 南汇区| 板桥市| 临沧市| 灵武市| 昔阳县| 昌邑市| 信丰县| 岳池县| 越西县| 彭水| 芷江| 广平县| 都安| 西吉县| 玉屏| 高台县| 子洲县| 清镇市| 沙洋县| 崇义县| 正定县| 纳雍县| 将乐县| 梅河口市| 建德市| 武强县| 旺苍县| 青浦区| 博湖县| 宁都县|