您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“JDBC的基本操作與Statement和PreparedStateMent使用區別是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“JDBC的基本操作與Statement和PreparedStateMent使用區別是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
JDBC:Java Database Connectivity,它是代表一組獨立于任何數據庫管理系統(DBMS)的API,聲明在java.sql與javax.sql包中,是SUN(現在Oracle)提供的一組接口規范。由各個數據庫廠商來提供實現類,這些實現類的集合構成了數據庫驅動jar。
注冊驅動
三部曲:
將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(); } }
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使用區別是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。