Jave SE --- JDBC(14 Meta data)

實驗名稱:集元數(shù)據(jù)練習
實驗目的:

1、集元數(shù)據(jù)的相關(guān)概念慨亲;
2、學會DatabaseMetaData宝鼓,并可獲取數(shù)據(jù)庫的相關(guān)信息刑棵;
3、學會ResultSetMetaData愚铡,可以通過該類的對象獲取結(jié)果集的信息铐望,并對查詢結(jié)果進行處理。

實驗內(nèi)容:

在數(shù)據(jù)庫中創(chuàng)建學生表Student,自主設置學生表的信息正蛙。
對學生表進行查詢操作,并將查詢結(jié)果輸出(包括字段名稱)营曼。

實驗步驟:
/*
該版本的代碼并沒有使用查詢結(jié)果集與類對應起來乒验,并且未
對結(jié)果集進行封裝,也沒有使用相應的反射機制蒂阱,所以總體
說數(shù)據(jù)的安全性和封裝性不能很好的體現(xiàn)锻全,將對改代碼進行改進
*/
package metadata;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

    import java.util.Properties;
    public class DBUTilsTools {
        public static Connection getConnection()   {
            Connection conn = null;//創(chuàng)建連接對象
            InputStream is = ClassLoader.getSystemResourceAsStream("jdbc.properties");//創(chuàng)建流對象
            Properties properties = new Properties();
            try {
                properties.load(is);
                String driver = properties.getProperty("driver");
                String url = properties.getProperty("url");
                String userName = properties.getProperty("user");
                String password = properties.getProperty("password");
                Class.forName(driver);
                conn = DriverManager.getConnection(url, userName, password);//使用連接對象連接數(shù)據(jù)庫
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return conn;//將創(chuàng)建好的數(shù)據(jù)庫連接對象返回
        }
        
        public static int exeUpdate(String sql,Object...values) {//執(zhí)行多參數(shù)sql
            Connection conn = null;
            conn = DBUTilsTools.getConnection();//獲取連接對象
            PreparedStatement pstmt = null;//預定義sql
            int n = 0;
            try {
                pstmt = conn.prepareStatement(sql);
                for(int i = 1;i <= values.length; i++){
                    pstmt.setObject(i, values[i-1]);
                }
                n = pstmt.executeUpdate();//獲取sql執(zhí)行結(jié)果
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                DBUTilsTools.release(conn, pstmt, null);//釋放連接資源
            }
            return n;
        }
        
        public static void exeQuery(String sql,Object...values) {
            Connection conn = null;
            conn = DBUTilsTools.getConnection();
            
            PreparedStatement pstmt = null;
            ResultSet rs  = null;//結(jié)果集
            
            try {//相當于sql語句中?(占位符)的個數(shù)录煤,鳄厌?也就是所指定字段的名稱
                pstmt = conn.prepareStatement(sql);
                for (int i = 1; i <= values.length; i++) {//該循環(huán)的作用可以認為是將sql語句將之前空缺的占位符補充完整
                    pstmt.setObject(i, values[i-1]);
                }
                //真正的執(zhí)行sql語句
                rs = pstmt.executeQuery();//查詢結(jié)束后,返回的結(jié)果中包含你所需的那幾列
                
                
                //獲取結(jié)果集的結(jié)構(gòu)
                ResultSetMetaData rsmd = rs.getMetaData();
                int count = rsmd.getColumnCount();//獲取結(jié)果集的列數(shù)
                
                for(int i = 1; i <= count; i++) {
                    System.out.print(rsmd.getColumnName(i) + "\t\t");//輸出每一列的名稱
                }
                System.out.println();//換行
                
                while(rs.next()) {//光標移動到下一行
                    for(int i = 1;i <= count; i++) {//遍歷所查詢的列的值
                    System.out.print(rs.getObject(i) + "\t");//打印輸出所有列的內(nèi)容
                    }
                    System.out.println();
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                DBUTilsTools.release(conn, pstmt, rs);
            }
        }
        //釋放連接
        public static void release(Connection conn, PreparedStatement pstmt,ResultSet rs) {

                if(rs != null)
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                
                if(pstmt != null)
                    try {
                        pstmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                
                if(conn != null)
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                        
                        
                    }
        }   
        //driver codes:
        public static void main(String[] args) {
            String sql = "select bno,bname,bpublisher,bprice from book";
            DBUTilsTools.exeQuery(sql);
        }
}

改進代碼


//工具類
package metadataImpro;

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


    public class DBUTilsTools {
        public static Connection getConnection()   {
            Connection conn = null;
            InputStream is = ClassLoader.getSystemResourceAsStream("jdbc.properties");
            Properties properties = new Properties();
            try {
                properties.load(is);
                String driver = properties.getProperty("driver");
                String url = properties.getProperty("url");
                String userName = properties.getProperty("user");
                String password = properties.getProperty("password");
                Class.forName(driver);
                conn = DriverManager.getConnection(url, userName, password);
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return conn;
        }
        
        public static int exeUpdate(String sql,Object...values) {
            Connection conn = null;
            conn = DBUTilsTools.getConnection();
            PreparedStatement pstmt = null;
            int n = 0;
            try {
                pstmt = conn.prepareStatement(sql);
                for(int i = 1;i <= values.length; i++){
                    pstmt.setObject(i, values[i-1]);
                }
                n = pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                DBUTilsTools.release(conn, pstmt, null);
            }
            return n;
        }
        
        public static List exeQuery(String sql,String className,Object...values) {
            Connection conn = null;
            conn = DBUTilsTools.getConnection();
            
            PreparedStatement pstmt = null;
            ResultSet rs  = null;
            List list = new ArrayList();
            
            try {//相當于sql語句中妈踊?(占位符)的個數(shù)了嚎,?也就是所指定字段的名稱
                pstmt = conn.prepareStatement(sql);
                for (int i = 1; i <= values.length; i++) {//該循環(huán)的作用可以認為是將sql語句將之前空缺的占位符補充完整
                    pstmt.setObject(i, values[i-1]);
                }
                //真正的執(zhí)行sql語句
                rs = pstmt.executeQuery();//查詢結(jié)束后廊营,返回的結(jié)果中包含你所需的那幾列
                
                //獲取結(jié)果集的結(jié)構(gòu)
                ResultSetMetaData rsmd = rs.getMetaData();
                int count = rsmd.getColumnCount();//獲取結(jié)果集的列數(shù)
                Class class1 = Class.forName(className);
                
                while(rs.next()) {//光標移動到下一行
                    Object obj = class1.newInstance();//實例化                 
                    for(int i = 1;i <= count; i++) {//遍歷所查詢的列的值
                    
                        String varname = rsmd.getCatalogName(i);//獲得列的名稱
                        Object value = rs.getObject(i);//獲取列的值
                        ReflectionTools.setField(obj, varname, value);//調(diào)用反射方法歪泳,為每一字段賦值
                    }
                    list.add(obj);
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }finally {
                DBUTilsTools.release(conn, pstmt, rs);
            }
            
            return list;
        }
        
        public static void release(Connection conn, PreparedStatement pstmt,ResultSet rs) {

                if(rs != null)
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                
                if(pstmt != null)
                    try {
                        pstmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                
                if(conn != null)
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                        
                    }
        }   
        
        public static void main(String[] args) {
            String sql = "select bno,bname,bpublisher,bprice from book where bprice=?";
            String className = "Book";
            List list = DBUTilsTools.exeQuery(sql,className,59.80);

            for (Object obj : list) {
                System.out.println(obj);
            }
        }
}

//工具類
    package metadataImpro;
    
    import java.lang.reflect.Field;
    
    public class ReflectionTools {
        public static void setField(Object obj, String name, Object value) {
            Class class2 = obj.getClass();
            try {
                Field field = class2.getDeclaredField(name);
                field.setAccessible(true);
                field.set(obj, value);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
//數(shù)據(jù)封裝類
    package metadataImpro;
    
    public class Book {
        private String bno;
        private String bname;
        private String bpublisher;
        private String bauthor;
        private String bdate;
        private String bprice;
        public String getBno() {
            return bno;
        }
        public void setBno(String bno) {
            this.bno = bno;
        }
        public String getBname() {
            return bname;
        }
        public void setBname(String bname) {
            this.bname = bname;
        }
        public String getBpublisher() {
            return bpublisher;
        }
        public void setBpublisher(String bpublisher) {
            this.bpublisher = bpublisher;
        }
        public String getBauthor() {
            return bauthor;
        }
        public void setBauthor(String bauthor) {
            this.bauthor = bauthor;
        }
        public String getBdate() {
            return bdate;
        }
        public void setBdate(String bdate) {
            this.bdate = bdate;
        }
        public String getBprice() {
            return bprice;
        }
        public void setBprice(String bprice) {
            this.bprice = bprice;
        }
        @Override
        public String toString() {
            return "Book [bno=" + bno + ", bname=" + bname + ", bpublisher=" + bpublisher + ", bauthor=" + bauthor
                    + ", bdate=" + bdate + ", bprice=" + bprice + "]";
        }
    
        
    
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市露筒,隨后出現(xiàn)的幾起案子呐伞,更是在濱河造成了極大的恐慌,老刑警劉巖慎式,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶氢,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘪吏,警方通過查閱死者的電腦和手機癣防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肪虎,“玉大人劣砍,你說我怎么就攤上這事∩染龋” “怎么了刑枝?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迅腔。 經(jīng)常有香客問我装畅,道長,這世上最難降的妖魔是什么沧烈? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任掠兄,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚂夕。我一直安慰自己迅诬,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布婿牍。 她就那樣靜靜地躺著侈贷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪等脂。 梳的紋絲不亂的頭發(fā)上俏蛮,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音上遥,去河邊找鬼搏屑。 笑死,一個胖子當著我的面吹牛粉楚,可吹牛的內(nèi)容都是我干的辣恋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼解幼,長吁一口氣:“原來是場噩夢啊……” “哼抑党!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撵摆,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤底靠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后特铝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑中,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年鲫剿,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳄逾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵莲,死狀恐怖雕凹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情政冻,我是刑警寧澤枚抵,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站明场,受9級特大地震影響汽摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苦锨,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一逼泣、第九天 我趴在偏房一處隱蔽的房頂上張望趴泌。 院中可真熱鬧,春花似錦拉庶、人聲如沸嗜憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痹筛。三九已至,卻和暖如春廓鞠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谣旁。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工床佳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄审。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓砌们,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搁进。 傳聞我的和親對象是個殘疾皇子浪感,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,790評論 0 11
  • MYSQL 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 7,778評論 5 116
  • 又是忙碌的一天過去了,周一一貫如此饼问。轉(zhuǎn)動脖子影兽,可以聽到"咔咔"的聲音,資深頸椎病者莱革,想想好久沒有去按摩放松了峻堰,辦了...
    身體棒棒閱讀 183評論 0 3
  • 還有四天就要考四級了,期間沒怎么準備考試盅视,本該聒噪的心卻異常平靜捐名。本該在今天閑暇的時候埋頭奮斗,一下午拿著手機看電...
    北宮小亞閱讀 111評論 1 1
  • 蹦極是一個尋求自我突破的運動闹击,曾經(jīng)在很多極限運動的視頻上看見過镶蹋,動感的BGM引領(lǐng)著狂飆的腎上腺素,讓看著的人不得不...
    說書客閱讀 175評論 0 0