zoukankan      html  css  js  c++  java
  • 【JDBC】向数据表插入数据时,自动获取生成的主键

    1. 数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键;
    2. 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid);
    3. 当我们没有指定哪一列作为主键key时,数据表可能会含有一个隐含的主键(或者叫唯一键值);
    当我们向数据表中插入数据时,对于每一条记录,都会有一个主键与之对应,那么我们如何在向数据表中插入数据时,获取到数据库自动分配的主键呢?

    如下给出示例:

    11.png

    上面使用到了PreparedStatement来执行SQL插入,关于PreparedStatement与Statement的用法与区别,可以参考文章:
    这里不多介绍;
    只需要大体知道一些:
    1. PreparedStatement可以写参数化查询,比Statement能获得更好的性能;
    2. 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
    3. PreparedStatement可以防止SQL注入式攻击;
    4. PreparedStatement可以写动态查询语句;
    5. PreparedStatement与java.sql.Connection对象是关联的,一旦你关闭了connection,PreparedStatement也没法使用了。
    6. PreparedStatement查询默认返回FORWARD_ONLY的ResultSet,你只能往一个方向移动结果集的游标。当然你还可以设定为其他类型的值如:”CONCUR_READ_ONLY”。
    7. 占位符的索引位置从1开始而不是0,如果填入0会导致*java.sql.SQLException invalid column index*异常。所以如果PreparedStatement有两个占位符,那么第一个参数的索引时1,第二个参数的索引是2.

    KeyHolder是一个接口,下面是它的代码:

    22.png
    GeneratedKeyHolder是KeyHolder接口的默认实现类,他的函数作用如下:
    33.png
    当执行insert语句时,会自动将数据库自动产生的key值保存在GeneratedKeyHolder对象对象中,如下是jdbcTemplete.update()的源码:

    44.png











  • 相关阅读:
    4.启动虚拟机 设置CentOS7
    Mybatis-09-缓存
    Mybatis-08-动态SQL
    Mybatis-07-多对一和一对多处理
    Mybatis-06-Lombok
    Mybatis-05-使用注解开发
    Mybatis-04-分页
    Mybatis-03-日志
    Mybatis-02-CRUD及配置解析
    Mybatis-01-什么是Mybatis以及第一个Mybatis
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/4952179.html
Copyright © 2011-2022 走看看