JavaJDBC(快速理解)

1.DBC是什麼?

Java DataBase Connectivity(Java語言鏈接數據庫)

2.JDBC的本質是什麼?

JDBC是SUN公司制定的一套接口(interface)
	java.sql.*; (這個軟件包下有不少接口。)

JDBC本質

3.JDBC開發前的準備工做,先從官網下載對應的驅動jar包,而後將其配置到環境變量classpath當中。

classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

以上的配置是針對於文本編輯器的方式開發,使用IDEA工具的時候,不須要配置以上的環境變量。
IDEA有本身的配置方式。

4.JDBC編程六步(須要背會)

第一步:註冊驅動(做用:告訴Java程序,即將要鏈接的是哪一個品牌的數據庫)

第二步:獲取鏈接(表示JVM的進程和數據庫進程之間的通道打開了,這屬於進程之間的通訊,重量級的,使用完以後必定要關閉通道。)

第三步:獲取數據庫操做對象(專門執行sql語句的對象)

第四步:執行SQL語句(DQL DML....)

第五步:處理查詢結果集(只有當第四步執行的是select語句的時候,纔有這第五步處理查詢結果集。)

第六步:釋放資源(使用完資源以後必定要關閉資源。Java和數據庫屬於進程間的通訊,開啓以後必定要關閉。)
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;

public class JDBCTest{ 
	public static void main(String[] args)
	{ 	
		Connection conn= null;
		Statement stmt = null;
		ResultSet rs = null;
		try{ 
			//1.註冊驅動
			//第一種方式
			Driver driver = new com.mysql.jdbc.Driver();
			DriverManager.registerDriver(driver);
			//第二種方式(一下方法不須要返回值,咱們只須要它的類加載動做)
			class.forName("com.mysql.jdbc.Driver");
			//2.獲取鏈接
			String url = "jdbc:mysql://127.0.0.1:3306/bjpowernode";
			String user = "root";
			String password = "333";
			conn = DriverManager.getConnection(url,user,password);

			System.out.println("數據庫鏈接對象:"+conn);
			//com.mysql.jdbc.JDBC4Connection@34340fab

			//3.獲取數據庫操做對象(statement專門執行sql語句)
			 stmt = conn.createStatement();
			//4.執行sql
			String sql = "select empno as a,ename,sal from emp";
			rs= stmt.executeQuery(sql); //executeUpdate執行DML語句 executeQuery(sql)執行DQL語句
			//5.處理查詢結果集
			
			while(rs.next())
			{ 
				int empno = rs.getInt("a");
				String ename = rs.getString("ename");
				double sal = rs.getDouble("sal");
				System.out.pritnln(empno+","+ename+","+sal);
			}
			
		}
		catch(SQLException e){ 
			e.printStackTrace();
		}finally{ 
			try{ 
				if(stmt !=null){ 
					stmt.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
			try{ 
				if(conn !=null){ 
					conn.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
		}
  }
}

使用屬性配置文件

//jdbc.propertes屬性配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bjpowernode
user=root
password=333
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.util.*;

public class JDBCTest{ 
	public static void main(String[] args)
	{ 	
		//使用資源綁定器綁定屬性配置文件
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
		String driver = bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		
		Connection conn= null;
		Statement stmt = null;
		try{ 
			//1.註冊驅動
			class.forName(driver);
			//2.獲取鏈接

			conn = DriverManager.getConnection(url,user,password);
			System.out.println("數據庫鏈接對象:"+conn);
			//com.mysql.jdbc.JDBC4Connection@34340fab

			//3.獲取數據庫操做對象(statement專門執行sql語句)
			 stmt = conn.createStatement();
			//4.執行sql
			String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')";
			int count = stmt.executeUpdate(sql);   //執行DML語句
			System.out.println(count == 1 ? "保存成功":"保存失敗");

			//5.處理查詢結果集
		}
		catch(Exception e){ 
			e.printStackTrace();
		}finally{ 
			try{ 
				if(stmt !=null){ 
					stmt.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
			try{ 
				if(conn !=null){ 
					conn.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
		}
  }
}

5.登陸功能實現(防止SQL注入,PreparedStatement)

package com.bjpowernode.jdbc;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*實現功能: 1.需求:模擬用戶登陸功能的實現。 2.業務描述: 程序運行的時候,提供一個輸入的入口,可讓用戶輸入用戶名和密碼 合法:顯示登陸成功。 不合法:顯示登陸失敗。 3.數據準備: 在實際的開發中使用建模工具 4.Sql注入現象(安全隱患): 根本緣由 fdsa ''or 將用戶名或密碼的or 當作了sql語句 解決SQL注入問題: 要想用戶信息不參與Sql語句編譯,那麼必須使用java.sql.PreparedStatement PreparedStatement是屬於預編譯數據庫操做對象,編譯一次執行屢次。 PreparedStatement ps = null; 其中一個?表明一個佔位符,站位符不能用點引號括起來 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); 給佔位符傳值 ps.setString(1,loginName); ps.setString(2,loginPwd); */
public class JDBCTest06 { 
    public static void main(String[] args)
    { 
        //初始一個界面
        Map<String,String> userLoginInfo = initUI();
     	boolean loginSuccess = login(userLoginInfo);
        System.out.println(loginSuccess? "登陸成功!":"登陸失敗用戶名密碼錯誤!");
    }

    private static boolean login(Map<String, String> userLoginInfo) { 
        boolean loginSuccess = false;
        Connection conn = null;
        PreparedStatement  ps = null;//這裏是PreParedStatement(預編譯數據庫操做對象)
        ResultSet rs = null;
        try{ 
            //註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            //鏈接語句
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","333");
            //獲取數據庫操做對象
	    String sql = "select * from t_user where loginName = ? and loginPwd = ?";
	    ps = conn.prepareStatement(sql);
	    //給佔位符傳值
	    ps.setString(1,userLoginInfo.get("loginName"));
	    ps.setString(2,userLoginInfo.get("loginPwd"));
	    
	    rs = ps.executeQuery();	            
            if (rs.next())
            { 
                loginSuccess = true;
            }
        }catch (ClassNotFoundException e){ 
            e.printStackTrace();

        }catch (SQLException e)
        { 
            e.printStackTrace();
        }finally { 
            if (rs !=null){ 
                try { 
                    rs.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
             if (ps !=null){ 
                try { 
                    ps.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
            if (conn !=null)
            { 
                try{ 
                    conn.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
        }
       return loginSuccess;
    }

    /* * 初始化用戶頁面 * @return 用戶輸入用戶名密碼等登陸信息 * */
    private static Map<String, String> initUI() { 
        Scanner s = new Scanner(System.in);
        System.out.println("用戶名:");
        String loginName = s.nextLine();

        System.out.println("密碼:");
        String loginPwd = s.nextLine();

        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}

Statement的用處(須要SQL注入)

Statement存在SQL注入問題,是編譯一次執行一次。PreparedStatement執行效率高。
須要先java

用戶臺輸入desc降序,輸入asc升序,此時須要使用Sql注入
String keyWords = desc或者asc

String sql = "select ename = from emp order by ename " + keyWords;

6.帳戶轉帳演示事務

sql腳本
drop table if exists t_act;
create table t_act(
	actno bigint,
	balance double(7,2)  //注意:7表示有效數字,2表示小數位個數 
)insert into t_act(actno,balance) values(111,20000);
insert into t_act(actno,balance) values(222,0);
commit;
select * from t_act;
重點三句:
	conn.setAutoCommit(false);
	conn.commit();
	conn.rollback();
public class HelloWorld { 
    public static void main(String []args) { 
	  Connection conn = null;
	  PreparedStatement ps = null;
	  try{ 
	    //註冊驅動
		   Class.forName("com.mysql.jdbc.Driver");
		   //獲取鏈接
		   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333");
		   //將自動提交機制改成手動提交
		   conn.setAutoCommit(false);//開啓事務
		   
		   //獲取預編譯的數據庫操做系統
		   String sql = "update t_act set balance = ? where actno = ?";
		   ps = conn.prepareStatement(sql);
		   
		   //給替換符賦值
		   ps.setDouble(1,10000);
     		   ps.setInt(2,111);
		   int count = ps.executeUpdate();
		   
		   ps.setDouble(1,10000);
		   ps.setInt(2,222);
		   count +=ps.executeUpdate();
		   
		   //程序到這裏表示成功
		   conn.commit();  //提交事務
		   Syste.out.println(count == 2 ?"轉帳成功":"轉帳成功")}catch(Exception e)
		  { 
		   if(conn != null)
		   { 
		    try{ 
		     //回滾事務
		     conn.rollback();
		    }catch(SQLException e)
		    { 
		     e.printStackTrace();
		    }
		   }
		   e.printStackTrace();
		  }
		}
	}

7.JDBC工具類封裝

import java.sql.*;

public class DBUtil { 

    private DBUtil() { 
    }

    //工具類的構造方法是私有的;
    //由於工具類的方法是靜態的,不須要實例化
    static { 
        try { 
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) { 
            e.printStackTrace();
        }
    }

    //獲取數據庫鏈接對象
    //@return 鏈接對象
    public static PreparedStatement createStatement(String sql) throws SQLException { 
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "333");

        PreparedStatement ps = conn.prepareStatement(sql);

        return ps;
    }

    //關閉資源
    //conn 鏈接對象
    //ps 數據庫操做對象
    //rs 結果集
    public static void close(Connection conn, Statement ps, ResultSet rs) { 
        if (rs != null) { 
            try { 
                rs.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
        if (ps != null) { 
            try { 
                ps.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
        if (conn != null) { 
            try { 
                conn.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
    }
}
相關文章
相關標籤/搜索