首页 > 其他分享 >获取插入数据时的自增长值

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

时间:2022-12-28 14:04:56浏览次数:45  
标签:java 获取 插入 Connection sql import null 数据 ID


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

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


prepareStatement(String​​ 

  创建一个默认 ​​PreparedStatement​​ 对象,该对象能获取自动生成的键。


    参数:

​sql​

​autoGeneratedKeys​

 - 指示是否应该返回自动生成的键的标志,它是   ​​Statement.RETURN_GENERATED_KEYS​

 或   ​​Statement.NO_GENERATED_KEYS​


package com.cn.auto_increment;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.cn.Util.JdbcUtil;
/**
* 向数据库插入数据,顺便返回自增长值
* @author liuzhiyong
*
*/
public class Demo1 {
@Test
public void testGetAutoIncrement() throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//获取连接
conn = JdbcUtil.getConnection();
//准备sql
String sql = "insert into users(name, password) values(?,?)";
//创建pstm对象,在参数中指定返回自增长列
pstmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
//设置参数
pstmt.setString(1, "龚玥菲");
pstmt.setString(2, "8888");
//执行sql
pstmt.executeUpdate();

//在执行更新后,获取返回自增长结果集
rs = pstmt.getGeneratedKeys();
if(rs.next()){
System.out.println("刚刚插入数据的自增长编码是:" + rs.getInt(1));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, pstmt, rs);
}
}
}

JdbcUtil.java

package com.cn.Util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* jdbc的工具类
* @author liuzhiyong
*
*/
public class JdbcUtil {
private static String url = null;
private static String user = null;
private static String password = null;
private static String driverClass = null;

/**
* 静态代码块(只调用一次)
*/
static{
try {
//读取db.properties文件
Properties properties = new Properties();
/**
*
* 加载文件
*
* . 代表java的命令运行的目录
* 在java项目下, . java命令的运行目录从项目的根目录MyEclipse工作空间/bin 目录开始
* 在web项目下, . java命令的运行目录从tomact/bin 目录开始
* 所以不能用.
*/

/**
* 使用类路径的读取方式
* / 斜杠表示classpath的根目录
* 在java项目下,classpath的根目录从bin目录开始
* 在web项目下,classpath的根目录从WEB-INF/classes目录开始
*/
InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
properties.load(in);
//读取信息
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driverClass = properties.getProperty("driverClass");
// System.out.println(url);
// System.out.println(user);
// System.out.println(password);
// System.out.println(driverClass);
//注册驱动程序
Class.forName(driverClass);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("驱动程序注册出错!");
}
}

/**
* 获取连接对象的方法
*/
public static Connection getConnection(){

try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 释放资源的重载方法
*/
public static void close(Connection conn, Statement stmt, ResultSet rs){

//关闭资源(顺序:后打开,先关闭)
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
System.out.println("ResultSet关闭失败!");
throw new RuntimeException(e);
}
}if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
System.out.println("Statement关闭失败!");
throw new RuntimeException(e);
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("Connection关闭失败!");
throw new RuntimeException(e);
}
}
}

/**
* 释放资源的重载方法
*/
public static void close(Connection conn, Statement stmt){

//关闭资源(顺序:后打开,先关闭)
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
System.out.println("Statement关闭失败!");
throw new RuntimeException(e);
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("Connection关闭失败!");
throw new RuntimeException(e);
}
}
}

}



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




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

方式2:(MySQL下使用)


  SELECT LAST_INSERT_ID()


    LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。 在多用户交替插入数据的情况下使用select max(id)显然不能用。这时就该使用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返回一个列表。



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

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



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



 

标签:java,获取,插入,Connection,sql,import,null,数据,ID
From: https://blog.51cto.com/u_15769923/5974356

相关文章

  • 【推荐】新冠肺炎的最新数据集和可视化和预测分析(附代码)
    新冠肺炎现在情况怎么样了?推荐Github标星24.7K+的新冠肺炎公开数据集,利用这个数据集,可以用代码进行简单地可视化及预测。推荐新冠肺炎的公开数据集:​​https://github.com/C......
  • 过滤器_有效数据过滤
    需求:模拟:论坛过滤敏感词汇!实现思路:1.Dis.jsp  讨论区页面2.DisServlet.java  处理提交    ---》获取请求参数    ---》......
  • 数据结构:并查集 学习笔记
    数据结构:并查集学习笔记基础知识并查集是一种树形数据结构。在全国青少年信息学奥林匹克系列竞赛大纲中难度为6,是提高级中学习的数据结构。并查集的基本操作:查询一......
  • PostgreSQL数据库操作(2)
    一、数据库常规操作1.创建数据库//数据库登录psql-h服务器-U用户名-d数据库-p端口./psql-Upostgres-p5432-h127.0.0.1//创建数据库postgres=#crea......
  • mxnet 数据操作
     文章目录​​1.创建NDArray​​​​1.1模块导入:​​​​1.2创建行向量:​​​​1.3获取NDArray实例的形状​​​​1.4获取NDArray实例中元素(element)的总数:​​​​1.5......
  • 大数据环境搭建 —— CentOS 安装
    大数据系列文章:​​......
  • 大数据随记 —— 利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )
    文章目录​​一、题目描述​​​​0、背景​​​​1、题目一​​​​2、题目二​​​​3、题目三​​​​二、题解​​​​1、题目一详解——学校学生使用频次最多的前3......
  • 读写分离的场景下,怎么保证从数据库读到最新的数据?
    数据库主从复制数据库读写分离,主要解决高并发时,提高系统的吞吐量。来看下读写分离数据库模型:方案一:强制走主库●写请求是直接写主库,然后同步数据到从库●读请求一般......
  • nginx利用ctx实现数据共享、修改上下文功能
    引用自: https://www.jb51.net/article/153990.htm 这篇文章主要给大家介绍了关于nginx利用ctx实现数据共享、修改上下文功能的相关资料,文中通过示例代码介绍的非常详细......
  • 获取自增主键值
    获取自增主键没有设置之前  设置<!--useGeneratedKeys="true"keyProperty="id"将自增的主键值,赋值给对象的属性-->  设置之后会显示自增主键  下面是......