該博客僅專為我的小伙伴提供參考而附加,沒空加上代碼具體解析,望各位諒解
1、在MySQL中運行以下腳本
CREATE DATABASE mydatabase;
USE mydatabase;
CREATE TABLE customers (
customerID varchar(8) primary key,
name varchar(40) default NULL,
phone varchar(16) default NULL
);
INSERT INTO customers VALUES ('ADDIFK01','Frank Addinsell',
'(718) 555-3911');
INSERT INTO customers VALUES ('ALBIBB01','Bob Albinoni',
'(213) 555-7566');
使用 JDBC編寫程序讀出數據庫表中數據並在Console下如下輸出內容
2、調試上面實驗指導部分“四、數據庫分層設計”部分代碼
依據上課時教學內容補充SQLHelper類內容,為其增加
1) 執行帶參數的SQL語句方法,含執行Select及CUID兩個函數;
public static ResultSet executeQuery(String sql,Object[] params) { try { rs= getPreparedStatement(sql,params).executeQuery(); return rs; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; } }
2) 為其增加返回唯一值得函數(如計算最大值、記錄數等);
public static Object executeQueryScala(String sql) { Object o=null; try { rs=executeQuery(sql, null); if(rs.next()) { o=rs.getDate(1); } if(o!=null) return o; else return null; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; }finally { DBUtil.closeAll(rs, pst, DBUtil.connection); } }
3) 增加返回集合的函數
public static List<Object[]> executeQueryList(String sql){ Object[] o=new Object[2]; List<Object[]> obs=new ArrayList<Object[]>(); PreparedStatement pst =null; ResultSet rs =null; try { rs = DBUtil.executeQuery(sql, null); while(rs.next()) { /*未知列數 因此提取不出所有*/ o[0]=(rs.getObject(0)); o[1]=(rs.getObject(0)); obs.add(o); } return obs; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; }finally { DBUtil.closeAll(rs, pst, DBUtil.connection); } }
3、運用上面數據庫設計思想,繼續完成上次實驗。以JDBC技術創建一個通訊錄應用程序,要求通訊錄中必須含有編號、姓名,性別、電話、地址、Email等等。實現該類並包含添加、刪除、修改、按姓名查等幾個方法。編寫主程序測試。
該程序體量較小 沒增加server層 (用於連接dao層與view層)
第一步:編寫一個Person聯系人類
package entity; public class Person { private int pid; //編號 private String name; // 姓名 private String sex; // 性別 private String tel; // 電話 private String address; // 地址 private String email; //email public Person(int pid, String name, String sex, String tel, String address, String email) { this.pid = pid; this.name = name; this.sex = sex; this.tel = tel; this.address = address; this.email = email; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Person [pid=" + pid + ", name=" + name + ", sex=" + sex + ", tel=" + tel + ", address=" + address + ", email=" + email + "]"; } }
第二步:編寫一個PersonDao封裝對聯系人類的有關操作
package dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import entity.Person; import util.DBUtil; public class PersonDao { //增加人 public void addPerson(Person p){ String sql="insert into customers values(?,?,?,?,?,?);"; Object params[]= {p.getPid(),p.getName(),p.getSex(),p.getTel(),p.getAddress(),p.getEmail()}; DBUtil.executeUpdate(sql, params); } // 通過人的編號刪除 聯系人 public void deletePersonByID(int pid){ String sql="delete from person where pid=?"; Object params[]= {pid}; DBUtil.executeUpdate(sql,params); } //通過人的姓名查找聯系人,返回一個集合 public List<Person> queryPersonByName(String name){ Person p=null; List<Person> ps=new ArrayList<Person>(); PreparedStatement pst =null; ResultSet rs =null; try { String sql="select * from person where name=?"; Object params[]= {name}; rs = DBUtil.executeQuery(sql, params); while(rs.next()) { int id=rs.getInt("customerID"); String sex=rs.getString("sex"); String tel=rs.getString("tel"); String address=rs.getString("address"); String email=rs.getString("email"); p=new Person(id, name, sex,tel,address,email); ps.add(p); } return ps; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; }finally { DBUtil.closeAll(rs, pst, DBUtil.connection); } } // 查詢所有人 public List<Person> quaryall(){ Person p=null; List<Person> ps=new ArrayList<Person>(); PreparedStatement pst =null; ResultSet rs =null; try { String sql="select * from person"; Object params[]= {}; rs = DBUtil.executeQuery(sql, params); while(rs.next()) { int id=rs.getInt("pid"); String name=rs.getString("name"); String sex=rs.getString("sex"); String tel=rs.getString("tel"); String address=rs.getString("address"); String email=rs.getString("email"); p=new Person(id, name, sex,tel,address,email); ps.add(p); } return ps; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; }finally { DBUtil.closeAll(rs, pst, DBUtil.connection); } } public List<Person> quarybyitems(String strsql) { Person p=null; List<Person> ps=new ArrayList<Person>(); PreparedStatement pst =null; ResultSet rs =null; try { String sql="select * from person where 1=1 "+strsql; Object params[]= {}; rs = DBUtil.executeQuery(sql, params); while(rs.next()) { int id=rs.getInt("pid"); String name=rs.getString("name"); String sex=rs.getString("sex"); String tel=rs.getString("tel"); String address=rs.getString("address"); String email=rs.getString("email"); p=new Person(id, name, sex,tel,address,email); ps.add(p); } return ps; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; }finally { DBUtil.closeAll(rs, pst, DBUtil.connection); } } public boolean update(String strsql) { String sql="insert person values"+strsql; Object[] params= {}; return DBUtil.executeUpdate(sql, params); } }
第三步:編寫一個測試Swing類,有界面使用JTable顯示,參考書本上關於JTable控件的使用
演示截圖
package view; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import dao.PersonDao; import entity.Person; public class TestFrm extends JFrame{ private static final long serialVersionUID = 1L; PersonDao pd=new PersonDao(); JPanel jp1=new JPanel(); Object[] Names1 = {"編號","姓名","性別","電話","地址","email"}; JTable table1; TestFrm(){ JLabel label1=new JLabel("編號"); JLabel label2=new JLabel("姓名"); JLabel label3=new JLabel("性別"); JLabel label4=new JLabel("電話"); JLabel label5=new JLabel("地址"); JLabel label6=new JLabel("email"); JTextField jt1=new JTextField(); JTextField jt2=new JTextField(); JTextField jt3=new JTextField(); JTextField jt4=new JTextField(); JTextField jt5=new JTextField(); JTextField jt6=new JTextField(); JButton jb1=new JButton("查詢"); JButton jb2=new JButton("增加"); JButton jb3=new JButton("刪除"); JButton jb4=new JButton("顯示所有"); jp1.setLayout(new GridLayout(4, 4)); jp1.add(label1); jp1.add(jt1); jp1.add(label2); jp1.add(jt2); jp1.add(label3); jp1.add(jt3); jp1.add(label4); jp1.add(jt4); jp1.add(label5); jp1.add(jt5); jp1.add(label6); jp1.add(jt6); jp1.add(jb1); jp1.add(jb2); jp1.add(jb3); jp1.add(jb4); jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String strsql=""; if(!jt1.getText().isEmpty()) strsql+=" and pid="+jt1.getText(); if(!jt2.getText().isEmpty()) strsql+=" and name='"+jt2.getText()+"'"; if(!jt3.getText().isEmpty()) strsql+=" and sex='"+jt3.getText()+"'"; if(!jt4.getText().isEmpty()) strsql+=" and tel='"+jt4.getText()+"'"; if(!jt5.getText().isEmpty()) strsql+=" and address='"+jt5.getText()+"'"; if(!jt6.getText().isEmpty()) strsql+=" and email='"+jt6.getText()+"'"; List<Person> list = pd.quarybyitems(strsql); reset(list); } }); jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(jt1.getText().isEmpty()||jt2.getText().isEmpty()||jt3.getText().isEmpty()||jt4.getText().isEmpty()||jt5.getText().isEmpty()||jt6.getText().isEmpty()) JOptionPane.showMessageDialog(null, "請輸入完整!!"); else { String strsql="("+jt1.getText()+",\""+jt2.getText()+"\",\""+jt3.getText()+"\",\""+jt4.getText()+"\",\""+jt5.getText()+"\",\""+jt6.getText()+"\")"; if(pd.update(strsql)) { JOptionPane.showMessageDialog(null, "插入成功"); List<Person> list = pd.quaryall(); reset(list); }else { JOptionPane.showMessageDialog(null, "插入失敗"); } } } }); jb3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int pid= (int)table1.getModel().getValueAt(table1.getSelectedRow(), 0); pd.deletePersonByID(pid); List<Person> list = pd.quaryall(); reset(list); } }); jb4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { List<Person> list = pd.quaryall(); reset(list); } }); List<Person> list = pd.quaryall(); reset(list); setTitle("我的通訊錄"); setBounds(600,400,600,350); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } private void reset(List<Person> list){ List<Object[]> b=new ArrayList<Object[]>(); for(Person p:list) { Object[] o= {p.getPid(),p.getName(),p.getSex(),p.getTel(),p.getAddress(),p.getEmail()}; b.add(o); } Object[][] a = (Object[][])b.toArray(new Object[b.size()][]); table1=new JTable(a,Names1); getContentPane().removeAll(); add(jp1,BorderLayout.NORTH); add(new JScrollPane(table1),BorderLayout.CENTER); validate(); } public static void main(String[] args) { new TestFrm(); } }
DBUtil包代碼
此句話作用 用於設置寫入數據庫與讀取數據庫數據編碼
若遇到mysql中文編碼問題 趕緊戳這里解決mysql編碼常見問題分享
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //通用的數據庫操作方法 public class DBUtil { //sql數據庫連接字符串 private static final String URL="jdbc:mysql://127.0.0.1:3306/mydatabase?useUnicode=true&characterEncoding=utf8"; //sql用戶名 和密碼 用作連接用 private static final String USERNAME="root"; private static final String PWD="cc123nice"; public static Connection connection=null; public static PreparedStatement pst =null; public static ResultSet rs =null; /* * 得到PreparedStatement減少代碼冗余 */ public static PreparedStatement getPreparedStatement(String sql,Object[] params) { //導入驅動,加載具體驅動類 try { Class.forName("com.mysql.jdbc.Driver"); //與數據庫建立鏈接 connection = DriverManager.getConnection(URL, USERNAME, PWD); pst=connection.prepareStatement(sql); if(params!=null) { for(int i=0;i<params.length;i++){ pst.setObject(i+1,params[i]); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return pst; } /* * 最后關閉所有 */ public static void closeAll(ResultSet rs,Statement stmt,Connection connection) { try { if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if(connection!=null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } } /* * 通用的增刪改 通過傳入的sql和obj數組確認語句 */ public static boolean executeUpdate(String sql,Object[] params) { try { int count = getPreparedStatement(sql,params).executeUpdate(); if(count>0) return true; else return false; } catch (SQLException e) { e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; }finally { closeAll(null, pst, connection); } } /* * 通用的查詢(只能返回到ResultSet)之后必須與具體類型耦合 */ public static ResultSet executeQuery(String sql,Object[] params) { try { rs= getPreparedStatement(sql,params).executeQuery(); return rs; } catch (SQLException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; } } }