● 接續昨日-java連資料庫
Connection=>連線"jdbc"
DriverManager=> 連線"jdbc"
PreparedStatement=>寫入資料庫
=>輸入資料時,是用 PreparedStatement寫入,然後再透過 Connection連接資料庫,經由 DriverManager把輸入的資料丟到資料庫裡,這就是串接
 
Statement=>搭配已讀取資料庫
ResultSet=>搭配已讀取資料庫
 
● 讓使用者輸入的資料可以送至資料庫
 private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  int ID=Integer.parseInt(id.getText());
  int CHI=Integer.parseInt(chi.getText());
  int ENG=Integer.parseInt(eng.getText());
  String NAME=name.getText();
  String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setInt(1, ID);
  ps.setString(2, NAME);
  ps.setInt(3, CHI);
  ps.setInt(4, ENG);
  ps.executeUpdate();
  System.out.print("ok");
 
  ps.close();
  conn.close();
  }catch(SQLException e){
  System.out.print("no");
  }
  }
**說明:
1.有些連線會寫在建構式,為了不要占用server資源,執行完就做斷線: ps.close(); conn.close();
2.url的說明
jdbc:mysql:=>確認是否有載入java msyql的驅動程式
//localhost:3306=>主機名稱:port
/school=>資料庫名稱
 
● 沒有輸入資料,空白送出,會出現Exception:數字無法格式化
  private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
  try{
  int ID=Integer.parseInt(id.getText());
  int CHI=Integer.parseInt(chi.getText());
  int ENG=Integer.parseInt(eng.getText());
  String NAME=name.getText();
  Connection conn=DriverManager.getConnection(url, user, password);
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setInt(1, ID);
  ps.setString(2, NAME);
  ps.setInt(3, CHI);
  ps.setInt(4, ENG);
  ps.executeUpdate();
  System.out.print("ok");
 
  ps.close();
  conn.close();
 
  }catch(SQLException e){
  msg.setText("編號不可重複");
  }catch(NumberFormatException e){
  msg.setText("資料不可為空白");
  }
  }
 
**說明:
1.要用catch去捕捉Exception
2.在介面上新增一個label位置(variable name),先不顯示文字
3.將錯誤訊息資料用setText()顯示到介面上
4.因為是在輸入時錯誤,所以getText()都要放到try裡面
5.因為 SQLException只檢查連線到資料庫是否成功和輸入的資料和資料庫設定的規則是否衝突,所以測試連線成功後,後面的catch捕捉到的一定是規則衝突,我們這邊只設定編號不能重複,所以內容可以改為 msg.setText("編號不可重複");
 
●抓資料
1.先做介面,一個顯示button (variable name:show) 和一個顯示文字區域(variable name:ans)
 
2.建立連線,和抓Exception,測試連線ok
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
 
 
3.匯入Statement和ResultSet,透過Connection下的 createStatement()物件來和Statement連接,測試ok
  import java.sql.Statement;
  import java.sql.ResultSet; 
 
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  System.out.print("ok");
  }
  catch(SQLException e){
  }
**說明:
String sql="select id,name,chi,eng from student";
=> select 欄位名稱 from 資料表名稱(因為已經連上資料庫,所以可以省略資料庫名稱)
 
4.找資料和抓資料
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  rs.next();
  System.out.println("編號:"+rs.getInt("id")+"\t名字:"+
  rs.getString("name")+"\t國文:"+rs.getInt("chi")+"\t英文:"+rs.getInt("eng"));
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
**說明:
1.Statement中有一個executQuery(String sql),可以放入sql語法來找資料庫的資料,
但抓出來的資料類型為ResultSet,因為Statement沒有提供顯示的動作,所以要透過ResultSet 中的getxxxx方法來抓資料出來顯示,這樣一個傳給一個就是串接的概念
2. ResultSet 中的next()是用來判斷目前連線是否有資料,有資料會回true,才會跑下面get方法,如果沒有做這個動作就會有Exception
3.getInt(String columLable),代表()內要放欄位名稱且為字串 ex: rs.getInt("id")
4.先用System.out.println在主控台測試輸出一筆資料,目前只能一次輸出一筆資料
 
5.要一次能輸出全部資料
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  while(rs.next()){
  System.out.println("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng"));
  }
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
**說明:
第四步驟的做法每次都只能輸出同一筆資料,原因在於判斷哪一筆資料是由rs.next()在做,當此時這筆資料判斷有收到就會執行下一步驟,可是沒有再去判斷下一筆是否有資料,就會一直停留在第一筆,所以變成每執行一次println就要再run一次rs.next(),所以可以用while迴圈來解決這個問題
 
6.改為顯示到使用者介面
while(rs.next()){
  ans.setText("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng"));
  }
**說明:
如果直接這樣改,會只顯示最後一筆,因為每撈出一筆資料就會把上一筆資料給覆蓋過去
 
要做成
 
  import java.util.ArrayList;
 
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  ArrayList<String> x=new ArrayList<String>();
  while(rs.next()){
  x.add("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng")+"\n");
  }
  ans.setText(x.toString());
  System.out.print("ok");
  rs.close();
  st.close();
  conn.close();
 
  }
  catch(SQLException e){
  }
  }
 
**說明:
為了避免被下一筆資料蓋過,改用collection的 ArrayList,把資料收集後全部放在x中,這時x是資料集合的物件,所以不能直接 用setText() 把內容顯示出來,要透過toString()把物件轉成字串                             
 
**另一種做法
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  String s="";
 
  while(rs.next()){
  String a="編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng")+"\n";
  s=s+a;
  }
  ans.setText(s);
  System.out.print("ok");
  rs.close();
  st.close();
  conn.close();
  }
  catch(SQLException e){
  }   
 
**說明:
1.先預設變數s為空值
2.把所有的欄位值丟到變數a(區域變數),再把a丟給s,用setText(s)輸出所有抓出來的資料
 
 
arrow
arrow
    文章標籤
    JAVA MySQL jDBC
    全站熱搜
    創作者介紹
    創作者 muchone 的頭像
    muchone

    簡單。生活。享受

    muchone 發表在 痞客邦 留言(0) 人氣()