本期概述php
上一期咱們學習瞭如何將html採集到的數據存儲到MySql數據庫中,這期咱們來學習下如何在存儲的數據中查詢咱們實際想看到的數據.html
數據採集頁面 2011-2012賽季英超球隊戰績java
若是是初學者 如下可能對你有幫助mysql
在使用java 操做MySql數據庫以前 咱們須要在項目文件中導入 一個jar包(mysql-connector-java-5.1.18-bin)sql
能夠在MySql官網下載 Connector/J 5.1.18 數據庫
第一次使用MySql? 請看 java鏈接MYSQL apache
請看這個 Eclipse下如何導入jar包數據結構
若是是初學者 想使用MySql數據庫的話 能夠去這裏 XAMPP中文官網 下載 XAMPP 套裝函數
XAMPP(Apache+MySQL+PHP+PERL)是一個功能強大的建 XAMPP 軟件站集成軟件包, 並且一鍵式安裝, 無需修改配置文件,很是好用. 學習
關於,如何在MySql裏建立數據庫,請看Java網頁數據採集器實例教程[中篇-數據存儲].
數據庫準備好了,咱們開始寫java程序代碼;
這期,咱們主要在MySql 類裏增長了一個數據查看的方法 queryMySql(),並增長了一個 DataQuery類, 包含了一些比賽結果的查詢方法.
主程序代碼
這裏簡單介紹下各個類以及包含的方法
DataCollectionAndStorage類 和裏面的dataCollectAndStore() 方法 用於Html數據採集和存儲
DataCollectionAndStorage類 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; /** * DataCollectionAndStorage類 用於數據的收集和存儲 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class DataCollectionAndStorage { /** * dataCollectAndStore()方法 用於Html數據收集和存儲 */ public void dataCollectAndStore() { // 首先用一個字符串 來裝載網頁連接 String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem"; String sqlLeagues = ""; try { // 建立一個url對象來指向 該網站連接 括號裏()裝載的是該網站連接的路徑 // 更多能夠看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html URL url = new URL(strUrl); // InputStreamReader 是一個輸入流讀取器 用於將讀取的字節轉換成字符 // 更多能夠看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html InputStreamReader isr = new InputStreamReader(url.openStream(), "utf-8"); // 統一使用utf-8 編碼模式 // 使用 BufferedReader 來讀取 InputStreamReader 轉換成的字符 BufferedReader br = new BufferedReader(isr); String strRead = ""; // new 一個字符串來裝載 BufferedReader 讀取到的內容 // 定義3個正則 用於獲取咱們須要的數據 String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})"; String regularTwoTeam = ">[^<>]*</a>"; String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>"; //建立 GroupMethod類的對象 gMethod 方便後期調用其類裏的 regularGroup方法 GroupMethod gMethod = new GroupMethod(); //建立DataStructure數據結構 類的對象 用於數據下面的數據存儲 DataStructure ds = new DataStructure(); //建立MySql類的對象 用於執行MySql語句 MySql ms = new MySql(); int i = 0; // 定義一個i來記錄循環次數 即收集到的球隊比賽結果數 int index = 0; // 定義一個索引 用於獲取分離 2個球隊的數據 由於2個球隊正則是相同的 // 開始讀取數據 若是讀到的數據不爲空 則往裏面讀 while ((strRead = br.readLine()) != null) { /** * 用於捕獲日期數據 */ String strGet = gMethod.regularGroup(regularDate, strRead); // 若是捕獲到了符合條件的 日期數據 則打印出來 if (!strGet.equals("")) { //System.out.println("Date:" + strGet); //將收集到的日期存在數據結構裏 ds.date = strGet; // 這裏索引+1 是用於獲取後期的球隊數據 ++index; // 由於在html頁面裏 源代碼裏 球隊數據是在恰好在日期以後 } /** * 用於獲取2個球隊的數據 */ strGet = gMethod.regularGroup(regularTwoTeam, strRead); if (!strGet.equals("") && index == 1) { // 索引爲1的是主隊數據 // 經過subtring方法 分離出 主隊數據 strGet = strGet.substring(1, strGet.indexOf("</a>")); //System.out.println("HomeTeam:" + strGet); // 打印出主隊 //將收集到的主隊名稱 存到 數據結構裏 ds.homeTeam = strGet; index++; // 索引+1以後 爲2了 // 經過subtring方法 分離出 客隊 } else if (!strGet.equals("") && index == 2) { // 這裏索引爲2的是客隊數據 strGet = strGet.substring(1, strGet.indexOf("</a>")); //System.out.println("AwayTeam:" + strGet); // 打印出客隊 //將收集到的客隊名稱 存到數據結構裏 ds.awayTeam = strGet; index = 0; //收集完客隊名稱後 須要將索引還原 用於收集下一條數據的主隊名稱 } /** * 用於獲取比賽結果 */ strGet = gMethod.regularGroup(regularResult, strRead); if (!strGet.equals("")) { // 這裏一樣用到了substring方法 來剔除'<' 和 "</TD>" 標籤 來獲取咱們想要的比賽結果 strGet = strGet.substring(1, strGet.indexOf("</TD>")); //System.out.println("Result:" + strGet); ds.result = strGet; //將收集到的比賽結果存到數據結構裏 //System.out.println(); //MySql插入語句 sqlLeagues = "INSERT INTO Premiership values(\"" + ds.date + "\"," + "\"" + ds.homeTeam + "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")"; //調用MySql類的datatoMySql()方法 來執行 MySql插入語句 ms.datatoMySql(sqlLeagues); i++; //每插入完一條記錄 i+1; System.out.println("第"+i+"條數據插入成功"); } } // 當讀完數據後 記得關閉 BufferReader br.close(); //System.out.println("共收集到" + i + "條比賽記錄");// 打印出循環次數 //當數據存儲完成後 打印出 收集球隊記錄數 System.out.println("數據存儲完畢,共插入數據庫"+i+"條記錄"); } catch (IOException e) { // 若是出錯 拋出異常 e.printStackTrace(); } } }
DataQuery類 裏面有4個方法
DataQuery 類 import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Vector; /** * DataQuery 類 用於查詢數據庫裏的信息 包含了不一樣的方法 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class DataQuery { /** * 用於清空數據庫裏比賽結果 */ public void initialDataBase() { String initialSql = "delete from premiership"; MySql ms = new MySql(); try { //MySql類裏 提供了一個 刪除數據的 方法 executeUpdate() ms.datatoMySql(initialSql); System.out.println("數據庫清空成功!"); } catch (Exception e) { System.out.println("數據庫清空失敗!"); } } /** * 用於 獲取當前數據庫裏一共有多少球隊 方便後期查看本身喜歡的球隊比賽成績 * @return 全部的參與過比賽的球隊名 */ public Vector<String> getAllTeams() { //使用一個向量來 存取 從數據庫中讀到的值 Vector<String> vecAllTeams = new Vector<String>(); String allteamsSql = "select HomeTeam,AwayTeam from premiership group by HomeTeam;"; ResultSet rs = null; MySql ms = new MySql(); //調用 MySql類裏 查看數據的方法 rs = ms.queryMySql(allteamsSql); try { //若是 ResultSet數據集裏的數據不爲空 則獲取相應的 數據 添加到 向量vecAllTeams裏 while (rs.next()) { if (!vecAllTeams.contains(rs.getString("HomeTeam"))) vecAllTeams.add(rs.getString("HomeTeam")); else if (!vecAllTeams.contains(rs.getString("AwayTeam"))) vecAllTeams.add(rs.getString("AwayTeam")); } } catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } //返回 取到的全部結果 return vecAllTeams; } /** * 查看具體的球隊比賽結果 * @param league * @return 具體球隊的全部比賽結果 */ public Vector<String> querySpecifiedTeam(String league) { //建立一個向量 來裝載 從數據庫中 讀到的數據 Vector<String> lsMatches = new Vector<String>(); String specifiedTeamSql = "select * from premiership where HomeTeam ='" + league + "' or AwayTeam ='" + league + "'"; MySql ms = new MySql(); ResultSet rs = null; rs = ms.queryMySql(specifiedTeamSql); try { while (rs.next()) { lsMatches.add(rs.getString("Date")); lsMatches.add(rs.getString("HomeTeam")); lsMatches.add(rs.getString("AwayTeam")); lsMatches.add(rs.getString("Result")); } } catch (SQLException e) { e.printStackTrace(); } return lsMatches; } /** * 查看 某一天的 比賽結果 * @param date * @return 某一天的全部比賽結果 */ public List<String> queryByDate(String date) { //使用一個 list泛型來裝載 比賽結果 List<String> lsMatchesOnDate = new ArrayList<String>(); String sqlDate = "SELECT * FROM premiership WHERE Date ='" + date + "'"; //建立一個ResultSet數據集 用來 獲取查詢到的結果集 ResultSet rs = null; MySql ms = new MySql(); //調用 MySql 類裏的 查看數據庫數據的方法 rs = ms.queryMySql(sqlDate); try { //若是 ResultSet數據集 不爲空 while (rs.next()) { //則 從ResultSet數據集 中取出 相應的 字段值 添加到 list泛型裏 lsMatchesOnDate.add(rs.getString("Date")); lsMatchesOnDate.add(rs.getString("HomeTeam")); lsMatchesOnDate.add(rs.getString("AwayTeam")); lsMatchesOnDate.add(rs.getString("Result")); } } catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } //最後 返回 取到的全部比賽數據結果 return lsMatchesOnDate; } }
DataStructure類 一個簡單的數據結構 用於收集到數據的臨時性存儲
DataStructure 類 /** * DataStructure 類 一個簡單的數據結構 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class DataStructure { //定義數據字段 public String homeTeam; public String awayTeam; public String date; public String result; }
GroupMethod類 裏面包含了regularGroup() 方法 用於匹配並獲取 html的數據
GroupMethod 類 import java.util.regex.Matcher; import java.util.regex.Pattern; /** * GroupMethod 類 用於匹配和抓取 html頁面的數據 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class GroupMethod { // 傳入2個字符串參數 一個是pattern(咱們使用的正則) 另外一個matcher是html源代碼 public String regularGroup(String pattern, String matcher) { Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(matcher); if (m.find()) { // 若是讀到 return m.group();// 返回捕獲的數據 } else { return ""; // 不然返回一個空字符串 } } }
MySql類 裏面含有2個方法
MySql 類 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * MySql類用於實施MySql數據庫操做 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class MySql { // 定義MySql驅動,數據庫地址,數據庫用戶名 密碼, 執行語句和數據庫鏈接 public String driver = "com.mysql.jdbc.Driver"; public String url = "jdbc:mysql://127.0.0.1:3306/htmldatacollection"; public String user = "root"; public String password = "root"; public Statement stmt = null; public Connection conn = null; /** * 建立一個插入數據的方法 executeUpdate() * @param insertSQl */ public void datatoMySql(String insertSQl) { try { try { Class.forName(driver).newInstance(); } catch (Exception e) { System.out.println("沒法找到驅動器"); e.printStackTrace(); } // 建立鏈接 conn = DriverManager.getConnection(url, user, password); // 建立一個 Statement 對象來將 SQL 語句發送到數據庫 stmt = conn.createStatement(); // 執行SQL 插入語句 stmt.executeUpdate(insertSQl); // 執行完 中止執行語句 stmt.close(); // 執行完關閉數據庫鏈接 conn.close(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } /** * 建立一個用於select查看數據的方法 executeQuery(); * @param strSelect * @return ResultSet */ public ResultSet queryMySql(String strSelect) { // 建立一個數據集 用於獲取查詢到的行數據 ResultSet rs = null; try { Class.forName(driver).newInstance(); } catch (Exception e) { System.out.println("沒法找到驅動器!"); e.printStackTrace(); } try { // 建立鏈接 conn = DriverManager.getConnection(url, user, password); // 建立一個 Statement 對象來將 SQL 語句發送到數據庫 stmt = conn.createStatement(); // 執行查詢語句 獲取ResultSet對象 rs = stmt.executeQuery(strSelect); } catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } //返回結果集 return rs; } }
Main 主函數 用於數據輸出
Main 主函數 import java.util.List; import java.util.Scanner; import java.util.Vector; /** * Main 主函數 用於數據的輸出 * @author SoFlash - 博客園 http://www.cnblogs.com/longwu */ public class Main { public static void main(String[] args) { DataCollectionAndStorage dcs = new DataCollectionAndStorage(); DataQuery dQuery = new DataQuery(); while (true) { System.out.println("清空數據庫-請按1"); System.out.println("收集英超比賽數據-請按2"); System.out.println("查看英超全部球隊-請按3"); System.out.println("查看具體球隊比賽結果-請按4"); System.out.println("查看某一天的比賽-請按5"); // Scanner 文本掃描器 用於讀取 用戶的輸入 Scanner sc = new Scanner(System.in); int intInput = sc.nextInt(); if (intInput == 1) { dQuery.initialDataBase(); System.out .println("---------------------------------------------"); } else if (intInput == 2) { dcs.dataCollectAndStore(); System.out .println("---------------------------------------------"); } else if (intInput == 3) { //獲取 查詢到的全部球隊名稱 Vector<String> vecAllTeams = dQuery.getAllTeams(); if (vecAllTeams.size() != 0) { System.out.println("參加過比賽的球隊以下:"); System.out .print("-----------------------------------------------"); System.out .print("-----------------------------------------------\r\n"); for (int i = 0; i < vecAllTeams.size(); i++) { if (i % 7 == 0 && i != 0) { System.out.println("\r\n"); } System.out.print(vecAllTeams.get(i) + "\t"); } } else System.out.print("數據庫目前沒有數據,請按2收集數據!"); System.out .print("\r\n---------------------------------------------"); System.out .println("-----------------------------------------------\r\n"); } else if (intInput == 4) { System.out.println("請輸入你要查看的球隊"); Scanner scLeague = new Scanner(System.in); String strLeague = scLeague.next(); //獲取 具體球隊的比賽結果 Vector<String> lsResult = dQuery.querySpecifiedTeam(strLeague); if (lsResult.size() != 0) { System.out.println("日期\t\t\t主隊\t\t客隊\t\t比分"); for (int i = 0; i < lsResult.size(); i++) { if (i % 4 == 0 && i != 0) System.out.println(); System.out.print(lsResult.get(i) + "\t\t"); } } else System.out.println("沒有相關球隊的記錄或數據庫沒有數據!"); System.out .println("\r\n---------------------------------------------------"); } else if (intInput == 5) { System.out.println("請輸入你要查看的比賽日期 例子格式[14.01.2012]"); Scanner scDate = new Scanner(System.in); String strDate = scDate.next(); //獲取具體日期下的 全部比賽 List<String> lsResulOnDate = dQuery.queryByDate(strDate); if (lsResulOnDate.size() != 0) { System.out.println("日期\t\t\t主隊\t\t客隊\t\t比分"); for (int i = 0; i < lsResulOnDate.size(); i++) { if (i % 4 == 0 && i != 0) System.out.println(); System.out.print(lsResulOnDate.get(i) + "\t\t"); } } else System.out.println("該天沒有比賽 或 數據庫沒有數據!"); System.out .println("\r\n---------------------------------------------------"); } } } }
運行程序
輸入1 清空數據
輸入2 開始收集數據 並存入數據庫 - 初始階段
開始收集數據 並存入數據庫 - 結束階段
輸入3 查看全部參與過比賽的球隊
輸入4 再輸入要查看的具體球隊 這裏查看的是 Swansea
輸入5 再輸入查看具體的日期 這裏是 02.01.2012
輸入1 咱們測試下清空數據的效果 這裏顯示清空成功
輸入3 查看下是否 真正在數據庫中成功清空數據 結果顯示 數據庫目前沒有數據
這樣,咱們的數據查詢功能也作好了
原文地址:http://www.cnblogs.com/longwu/archive/2012/01/21/2328395.html