获取插入数据时的自增长值
(推荐,简单方便,但是不能使用DbUtils组件)
创建一个默认 参数: - 指示是否应该返回自动生成的键的标志,它是 或 |
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);
}
}
}
}
方式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返回一个列表。
附加:对每执行一次QueryRunner.query()的内部其实使用的是不同的Connection问题进行验证
标签:java,获取,插入,Connection,sql,import,null,数据,ID From: https://blog.51cto.com/u_15769923/5974356