工具和準備: MYSQL 8.0jar包: 鏈接:https://pan.baidu.com/s/1O3xuB0o1DxmprLPLEQpZxQ 提取碼:grni 使用eclipse開發首先把jar包導入內庫中 首先將jar包複製到項目src下,右擊src點擊build path然後會在Refren ...
工具和準備:
MYSQL 8.0jar包:
鏈接:https://pan.baidu.com/s/1O3xuB0o1DxmprLPLEQpZxQ
提取碼:grni
使用eclipse開發首先把jar包導入內庫中
首先將jar包複製到項目src下,右擊src點擊build path然後會在Refrenced中看到jar包
本篇博客主要講述jdbc的操作過程,每一步需要乾什麼,最後用代碼實現一個有資料庫的簡易註冊登錄功能。
下麵的代碼能夠對jdbc的執行過程有初步的瞭解。
大體分為以下幾步:
首先進行註冊驅動
可以使用 Driver driver=new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver); 來進行註冊驅動
也可以使用java反射技術採用別人的介面來進行註冊驅動
Class.forName("com.mysql.cj.jdbc.Driver");
接下來進行獲取資料庫連接
需要url,資料庫用戶名以及密碼
通過DriverManager.getConnection(url, user, password)賦給Connection對象
註意:
mysql8.0的url以及mysql介面名稱與mysql5.0發生了變化
mysql5.0:
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/suzy";(suzy為我的資料庫名稱)
mysql8.0:
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai";
接下來獲取資料庫操作對象
通過createstatement方法賦給Statement對象
接下來執行sql語句
自己構建sql語句通過executeQuery方法進行執行
接下來處理查詢結果集
當rs.next為true的時候不斷列印
最後將資源關閉
rs.close(); st.close(); conn.close();
瞭解jdbc執行過程代碼如下:
package jdbcdemo; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcTest01 { public static void main(String[] args) { // TODO Auto-generated method stub Statement st=null; Connection conn=null; ResultSet rs=null; try { //1.註冊驅動 /* Driver driver=new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver);*/ Class.forName("com.mysql.cj.jdbc.Driver"); //2.獲取資料庫連接 String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); //3.獲取資料庫操作對象 st=conn.createStatement(); //4.執行sql語句 String sql="select e.ename,e.sal from emp e"; rs=st.executeQuery(sql); //5.處理查詢結果集 while(rs.next()) { String ename=rs.getString("ename"); double sal=rs.getDouble("sal"); System.out.println(ename+"||"+sal); } } catch (Exception e) { e.printStackTrace(); }finally { if(rs!=null) { try { rs.close(); }catch(Exception e) { e.printStackTrace(); } } if(st!=null) { try { st.close(); }catch(Exception e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); }catch(Exception e) { e.printStackTrace(); } } } } }
使用jdbc實現一個簡易的註冊代碼如下:
public class JdbcTest02 { public static void main(String[] args) throws SQLException { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); System.out.println("歡迎來控制台進行註冊"); System.out.println("請輸入您要註冊的用戶名"); String name=in.nextLine(); System.out.println("請輸入您的密碼"); String pwd=in.nextLine(); Connection conn=null; Statement st=null; int count=0; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); st=conn.createStatement(); String sql="insert into t_user(username,password) values('"+name+"','"+pwd+"')"; count=st.executeUpdate(sql); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(st!=null) { st.close(); } if(conn!=null) { conn.close(); } } if(count==1) { System.out.println("註冊成功!!!"); } else { System.out.println("註冊失敗!!!"); } } }
註冊界面效果圖:
資料庫相應的添加了剛纔註冊的信息
使用jdbc實現一個簡易的登錄代碼如下:
public class JdbcTest03 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); System.out.println("歡迎來控制台進行登錄"); System.out.println("請輸入您的用戶名"); String name=in.nextLine(); System.out.println("請輸入您的密碼"); String pwd=in.nextLine(); Statement st=null; Connection conn=null; ResultSet rs=null; PreparedStatement ps=null; boolean flag=false; try { Class.forName("com.mysql.cj.jdbc.Driver"); //2.獲取資料庫連接 String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); //3.獲取資料庫操作對象 //st=conn.createStatement(); //4.執行sql語句 //String sql="select username from t_user where username='"+name+"' and password='"+pwd+"'"; //定義sql語句框架 String sql="select username from t_user where username= ? and password = ?"; //sql語句進行預編譯 ps=conn.prepareStatement(sql); //對sql語句進行賦值 ps.setString(1, name); ps.setString(2, pwd); rs=ps.executeQuery(); //rs=st.executeQuery(sql); if(rs.next()) { flag=true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(rs!=null) { rs.close(); } if(ps!=null)//st!=null { //st.close(); ps.close(); } if(conn!=null) { conn.close(); } } if(flag) { System.out.println("登陸成功!!!"); } else { System.out.println("您輸入的用戶名或密碼錯誤"); } } }
登錄界面效果如下:
可是發現用戶名ss資料庫並沒有卻能登陸成功,debug後發現這樣的密碼導致sql語句變為select username from t_user where (username='ss' and password ='asdf') or 'kk'='kk',後面的'kk'='kk'是恆成立的,前面是or語句所以百分百執行
怎樣解決這個bug呢:
採用預編譯對象prepareStatement,定義sql框架使用?占位符,預編譯之後進行Sql賦值
上述代碼是解決bug之後的(有註釋的是有bug時候的代碼)
接下來運行發現得到正確的運行結果