- 数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键;
- 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid);
- 当我们没有指定哪一列作为主键key时,数据表可能会含有一个隐含的主键(或者叫唯一键值);
当我们向数据表中插入数据时,对于每一条记录,都会有一个主键与之对应,那么我们如何在向数据表中插入数据时,获取到数据库自动分配的主键呢?
如下给出示例:
上面使用到了PreparedStatement来执行SQL插入,关于PreparedStatement与Statement的用法与区别,可以参考文章:
这里不多介绍;
只需要大体知道一些:
- PreparedStatement可以写参数化查询,比Statement能获得更好的性能;
- 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
- PreparedStatement可以防止SQL注入式攻击;
- PreparedStatement可以写动态查询语句;
- PreparedStatement与java.sql.Connection对象是关联的,一旦你关闭了connection,PreparedStatement也没法使用了。
- PreparedStatement查询默认返回FORWARD_ONLY的ResultSet,你只能往一个方向移动结果集的游标。当然你还可以设定为其他类型的值如:”CONCUR_READ_ONLY”。
- 占位符的索引位置从1开始而不是0,如果填入0会导致*java.sql.SQLException invalid column index*异常。所以如果PreparedStatement有两个占位符,那么第一个参数的索引时1,第二个参数的索引是2.
KeyHolder是一个接口,下面是它的代码:
GeneratedKeyHolder是KeyHolder接口的默认实现类,他的函数作用如下:
当执行insert语句时,会自动将数据库自动产生的key值保存在GeneratedKeyHolder对象对象中,如下是jdbcTemplete.update()的源码: