ResultSet結果集對象,封裝結果。它是怎么做到封裝結果的呢?
游標,類似指針索引
最初指在“列名”上,要取到數據就需要讓游標向下移動
移動后就指向了第一行數據,然后通過一些方法把第一行的每一列都取出來。
一次只能獲取一行中的一列數據
這個過程就涉及到了兩類方法,移動和獲取
移動:
next():游標向下移動一行,判斷當前行是否為最后一行(判斷是否有數據)。如果是返回false,不是則返回ture
獲取:
getXXX(參數):獲取數據
XXX代表數據類型,例如表格中的name 用getString
參數有兩種情況
int:代表列的編號(從1開始),getString(1)1表示第一列
string:代表列的名稱,getString("列名")
注意使用步驟:
①游標向下移動一行
②判斷是否有數據
③獲取數據
while (rs.next()){①② //獲取數據 String str = rs.getString(1); int i = rs.getInt(2); double d = rs.getDouble(3); System.out.println(str+" "+i+" "+d); }
基本使用
package cn.itcast.jdbc; import java.sql.*; /* * DDL語句 * */ public class JdbcDemo6 { public static void main(String[] args) { //聲明數據庫連接對象 Connection conn = null; //聲明數據庫執行對象 Statement stmt = null; //聲明結果集對象 ResultSet rs = null; try { //1.注冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲取數據庫連接對象 conn = DriverManager.getConnection("jdbc:mysql:///myemployees", "root", "ROOT"); //3.定義SQL String sql ="select * from job_grades;"; //4.獲取執行SQL的對象 stmt = conn.createStatement(); //5.執行SQL rs= stmt.executeQuery(sql); //6.處理返回結果 //6.1讓游標向下移動一行 rs.next(); //6.2獲取數據 String str = rs.getString(1); int i = rs.getInt(2); double d = rs.getDouble(3); System.out.println(str+" "+i+" "+d); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7.釋放資源,最后用的最先釋放 if (rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
正確使用
package cn.itcast.jdbc; import java.sql.*; public class JdbcDemo7 { public static void main(String[] args) { //聲明數據庫連接對象 Connection conn = null; //聲明數據庫執行對象 Statement stmt = null; //聲明結果集對象 ResultSet rs = null; try { //1.注冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲取數據庫連接對象 conn = DriverManager.getConnection("jdbc:mysql:///myemployees", "root", "ROOT"); //3.定義SQL String sql ="select * from job_grades;"; //4.獲取執行SQL的對象 stmt = conn.createStatement(); //5.執行SQL rs= stmt.executeQuery(sql); //6.處理返回結果 //循環判斷游標是否是最后一行末尾 while (rs.next()){ //獲取數據 String str = rs.getString(1); int i = rs.getInt(2); double d = rs.getDouble(3); System.out.println(str+" "+i+" "+d); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //7.釋放資源,最后用的最先釋放 if (rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
練習
package cn.itcast.domain; import java.util.Date; /* * 封裝Beauty表數據的JavaBean類 * */ public class Beauty { private int id; private String name; private char sex; private Date borndate; private double phone; private int boyfriend_id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public Date getBorndate() { return borndate; } public void setBorndate(Date borndate) { this.borndate = borndate; } public double getPhone() { return phone; } public void setPhone(int phone) { this.phone = phone; } public int getBoyfriend_id() { return boyfriend_id; } public void setBoyfriend_id(int boyfriend_id) { this.boyfriend_id = boyfriend_id; } @Override public String toString() { return "Beauty{" + "id=" + id + ", name='" + name + '\'' + ", sex=" + sex + ", borndate=" + borndate + ", phone=" + phone + ", boyfriend_id=" + boyfriend_id + '}'; } }
封裝類用的util包下的date
項目中返回的sql下的date
sql下的date是util下date的子類,父類可以接受子類對象。直接封裝就行了
package cn.itcast.jdbc; import cn.itcast.domain.Beauty; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * 定義一個方法,查詢beauty表的數據將其封裝為對象,然后裝載集合返回 */ public class JDBCDemo8 { public static void main(String[] args) { List<Beauty> list = new JDBCDemo8().findAll(); System.out.println(list); System.out.println(list.size()); } /** * 查詢所有beauty對象 */ public List<Beauty> findAll() { Connection conn = null; Statement stmt = null; ResultSet rs = null; List<Beauty> list = null; try { //1.注冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲取連接 conn = DriverManager.getConnection("jdbc:mysql:///girls", "root", "ROOT"); //3.第一SQL String sql = "select * from beauty"; //4.獲取執行SQL的對象 stmt = conn.createStatement(); //5.執行SQL rs = stmt.executeQuery(sql); //7.封裝對象 Beauty beauty = null; //6.遍歷結果集,封裝對象,裝載集合 list = new ArrayList<Beauty>(); while (rs.next()) {//判斷是否有下一行,有就執行,沒有就結束執行下面的語句 //獲取數據 //名字要和數據庫保持一致,和封裝類沒有關系 int id = rs.getInt("id"); String name = rs.getString("name"); Date borndate = rs.getDate("borndate"); int boyfriend_id = rs.getInt("boyfriend_id"); // Beauty beauty = new Beauty(); /* * 如果寫在這就會占用很多棧內存(new的對象都在棧內存) * 寫在第七步的位置 * */ //創建對象並賦值 beauty = new Beauty(); beauty.setId(id); beauty.setName(name); beauty.setBorndate(borndate); beauty.setBoyfriend_id(boyfriend_id); //裝載集合 list.add(beauty); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return list; } }