上一節課裡我們學習通過preparedstatement對象執行帶參數的查詢sql和修改sql。
這節課我們學習使用 preparedstatement對象執行插入sql,并且傳回主鍵。
要傳回主鍵,有一個前提,就是資料庫表必須有主鍵自增。
下面的代碼示範了執行插入sql并傳回主鍵的用法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>string sql =</code><code>"insert into products(`productname`,`supplierid`,`categoryid`,`unit`,`price`)values(?,?,?,?,?);"</code><code>;</code>
<code>preparedstatement statement =</code>
<code> </code><code>connection.preparestatement(sql,statement.return_generated_keys);</code><code>//加入參數statement.return_generated_keys</code>
<code>statement.setstring(</code><code>1</code><code>,</code><code>"milk"</code><code>);</code><code>//設定參數……</code>
<code>statement.setlong(</code><code>2</code><code>,</code><code>16</code><code>);</code>
<code>statement.setlong(</code><code>3</code><code>,</code><code>1</code><code>);</code>
<code>statement.setstring(</code><code>4</code><code>,</code><code>"500ml"</code><code>);</code>
<code>statement.setbigdecimal(</code><code>5</code><code>,</code><code>new</code> <code>bigdecimal(</code><code>5.6</code><code>));</code>
<code>int</code> <code>value = statement.executeupdate();</code>
<code>system.out.println(</code><code>"受影響的記錄數 "</code><code>+value);</code>
<code>int</code> <code>id =</code><code>0</code><code>;</code>
<code>resultset rs = statement.getgeneratedkeys(); </code><code>//得到生成的主鍵,主鍵放在resultset對象裡</code>
<code>if</code><code>(rs.next()){</code><code>//提取主鍵值</code>
<code> </code><code>id = rs.getint(</code><code>1</code><code>);</code>
<code>}</code>
<code>system.out.println(</code><code>"主鍵 "</code><code>+id);</code>
關鍵技術:
在建立preparedstatement對象時,指定一個常量statement.return_generated_keys,表示有傳回主鍵的能力。
執行sql語句時,仍然調用executeupdate()方法。另外要調用getgeneratedkeys()方法,傳回resultset對象。 resultset對象是結果集,存儲查詢結果,主鍵就儲存在這裡。
第三步,從resultset對象裡提取主鍵。
完整代碼:
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<code>import java.math.bigdecimal;</code>
<code>import java.sql.connection;</code>
<code>import java.sql.drivermanager;</code>
<code>import java.sql.preparedstatement;</code>
<code>import java.sql.resultset;</code>
<code>import java.sql.sqlexception;</code>
<code>import java.sql.statement;</code>
<code>public class insert {</code>
<code> </code><code>public static void main(string[] args) {</code>
<code> </code><code>string url = "jdbc:mysql://127.0.0.1:3306/northwind";</code>
<code> </code><code>string user = "northwind";</code>
<code> </code><code>string password = "northwind";</code>
<code> </code><code>try (connection connection = drivermanager.getconnection(url, user, password)) {</code>
<code> </code><code>string sql = "insert into products(`productname`,`supplierid`,`categoryid`,`unit`,`price`)values(?,?,?,?,?);";</code>
<code> </code><code>preparedstatement statement = connection.preparestatement(sql,statement.return_generated_keys);</code>
<code> </code><code>statement.setstring(1, "milk");</code>
<code> </code><code>statement.setlong(2, 16);</code>
<code> </code><code>statement.setlong(3, 1);</code>
<code> </code><code>statement.setstring(4, "500ml");</code>
<code> </code><code>statement.setbigdecimal(5, new bigdecimal(5.6));</code>
<code> </code><code>int value = statement.executeupdate();</code>
<code> </code>
<code> </code><code>system.out.println("受影響的記錄數 "+value);</code>
<code> </code><code>int id = 0;</code>
<code> </code><code>resultset rs = statement.getgeneratedkeys();</code>
<code> </code><code>if(rs.next()){</code>
<code> </code><code>id = rs.getint(1);</code>
<code> </code><code>}</code>
<code> </code><code>system.out.println("主鍵 "+id);</code>
<code> </code><code>rs.close();</code>
<code> </code><code>statement.close(); // 關閉statement,釋資源</code>
<code> </code><code>} catch (sqlexception e) {</code>
<code> </code><code>e.printstacktrace();</code>
<code> </code><code>}</code>
<code> </code><code>}</code>