天天看點

JDBC 傳回主鍵

上一節課裡我們學習通過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>