上一节课里我们学习通过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>