获取插入数据时的自增长值

获取插入数据时的自增长值

方式1:   (推荐,简单方便,但是不能使用DbUtils组件)

prepareStatement(String sql, int autoGeneratedKeys) 
  创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
    参数:
sql  - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句
autoGeneratedKeys  - 指示是否应该返回自动生成的键的标志,它是   Statement.RETURN_GENERATED_KEYS  或   Statement.NO_GENERATED_KEYS  之一

   
   
  1. package com.cn.auto_increment;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import org.junit.Test;
  6. import com.cn.Util.JdbcUtil;
  7. /**
  8. * 向数据库插入数据,顺便返回自增长值
  9. * @author liuzhiyong
  10. *
  11. */
  12. public class Demo1 {
  13. @Test
  14. public void testGetAutoIncrement() throws Exception {
  15. Connection conn = null;
  16. PreparedStatement pstmt = null;
  17. ResultSet rs = null;
  18. try {
  19. //获取连接
  20. conn = JdbcUtil.getConnection();
  21. //准备sql
  22. String sql = "insert into users(name, password) values(?,?)";
  23. //创建pstm对象,在参数中指定返回自增长列
  24. pstmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
  25. //设置参数
  26. pstmt.setString(1, "龚玥菲");
  27. pstmt.setString(2, "8888");
  28. //执行sql
  29. pstmt.executeUpdate();
  30. //在执行更新后,获取返回自增长结果集
  31. rs = pstmt.getGeneratedKeys();
  32. if(rs.next()){
  33. System.out.println("刚刚插入数据的自增长编码是:" + rs.getInt(1));
  34. }
  35. } catch (Exception e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. throw new RuntimeException(e);
  39. }finally{
  40. JdbcUtil.close(conn, pstmt, rs);
  41. }
  42. }
  43. }
JdbcUtil.java
    
    
  1. package com.cn.Util;
  2. import java.io.FileInputStream;
  3. import java.io.InputStream;
  4. import java.sql.CallableStatement;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.util.Properties;
  11. /**
  12. * jdbc的工具类
  13. * @author liuzhiyong
  14. *
  15. */
  16. public class JdbcUtil {
  17. private static String url = null;
  18. private static String user = null;
  19. private static String password = null;
  20. private static String driverClass = null;
  21. /**
  22. * 静态代码块(只调用一次)
  23. */
  24. static{
  25. try {
  26. //读取db.properties文件
  27. Properties properties = new Properties();
  28. /**
  29. *
  30. * 加载文件
  31. *
  32. * . 代表java的命令运行的目录
  33. * 在java项目下, . java命令的运行目录从项目的根目录MyEclipse工作空间/bin 目录开始
  34. * 在web项目下, . java命令的运行目录从tomact/bin 目录开始
  35. * 所以不能用.
  36. */
  37. /**
  38. * 使用类路径的读取方式
  39. * / 斜杠表示classpath的根目录
  40. * 在java项目下,classpath的根目录从bin目录开始
  41. * 在web项目下,classpath的根目录从WEB-INF/classes目录开始
  42. */
  43. InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
  44. properties.load(in);
  45. //读取信息
  46. url = properties.getProperty("url");
  47. user = properties.getProperty("user");
  48. password = properties.getProperty("password");
  49. driverClass = properties.getProperty("driverClass");
  50. // System.out.println(url);
  51. // System.out.println(user);
  52. // System.out.println(password);
  53. // System.out.println(driverClass);
  54. //注册驱动程序
  55. Class.forName(driverClass);
  56. } catch (Exception e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. System.out.println("驱动程序注册出错!");
  60. }
  61. }
  62. /**
  63. * 获取连接对象的方法
  64. */
  65. public static Connection getConnection(){
  66. try {
  67. Connection conn = DriverManager.getConnection(url, user, password);
  68. return conn;
  69. } catch (SQLException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. throw new RuntimeException(e);
  73. }
  74. }
  75. /**
  76. * 释放资源的重载方法
  77. */
  78. public static void close(Connection conn, Statement stmt, ResultSet rs){
  79. //关闭资源(顺序:后打开,先关闭)
  80. if(rs != null){
  81. try {
  82. rs.close();
  83. } catch (SQLException e) {
  84. System.out.println("ResultSet关闭失败!");
  85. throw new RuntimeException(e);
  86. }
  87. }if(stmt != null){
  88. try {
  89. stmt.close();
  90. } catch (SQLException e) {
  91. System.out.println("Statement关闭失败!");
  92. throw new RuntimeException(e);
  93. }
  94. }
  95. if(conn != null){
  96. try {
  97. conn.close();
  98. } catch (SQLException e) {
  99. System.out.println("Connection关闭失败!");
  100. throw new RuntimeException(e);
  101. }
  102. }
  103. }
  104. /**
  105. * 释放资源的重载方法
  106. */
  107. public static void close(Connection conn, Statement stmt){
  108. //关闭资源(顺序:后打开,先关闭)
  109. if(stmt != null){
  110. try {
  111. stmt.close();
  112. } catch (SQLException e) {
  113. System.out.println("Statement关闭失败!");
  114. throw new RuntimeException(e);
  115. }
  116. }
  117. if(conn != null){
  118. try {
  119. conn.close();
  120. } catch (SQLException e) {
  121. System.out.println("Connection关闭失败!");
  122. throw new RuntimeException(e);
  123. }
  124. }
  125. }
  126. }


 方式2:(MySQL下使用)

     SELECT LAST_INSERT_ID() 函数 
    LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。 在多用户交替插入数据的情况下使用select max(id) from tableName 显然不能用。这时就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基 于Connection的,只要每个线程都使用独立的 Connection对象(我在使用DbUtils组件,获取QueryRunner对象,然后执行query,在上一条sql语句插入完成后,再执行下面 SELECT LAST_INSERT_ID() 函数  时,获取值为0,所以说明,每执行一次 DbUtils 组件new QueryRunner()中内部使用的 是不同的Connection,这种情况下,若还继续使用 SELECT LAST_INSERT_ID ( )  函数,则不能用DbUtils组件的方法,得手动获取Connection,保持执行插入语句后与后面查询自增长ID语句的Connection一致 ) ,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。

  附加:对每执行一次QueryRunner.query()的内部其实使用的是不同的Connection问题进行验证


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值