close

【介紹】

1. PreparedStatement 是 java.sql 提供的一個介面(Interface),
用來執行SQL語法。

2. 透過調用 connection.prepareStatement(sql) 方法,
可以回傳 PreparedStatement。

3. PreparedStatement的 executeUpdate() 方法可用來建立、修正、刪除資料;  
而 PreparedStatement的 executeQuery() 方法可用來查詢資料。
--------------------------------------------------------------------------

PreparedStatement01.jpg

PreparedStatement02.jpg

--------------------------------------------------------------------------
4. PreparedStatement 會讓資料庫對SQL進行預編譯
因此查詢速度會較 Statement 更快,
而且因為 PreparedStatement 可以寫成動態參數化的查詢,
也可以防止 SQL 注入式攻擊
(更多這方面相關介紹,請見最下方的【參考資料】。)
==========================================================================


【使用方法】

一、在 class PokeDB

1. //連結資料庫(字串參數:資料庫名稱)
    public Connection getConn(String url) throws SQLException{
        
        SQLiteConfig sqlLiteConfig = new SQLiteConfig();
        sqlLiteConfig.setSharedCache(true); //設定快取
        
        SQLiteDataSource sqliteDataSource = new SQLiteDataSource();
        sqliteDataSource.setUrl("jdbc:sqlite:db/"+url);        
        System.out.println("連結"+url+"資料庫OK!");
        
        Connection conn=sqliteDataSource.getConnection();        
        return conn;        
    }    
--------------------------------------------------------------------------
2. //建立Pokemon基本資料表     //使用 PreparedStatement

public void createPokemonBaseDataTable(Connection conn) 
                    throws SQLException{

    String sql= //如果Employee資料表不存在才建立
    "CREATE TABLE IF NOT EXISTS Pokemon基本資料表(" + 
    " 編號 INTEGER
PRIMARY KEY,"+ //將 編號 設為主鍵(不可null,不可重複)
    " 名稱     STRING,"+
    " 屬性1 STRING,"+ 
    " 屬性2 STRING," + 
    " 等級     INTEGER," +
    " HP   INTEGER," +
    " ATK  INTEGER," +
    " 攻擊模式 STRING);";

        
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.executeUpdate();
    System.out.println("『Pokemon基本資料表』建立完成!");
}
--------------------------------------------------------------------------
3. //新增Pokemon基本資料    //使用 PreparedStatement
public void insertPokemonBaseData(Connection conn,                          
                String name,    //名稱
                String attribute_1,    //屬性1
                String attribute_2,    //屬性2
                int level,        //等級
                int HP,            //生命值
                int ATK,        //攻擊力
                String attackType     //攻擊模式
                ) throws SQLException{
        
    //7個欄位要填    //編號因為設為 PRIMARY KEY,會自動產生不用填
    String sql=
    "INSERT INTO Pokemon基本資料表 (" +
                " 名稱," +
                " 屬性1, 屬性2, 等級," +
                " HP,   ATK,  攻擊模式)"+
                "
VALUES (?,?,?,?,?,?,?);";
        
    PreparedStatement ps = conn.prepareStatement(sql);
        
    int i=1; //作為欄位序號
    //依序將傳入的方法參數填入欄位
    ps.setString(i++, name);            
    ps.setString(i++, attribute_1);    
    ps.setString(i++, attribute_2);
    ps.setInt(i++, level);
    ps.setInt(i++, HP);
    ps.setInt(i++, ATK);
    ps.setString(i, attackType);

        
    //使用executeUpdate 方法新增資料
    ps.executeUpdate();
        
    System.out.println("Pokemon資料新增成功!");
}
--------------------------------------------------------------------------
4. //查詢Pokemon基本資料表的所有資料    //使用 PreparedStatement
public void queryPokemonBaseData(Connection conn) 
                throws SQLException{
        
    String sql = "SELECT * FROM Pokemon基本資料表;";            
    PreparedStatement ps = conn.prepareStatement(sql);
        
    //使用executeQuery 方法查詢資料
    ResultSet rs = ps.executeQuery();    
        
    System.out.println("---------------------------------------------------------------");        
    //列出標題
    System.out.println("編號\t名稱\t屬性1\t屬性2\t" +
                "等級\tHP\tATK\t攻擊模式");        
    System.out.println("---------------------------------------------------------------");
        
    //列出資料
    while(rs.next()){            
        System.out.print(rs.getInt("編號")+"\t");
        System.out.print(rs.getString("名稱")+"\t");
        System.out.print(rs.getString("屬性1")+"\t");
        System.out.print(rs.getString("屬性2")+"\t");
        System.out.print(rs.getInt("等級")+"\t");
        System.out.print(rs.getInt("HP")+"\t");
        System.out.print(rs.getInt("ATK")+"\t");
        System.out.println(rs.getString("攻擊模式"));        
    }
}
/*************************************************************************/
二、在主程式 (main)

1. //建立與連結資料庫
String url="pokemonDB.db";
PokeDB pdb = new PokeDB(); //PokeDB的方法都在上面喔↑
Connection conn = pdb.getConn(url);

執行結果:出現 pokemonDB.db 資料庫db檔

DB00.jpg
--------------------------------------------------------------------------

2.//建立Pokemon基本資料表
pdb.createPokemonBaseDataTable(conn);

執行結果:產生資料表(在 SQLiteStudio 開啟)

DB01.jpg
--------------------------------------------------------------------------

3. //新增Pokemon基本資料
pdb.insertPokemonBaseData(conn, "地鼠", "地面", null, 70, 326, 435, "遠攻");
pdb.insertPokemonBaseData(conn, "獨角犀牛", "地面", "岩石", 70, 349, 377, "近戰");
pdb.insertPokemonBaseData(conn, "墨海馬", "水", null, 66, 387, 373, "遠攻");
pdb.insertPokemonBaseData(conn, "伊布", "一般", null, 61, 400, 345, "近戰");        
pdb.insertPokemonBaseData(conn, "小拉達", "一般", null, 56, 358, 429, "近戰");        
pdb.insertPokemonBaseData(conn, "小海獅", "水", null, 56, 359, 380, "遠攻");        
pdb.insertPokemonBaseData(conn, "可達鴨", "水", null, 52, 344, 356, "遠攻");        
pdb.insertPokemonBaseData(conn, "臭泥", "毒", null, 51, 340, 291, "近戰");        
pdb.insertPokemonBaseData(conn, "大岩蛇", "地面", "岩石", 47, 889, 386, "遠攻"); 
pdb.insertPokemonBaseData(conn, "小火馬", "火", null, 40, 359, 344, "近戰");    

執行結果:產生資料(在 SQLiteStudio 開啟)

DB02.jpg
--------------------------------------------------------------------------

4. //列出Pokemon基本資料表的所有資料
pdb.queryPokemonBaseData(conn);

執行結果:

DB03.jpg
==========================================================================
【參考資料】

1.JDBC为什么要使用PreparedStatement而不是Statement
2.execute、executeQuery和executeUpdate之间的区别
 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 蕭小牛 的頭像
    蕭小牛

    蕭小牛的部落格

    蕭小牛 發表在 痞客邦 留言(0) 人氣()