201521123013 《Java程序設計》第14周學習總結

1. 本週學習總結

2. 書面做業

Q1. MySQL數據庫基本操做

1.1 創建數據庫,將本身的姓名、學號做爲一條記錄插入。(截圖,需出現本身的學號、姓名)

1.2 在本身創建的數據庫上執行常見SQL語句(截圖)

Q2. 使用JDBC鏈接數據庫與Statement

2.1 使用Statement操做數據庫。(粘貼一段你認爲比較有價值的代碼,出現學號)

//2015013
public static int insert(Student stu) throws SQLException{
         conn = DriverManager
                    .getConnection(url,userName,password);
                    //sql語句使用拼接的方式
            String strsql="insert into student(stuno,name,age,birthdate)"
                    + " values('"+stu.getStuno()+"','"+stu.getName()+"',"+stu.getAge()+",'"+stu.getBirthdate()+"')";
            System.out.println(strsql);
            st=conn.createStatement();
            resultNum=st.executeUpdate(strsql);
        return resultNum;
    }

運行結果:
java

2.2 使用JDBC操做數據庫主要包含哪幾個步驟?

  1. 加載jdbc驅動
  2. 得到數據庫鏈接,URL用來標識數據庫
  3. 建立Statement,執行sql語句
  4. 處理結果
  5. 釋放資源

Q3. PreparedStatement與參數化查詢

3.1 使用PreparedStatement根據用戶指定的查詢條件進行查詢。(粘貼一段你認爲比較有價值的代碼,出現學號)

//2015013
String sql="select * from student where name=?";
        pst=conn.prepareStatement(sql);
        pst.setString(1, name);
        rs=pst.executeQuery();  
        Student student=null;
        //while(rs.next())必須寫,不然出現Before start of result set,由於rs是鏈式存儲,一開始指針不在第一個數據位置,因此必須next()才能取得數據
        while(rs.next()){
            student=new Student(rs.getString("stuno"),rs.getString("name"),rs.getInt("age"),rs.getDate("birthdate"));
        }
    ...
    String sql="select * from student where birthdate between ? and ?";
        pst=conn.prepareStatement(sql);
        pst.setDate(1, java.sql.Date.valueOf(begin));
        pst.setDate(2, java.sql.Date.valueOf(end));
     ...

運行結果:

mysql

3.2 批量更新-批量插入1000個學生,統計整個操做所消耗的時間。(使用方法executeBatch)

//2015013
public void batchTest() throws ClassNotFoundException {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            con = DriverManager.getConnection(url, userName, password);
            con.setAutoCommit(false);
            pstmt = con.prepareStatement(strSql);
            for (int i = 0; i < 1000; i++) {
                pstmt.setString(1, "2015022");
                pstmt.setString(2, "郭雅清");
                pstmt.setInt(3, 11);
                pstmt.setDate(4, java.sql.Date.valueOf("2000-09-02"));
                pstmt.addBatch();
            }
            pstmt.executeBatch();
            con.commit();

        } catch (SQLException sqlE) {
            sqlE.printStackTrace();
        } finally {
          realeaseAll(rs,pst,conn);
    }

Q4. JDBCUtil與DAO

4.1 粘貼一段你認爲比較有價值的代碼,出現學號

//2015013
@Override
    public int add(Student stu) {
        // TODO Auto-generated method stub
        Connection conn=null;
        PreparedStatement pst=null;
        String sql="insert into students(name) values(?)";
        int result=1;
        try {
            conn=JDBCUtil.getConnection();
            pst=conn.prepareStatement(sql);
            pst.setString(1, stu.getName());
            result=pst.executeUpdate();
            if(result<0){
                result=-1;
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtil.realeaseAll(null, pst, conn);
        }
        return result;
    }
            ...
        public Map<String,Student> fun(List<Student> stulist){
        Map<String,Student> map=new HashMap<String,Student>();
        for (int i = 0; i < stulist.size(); i++) {
            map.put(stulist.get(i).getName(),stulist.get(i));
        }
        return map;
    }

運行結果:
sql

4.2 使用DAO模式訪問數據庫有什麼好處?

  • 數據訪問和業務邏輯分離,便於數據維護,業務邏輯不須要了解訪問細節,如數據源是數據庫、文件、數組、List等。

Q5. 使用數據庫改造購物車系統

5.1 使用數據庫改造之前的購物車系統(應有圖形界面)。若是之前爲完成購物車系統,可編寫基於數據庫的學生管理系統。包括對學生的增刪改查,要求使用。

界面:

管理員(插入、刪除):


用戶(讀取):

數據庫

5.2 相比較使用文件,使用數據庫存儲與管理數據有何不同?

  • 使用文件,數據冗餘度答,浪費存儲空間,而使用數據庫存儲,數據是面向整個系統的,數據能夠被多個用戶、應用共享,減小冗餘。
  • 當使用文件時,當文件變大時,使用文件訪問速度會變得很慢,而使用數據庫訪問速度比使用文件訪問更快。

選作:6. 批量更新測試

數據庫課程上,須要測試索引對查找的加速做用。然而在幾百或幾千的數據量上進行操做沒法直觀地體驗到索引的加速做用。現但願編寫一個程序,批量插入1000萬條數據,且該數據中的某些字段的內容能夠隨機生成。

6.1 截圖你的代碼(出現學號)、統計運行時間


6.2 計算插入的速度到底有多快?(以條/秒、KB/秒兩種方式計算)

  • 約5747條/秒
  • ibd文件(數據+索引)

選作:7. 事務處理

7.1 使用代碼與運行結果證實你確實實現了事務處理功能。(粘貼一段你認爲比較有價值的代碼,出現學號)

//2015013
    public static void transfer(Account a, Account b, double x) throws Exception
    {
        String sql1="update account set balance=? where name=?";
        String sql2="update account set balance=? where name=?";
        try {
            conn=DriverManager.getConnection(url, userName, password);
            conn.setAutoCommit(false);
            if(a.getBalance()>=x){
                pst = conn.prepareStatement(sql1);
                pst.setDouble(1, a.getBalance()-x);
                pst.setString(2, a.getName());
                pst.executeUpdate();
                pst = conn.prepareStatement(sql2);
                pst.setDouble(1, b.getBalance()+x);
                pst.setString(2, b.getName());
                pst.executeUpdate();
                conn.commit();
                System.out.println("轉帳成功");
            }else{
                throw new SQLException("餘額不足");
            }
        }catch (SQLException e){
            e.printStackTrace();
            if (conn != null) {
                try{
                    System.err.print("事務正在回滾");
                    conn.rollback();
                } catch(SQLException excep) {
                    excep.printStackTrace();
                }
            }
        }
        finally {
            pst.close();
            conn.close();
        }
    }

7.2 你以爲何時須要使用事務處理?

事務是併發控制的單位,是用戶自定義的一個操做序列,這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。當須要對數據庫進行統一的提交和回滾時,好比當進行轉帳時,必須帳戶兩邊更改數據,要麼成功要麼失敗,若是某一操做出錯,則回滾以前全部的操做。數組

3. 碼雲

3.1. 碼雲代碼提交記錄

相關文章
相關標籤/搜索