工具和准備:
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時候的代碼)
接下來運行發現得到正確的運行結果