1.DBC是什麼?
Java DataBase Connectivity(Java語言鏈接數據庫)
2.JDBC的本質是什麼?
JDBC是SUN公司制定的一套接口(interface) java.sql.*; (這個軟件包下有不少接口。)
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(); } } } }