JDBC有这一篇就够了(万字JDBC附代码详解)
目錄:
1.JDBC的本質
2.JDBC的使用步驟
3.DriverManager對象
4.Connectioin對象
5.Statement對象
6.ResultSet對象
7.JDBC工具類
8.PreparedStatement類
9.JDBC管理事務
1.JDBC的本質
Java DataBase Connectivity(Java語言連接數據庫)
JDBC是SUN公司制定的一套接口(interface)
2.JDBC的使用步驟
第一步:注冊驅動(作用:告訴Java程序,即將要連接的是哪個品牌的數據庫)
第二步:獲取連接(表示JVM的進程和數據庫進程之間的通道打開了,這屬于進程之間的通信,重量級的,使用完之后一定要關閉通道。)
第三步:獲取數據庫操作對象(專門執行sql語句的對象)
第四步:執行SQL語句(DQL DML…)
第五步:處理查詢結果集(只有當第四步執行的是select語句的時候,才有這第五步處理查詢結果集。)
第六步:釋放資源(使用完資源之后一定要關閉資源。Java和數據庫屬于進程間的通信,開啟之后一定要關閉。)
代碼模版:
package testJdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class test2 {public static void main(String[] args) throws SQLException, ClassNotFoundException {//1、注冊驅動String JDBCDriver = "com.mysql.jdbc.Driver";Class.forName(JDBCDriver);//2、連接數據庫String url="jdbc:mysql://127.0.0.1:3306/school"; //鏈接數據的urlString user="root"; //登錄數據庫的用戶名String password="123456"; //用戶的密碼Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();//一、查詢sqlString sql="select * from student";ResultSet rs = st.executeQuery(sql);System.out.println("SId"+" "+"Sname"+" "+"Sage"+" "+"Ssex");while (rs.next()) {System.out.println(rs.getString("SId")+" "+rs.getString("Sname")+" "+rs.getString("Sage")+" "+rs.getString("Ssex"));}/*//二、修改數據int update = st.executeUpdate("update student set Sname='xiaolizi' where SId=2");System.out.println("修改后成功的條數:"+update);*///三、刪除//st.execute("delete from student where SId='2'");//四、添加數據 // String sql1 = "insert into student(SId,Sname,Sage,Ssex) values('4','鄭','3','2')"; // st.execute(sql1);//關閉連接conn.close();st.close();rs.close();} }3.DriverManager對象
3.1DriverManager對象簡介
DriverManager是驅動管理對象,有兩個功能,第一個功能是注冊驅動,第二個功能是獲取數據庫連接
3.2DriverManager注冊驅動
我們查看DriverManager類發現它有這么一個方法
static void registerDriver(Driver driver):注冊與給定的驅動程序DriverManager但是我們可以看到我們的注冊驅動用到的是
String JDBCDriver ="com.mysql.jdbc.Driver";
Class.forName(JDBCDriver);
這樣的兩句代碼,那么好像和我們的DriverManager無關。
其實不是,我們寫代碼使用的是Class.forName("com.mysql.jdbc.Driver")把Driver加載到JVM中,
類里面有靜態代碼塊自動執行
看到這樣的兩句代碼是不是就恍然大悟,原來在加載這個類的同時執行了同同步代碼塊,就是在注冊驅動
再看下面一張圖
我們可以看到這個jar包已經包含了這個驅動加載,如果我們沒有寫注冊驅動,他也會自動加載驅動(也就是說Mysql5之后的版本驅動的jar包可以省略注冊驅動的步驟)
3.2DriverManager獲取數據庫連接
方法:
public static Connection getConnection(String url,String user,String password)參數:
*url:指定連接的路徑
*語法:jdbc:mysql://ip地址(域名):端口號/數據庫名
*例子:jdbc:mysql://localhost:3306/db3
*細節:如果連接的是本機mysql服務器且端口號為3306,可以省略jdbc:mysql:///數據庫連接名
4.Connectioin對象
Connection:數據庫連接對象,它的功能有:
1.功能:
獲取執行sql的對象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事務:
開啟事務:setAutoCommit(boolean autoCommit):調用該方法設置參數為false,即開啟事務
提交事務:commit();
回滾事務:rollback();
5.Statement對象
它的作用的執行sql語句,對應的方法有:
(1) boolean execute(String sql):可以執行任意的sql ,不常用(因為他多用于處理相對復雜的sql語句)了解即可
(2) int executeUpdate(String sql):執行DML(insert update delete) DDL(create alert drop)語句
返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功
(3)ResultSet executeQuery(String sql): 執行DQL語句
6.ResultSet對象
ResultSet對象:結果集對象,我們DQL查詢的結果都在這個對象里,它里邊的方法有:1 . next():游標向下移動一行(如下圖游標默認指向id所在行,所以我們需要此方法移動游標)
2 .getXXX(參數):獲取數據
XXX代表數據類型 如:int getInt(); String getString();
$參數:
1.int:代表列的編號,從1開始 如:getString(1);【對應下圖id】
2.String代表的是列的名稱,如:getDouble(“balance”);
我們獲取結果集里邊的數據,需要按照如圖的方式:
代碼模版
while(rs.next()){//6.2獲取數據int id=rs.getInt(1);//參數可以是數字代表列,可以直接是列名String name=rs.getString("name");double balance=rs.getDouble(3);System.out.println(id+"---"+name+"---"+balance); }我舉個例子,下表打印出來
7.JDBC工具類
剛才我舉的例子可以看出來每一次使用JDBC就會有很多重復的代碼塊(注冊驅動釋放資源都是重復的代碼),JDBC的工具類就是把那么多重復的代碼塊封裝起來變成一個新的類,每次使用的時候就調用這類里的個方法,那么當我們多次使用JDBC的時候就會簡便的多,我們把上面的例子拿過來,然后進行改進
我們知道獲取連接的時候就是上面例子的這段代碼:
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","2332402105");,現在們把這段代碼包裝成一個方法,我們的要求是,方法不允許有參數,還要保證方法的通用性,這時候我們就需要用到我們的配置文件了,里邊記錄我們獲取連接的三個參數,然后把釋放資源也包裝成一個方法。然后再把我們釋放資源封裝成一個方法,就有了如下工具類
配置文件里有:
那么每當我們使用JDBC的時獲取連接和釋放資源都可以使用這個工具類,配置文件的三個參數根據連接的數據庫不同適當更改,就會方便很多
8.PreparedStatement類
8.1登錄案例
我們做一個登錄案例試試:
我們的student數據庫里邊有一個表user,然后利用這一個表做一個登錄的案例:
user表:
那么我們按照上圖的用戶名和密碼進行登錄,代碼如下
運行結果:
那么其實這里有一個bug,比如下面的語句查出了所有的用戶
我們舉一個例子:
我們的表里明明沒有這一個user信息為啥會登錄成功呢,那么這里就牽扯到我們的SQL注入問題
SQL注入:在拼接sql語句時有一些sql的特殊關鍵字參與字符串的拼接,會造成安全性的問題
按照上圖輸入我們的實際的查詢語句是:
當然可以查到用戶,而且是相當于查詢所有的用戶,因為有一個or和一個恒等式
這時候就要用到我們的PreparedStatement類,父類是Statement
1.Statement:執行靜態的sql語句,就是直接把我們輸入的數據偷換掉sql語句重的username和password,
2.PreparedStatement:首先預編譯sql語句,參數使用占位符?替換
和Statement用法有所不同的是
- sql參數使用占位符如:"select * from user where name=? and password=?"
- 需要用PrepareStatement對象的方法給占位符賦值
- 在執行sql的時候不需要傳遞sql語句了,因為在獲取PreparedStatement對象時候需要傳遞一個sql語句用于預編譯
那么我們按照描述修改例子的代碼:
package Login;import java.sql.*; import java.util.Scanner;public class login {public boolean LoGin(String username,String password){if(username==null||password==null)return false;Connection conn=null;PreparedStatement pstmt=null;ResultSet res=null;try{Class.forName("com.mysql.jdbc.Driver");conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","2332402105");//定義預編譯sql語句strString str="select * from user where name=? and password=?" ;//獲取 PreparedStatement對象并且傳遞預編譯sql語句pstmt=conn.prepareStatement(str);//set方法給占位符賦值,第一個參數1代表第一個占位符,2代表第二個占位符,第二個參數是賦的值pstmt.setString(1,username);pstmt.setString(2,password);res = pstmt.executeQuery();return res.next();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if(pstmt!=null){try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}} if(res!=null){try {res.close();} catch (SQLException e) {e.printStackTrace();}}}return false;}public static void main(String[] args) {Scanner p=new Scanner(System.in);System.out.println("請輸入用戶名:");String username=p.next();System.out.println("請輸入密碼:");String password=p.next();boolean bool=new login().LoGin(username,password);if(bool){System.out.println("登錄成功");}else{System.out.println("登錄失敗");}} }
成功解決sql注入問題
9.JDBC管理事務
在獲取到Connection對象后,用Connection對象方法setAutoCommit(boolean autoCommit):參數為false開啟事務
然后整個語句結束后使用Connection對象的commit()方法對事務進行提交,我們還可以使用Connection對象的rollback()方法對事務進行回滾
總結
以上是生活随笔為你收集整理的JDBC有这一篇就够了(万字JDBC附代码详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 筛选法求素数
- 下一篇: JS重点语法及常用对象总结