天天看点

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>