JDBC入門

一、概念
1姜性、jdbc: java database connectivity 即java與數(shù)據(jù)庫的連接


clipboard.png

2、角色分類
服務(wù)器 (db): a)氨菇、接收 sql b)门驾、執(zhí)行 sql c)奶是、返回結(jié)果
客戶端 (java):a)、接收數(shù)據(jù) b)初嘹、組裝sql c)屯烦、發(fā)送SQL(與數(shù)據(jù)庫建立聯(lián)系) d)驻龟、分析結(jié)果
3翁狐、面向接口編程
java 制定標(biāo)準(zhǔn) 露懒,不同的數(shù)據(jù)庫廠商實現(xiàn) 接口即可懈词。java 中提供的接口 java.sql.* 包下坎弯,常用接口如下
接口名稱 作用
java.sql.Connection 連接
java.sql.Statement 靜態(tài)處理塊
java.sql.PreparedStatement 預(yù)處理塊
java.sql.ResultSet 結(jié)果集
java.sql.ResultSetMetaData 結(jié)果集元信息
oracle廠商實現(xiàn)接口 (jar)
F:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar 視安裝路徑而定
二译暂、jdbc 步驟
1秧秉、jdbc 步驟類比寄快遞

1象迎、選擇快遞公司     
加載驅(qū)動(完整路徑) 
2、與快遞公司建立聯(lián)系(電話號碼 唯一信息)  
建立連接(url  用戶名  密碼) 
3汪厨、快遞員 收包裹    創(chuàng)建處理塊 Statement  PreparedStatement 
4劫乱、打包 投遞    
執(zhí)行:  execute(ddl)  int executeUpdate(dml)  ResultSet executeQuery(select) 
5衷戈、簽收        
分析結(jié)果 :ddl -->沒有異常  dml--->>0    select-->分析 結(jié)果集 
6殖妇、打發(fā)走人    釋放資源  核
核心為拼接 SQL谦趣、分析結(jié)果前鹅、操作結(jié)果 
  • 導(dǎo)包
在項目中新建一個source folder文件夾烦租,名字為lib
將oracle里的實現(xiàn)接口jar包(app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar 視安裝路徑而定)復(fù)制到lib文件夾中
選擇ojdbc6.jar右鍵選擇add build path
  • 建立連接
1)叉橱、連接字符串
驅(qū)動: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@db 服務(wù)器地址:端口:實例
連接 url:jdbc:oracle:thin:@localhost:1521:orcl
用戶名與密碼:如 scott tiger

2、簡單的JDBC步驟

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加載驅(qū)動(選擇數(shù)據(jù)庫)
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取連接(連接數(shù)據(jù)庫)
        Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "SCOTT", "TIGER");
        //3.獲取靜態(tài)處理塊(構(gòu)建一個執(zhí)行和發(fā)送SQL 語句的對象)
        Statement state =con.createStatement();
        //4.創(chuàng)建SQL語句
        String str ="select ename,empno from emp";
        //5.創(chuàng)建結(jié)果集
        ResultSet result=state.executeQuery(str);
        //6.獲取結(jié)果
        while (result.next()) {
            String ename=result.getString(1);
            long empno=result.getLong(2);   
            System.out.println(ename+"->"+empno);
        }
          //關(guān)閉資源
        result.close();
        state.close();
        con.close();
    }   
}

3者蠕、處理塊

  • 靜態(tài)處理塊
Statement 是 Java 執(zhí)行數(shù)據(jù)庫操作的一個重要接口窃祝,用于在已經(jīng)建立數(shù)據(jù)庫連
接的基礎(chǔ)上,向數(shù)據(jù)庫發(fā)送要執(zhí)行的 SQL 語句踱侣。Statement 對象粪小,用于執(zhí)行不帶參數(shù)
的簡單 SQL 語句。
執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象抡句。
1)探膊、創(chuàng)建 : 連接.Connection.createStatement()
2)、執(zhí)行 :
ddl -->execute(dd語句) -- 通常不會在代碼中執(zhí)行
dml -->executeUpdate(dml語句)
select -->executeQuery(select)
3)待榔、特點:處理 不變的靜態(tài)的 sql 語句
優(yōu)點: 直接查看sql 逞壁,方便處理錯誤
缺點:性能不高 拼接 sql 麻煩 可能存在 sql 注入

  • 預(yù)處理塊
PreparedStatement 接口繼承了 Statement,并與之在兩方面有所不同:有人主張锐锣,在 JDBC 應(yīng)用中斤彼,如果你已經(jīng)是稍有水平開發(fā)者蟋恬,你就應(yīng)該始終以PreparedStatement 代替 Statement.也就是說渗勘,在任何時候都不要使用 Statement。由于 PreparedStatement 對象已預(yù)編譯過璧疗,所以其執(zhí)行速度要快于 Statement 對象。因此,多次執(zhí)行的 SQL 語句經(jīng)常創(chuàng)建為 PreparedStatement 對象,以提高效率。
1)爹谭、創(chuàng)建:創(chuàng)建:連接.prepareStatement(sql)
2)腹泌、執(zhí)行:
存在? ,先填充參數(shù)再執(zhí)行
ddl -->execute()
dml -->executeUpdate()
select -->executeQuery()
3)、特點 :處理 不變的靜態(tài)的 sql 語句 |可變的 sql 語句 帶 ? 的 sql
優(yōu)點:性能高,方便編寫sql 不存在sql注入 安全
缺點:不能直接打印sql語句 不方便處理錯誤

預(yù)處理塊實例

public static boolean update(String name, String pwd ) {
        Connection con = null;
        ResultSet result = null;
        PreparedStatement ps = null;
        // 準(zhǔn)備SQL語句
        String sql = "update t_user set uname=?,pwd=?";
        // 創(chuàng)建連接
        try {
            con = DBUtils.getConnection();
            // 創(chuàng)建預(yù)處理塊
            ps = con.prepareStatement(sql);
            // 更新數(shù)據(jù)
            ps.setString(1, name);
            ps.setString(2, pwd);
            // 執(zhí)行更新并返回結(jié)果
            int num = ps.executeUpdate();
            if (num <= 0) {
                System.out.println("修改失敗");
            } else {
                System.out.println("修改成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(con, ps, result);
        }
        return false;
    }

6蒙袍、使用預(yù)處理塊

public static boolean update(String name, String pwd ) {
        Connection con = null;
        ResultSet result = null;
        PreparedStatement ps = null;
        // 準(zhǔn)備SQL語句
        String sql = "update t_user set uname=?,pwd=?";
        // 創(chuàng)建連接
        try {
            con = DBUtils.getConnection();
            // 創(chuàng)建預(yù)處理塊
            ps = con.prepareStatement(sql);
            // 更新數(shù)據(jù)
            ps.setString(1, name);
            ps.setString(2, pwd);
            // 執(zhí)行更新并返回結(jié)果
            int num = ps.executeUpdate();
            if (num <= 0) {
                System.out.println("修改失敗");
            } else {
                System.out.println("修改成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(con, ps, result);
        }
        return false;
    }

7佩抹、使用Properties配置文件

public static void main(String[] args) {
        // 獲取配置文件
        Properties pro = new Properties();
        Connection con = null;
        PreparedStatement pre = null;
        ResultSet result = null;
        String ename = null;
        long empno = 0;
        try {
            // 加載配置文件
            // db.properties為當(dāng)前src路徑下放入鍵值對數(shù)據(jù)的文件
            pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
            // 加載驅(qū)動
            Class.forName(pro.getProperty("driver"));
            // 創(chuàng)建連接
            con = DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("name"), pro.getProperty("pwd"));
            // 創(chuàng)建sql語句
            String sql = "select ename,empno from emp where ename=?";
            // 獲取處理塊
            pre = con.prepareStatement(sql);
            // 站位
            pre.setString(1, "SMITH");
            // 獲取結(jié)果
            result = pre.executeQuery();
            if (result.next()) {
                ename = result.getString(1);
                empno = result.getLong(2);
                System.out.println(empno + "--->" + ename);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

            try {
                if (result != null) {
                    result.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (pre != null) {
                    pre.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

8奥洼、自定義通用的操作數(shù)據(jù)庫的類

/*
 * 通用的操作數(shù)據(jù)庫的類
 */
public class Base<T> {
    // 更新數(shù)據(jù)
    public boolean update(String str, Object[] obj) {
        boolean flag = false;
        Connection con = null;
        PreparedStatement state = null;
        con = DBUtils.getConnection();
        try {
            state = con.prepareStatement(str);
            for (int i = 0; i < obj.length; i++) {
                state.setObject(i + 1, obj[i]);
            }
            int num = state.executeUpdate();
            if (num > 0) {
                flag = true;
                System.out.println("操作成功");
            } else {
                System.out.println("操作失敗");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(con, state);
        }
        return flag;
    }

    // 查找數(shù)據(jù)
    public List<T> search(String sql,Object[] obj,Class<T> cls){
        List<T> list=new ArrayList() ;
        Connection con=null;
        ResultSet result=null;
        PreparedStatement state=null;
        //獲取連接
        con=DBUtils.getConnection();    
        try {
            //獲取預(yù)處理塊
            state=con.prepareStatement(sql);
            //循環(huán)寫入站位
            if(obj!=null) {
                for (int i = 0; i < obj.length; i++) {
                    state.setObject(i + 1, obj[i]);
                }               
            }
            //執(zhí)行
            result=state.executeQuery();
            //ResultSetMetaData類可用于獲取關(guān)于 ResultSet 對象中列的類型和屬性信息的對象
            ResultSetMetaData rsmd=state.getMetaData();
            //判斷結(jié)果
            //獲取結(jié)果數(shù)量
            int count=rsmd.getColumnCount();
            System.out.println(count);
            while(result.next()) {
                //創(chuàng)建用來存放記錄的對象
                T t=cls.newInstance();
                for (int i = 0; i < count; i++) {                   
                    //獲取字段名
                    String colName=rsmd.getColumnLabel(i+1);
                    System.out.println(colName);
                    //獲取字段數(shù)據(jù)
                    Object value=result.getObject(i+1);
                    System.out.println(colName);
                    //獲取字段數(shù)據(jù)類型                  
                    Field field= cls.getDeclaredField(colName);
                    //開啟權(quán)限
                    field.setAccessible(true);
                    field.set(t, value);
                    field.setAccessible(false);
                    System.out.println(t);
                }
                //添加元素
                list.add(t);
                System.out.println("操作成功");             
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }finally {
            DBUtils.close(con, state,result);
        }
        System.out.println(list);
        return list;
    }

}

測試

String sql="insert into t_user values(?,?)";
Base<User> base=new Base<User>();
//String[] obj= {"趙鐵柱","qwer"};
//base.update(sql, obj);
sql="select uname \"uname\",pwd \"pwd\" from t_user";
List list=base.search(sql, null, User.class);
System.out.println(list);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吱韭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姨俩,更是在濱河造成了極大的恐慌,老刑警劉巖宝剖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耸弄,死亡現(xiàn)場離奇詭異扶歪,居然都是意外死亡熏兄,警方通過查閱死者的電腦和手機砾肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門庐完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事山孔。” “怎么了酪呻?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我筋量,道長,這世上最難降的妖魔是什么七咧? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮叮叹,結(jié)果婚禮上艾栋,老公的妹妹穿的比我還像新娘。我一直安慰自己蛉顽,他們只是感情好蝗砾,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著携冤,像睡著了一般悼粮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曾棕,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天扣猫,我揣著相機與錄音,去河邊找鬼翘地。 笑死申尤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衙耕。 我是一名探鬼主播昧穿,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橙喘!你這毒婦竟也來了时鸵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤厅瞎,失蹤者是張志新(化名)和其女友劉穎饰潜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁奖,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡囊拜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了比搭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冠跷。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡南誊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤谣殊,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布虐译,位于F島的核電站,受9級特大地震影響浸船,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一重挑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棠涮,春花似錦谬哀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驳糯,卻和暖如春篇梭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酝枢。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工恬偷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帘睦。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓喉磁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親官脓。 傳聞我的和親對象是個殘疾皇子协怒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • JDBC基礎(chǔ)知識 一、采用JDBC訪問數(shù)據(jù)庫的基本步驟: A.載入JDBC驅(qū)動程序 B.定義連接URL ...
    java日記閱讀 3,839評論 0 20
  • JDBC jdbc: java database connectivity java 與數(shù)據(jù)庫的連接 一卑笨、 角色分...
    小山居閱讀 189評論 0 1
  • 前面介紹過數(shù)據(jù)庫的創(chuàng)建孕暇,與SQL語句的增刪改查,但是Java是如何連接數(shù)據(jù)庫的呢赤兴?當(dāng)然是我們的JDBC了妖滔,本篇總結(jié)...
    DramaScript閱讀 643評論 0 0
  • JDBC: Java數(shù)據(jù)庫連接,(Java Database Connectivity桶良,簡稱JDBC)是Java語...
    磊_5d71閱讀 203評論 0 0
  • JDBC入門 導(dǎo)jar包:驅(qū)動座舍! 加載驅(qū)動類:Class.forName("類名"); 給出url,usernam...
    擁心lyy閱讀 329評論 0 0