【介紹】
1. PreparedStatement 是 java.sql 提供的一個介面(Interface),
用來執行SQL語法。
2. 透過調用 connection.prepareStatement(sql) 方法,
可以回傳 PreparedStatement。
3. PreparedStatement的 executeUpdate() 方法可用來建立、修正、刪除資料;
而 PreparedStatement的 executeQuery() 方法可用來查詢資料。
--------------------------------------------------------------------------
--------------------------------------------------------------------------
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檔
--------------------------------------------------------------------------
2.//建立Pokemon基本資料表
pdb.createPokemonBaseDataTable(conn);
執行結果:產生資料表(在 SQLiteStudio 開啟)
--------------------------------------------------------------------------
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 開啟)
--------------------------------------------------------------------------
4. //列出Pokemon基本資料表的所有資料
pdb.queryPokemonBaseData(conn);
執行結果:
==========================================================================
【參考資料】
1.JDBC为什么要使用PreparedStatement而不是Statement
2.execute、executeQuery和executeUpdate之间的区别