当前位置: 首页 > wzjs >正文

化妆品企业网站源码视觉做的比较好的国外网站

化妆品企业网站源码,视觉做的比较好的国外网站,2018年公司做网站注意事项,公司网站建设注册JDBC 获取新增行主键值详解 在数据库操作中,获取新插入行的主键值是一个常见需求。以下是几种常用方法及其实现细节: 一、标准 JDBC 方法 1. 使用 Statement.RETURN_GENERATED_KEYS try (Connection conn dataSource.getConnection();PreparedStatement…

JDBC 获取新增行主键值详解

在数据库操作中,获取新插入行的主键值是一个常见需求。以下是几种常用方法及其实现细节:

一、标准 JDBC 方法

1. 使用 Statement.RETURN_GENERATED_KEYS

try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username, email) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS)) {pstmt.setString(1, "john_doe");pstmt.setString(2, "john@example.com");int affectedRows = pstmt.executeUpdate();if (affectedRows > 0) {try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) {if (generatedKeys.next()) {long userId = generatedKeys.getLong(1);System.out.println("新用户ID: " + userId);}}}
}

2. 指定需要返回的主键列名

// 明确指定需要返回的主键列
String[] keyColumns = {"id"};
try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO orders (customer_id, total) VALUES (?, ?)", keyColumns)) {pstmt.setInt(1, 1001);pstmt.setBigDecimal(2, new BigDecimal("99.99"));pstmt.executeUpdate();try (ResultSet keys = pstmt.getGeneratedKeys()) {if (keys.next()) {long orderId = keys.getLong(1);}}
}

二、数据库特定方法

1. MySQL (使用 LAST_INSERT_ID())

try (Statement stmt = conn.createStatement()) {stmt.executeUpdate("INSERT INTO products (name, price) VALUES ('Laptop', 1200.00)");try (ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()")) {if (rs.next()) {long productId = rs.getLong(1);}}
}

2. PostgreSQL (使用 RETURNING 子句)

try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employees (name, position) VALUES (?, ?) RETURNING id")) {pstmt.setString(1, "Alice Smith");pstmt.setString(2, "Developer");try (ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {long empId = rs.getLong("id");}}
}

3. SQL Server (使用 OUTPUT 子句)

try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO invoices (customer_id, amount) OUTPUT INSERTED.id VALUES (?, ?)")) {pstmt.setInt(1, 2001);pstmt.setBigDecimal(2, new BigDecimal("499.95"));try (ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {long invoiceId = rs.getLong("id");}}
}

4. Oracle (使用 RETURNING INTO)

try (CallableStatement cstmt = conn.prepareCall("DECLARE new_id NUMBER; " +"BEGIN " +"  INSERT INTO departments (name) VALUES (?) " +"  RETURNING id INTO new_id; " +"  ? := new_id; " +"END;")) {cstmt.setString(1, "Engineering");cstmt.registerOutParameter(2, Types.NUMERIC);cstmt.execute();long deptId = cstmt.getLong(2);
}

三、跨数据库兼容方案

public Long insertAndGetKey(String sql, Object... params) throws SQLException {try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}int affectedRows = pstmt.executeUpdate();if (affectedRows == 0) {throw new SQLException("插入失败,无记录受影响");}try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) {if (generatedKeys.next()) {return generatedKeys.getLong(1);} else {throw new SQLException("插入失败,未获取到主键");}}}
}// 使用示例
Long newId = insertAndGetKey("INSERT INTO customers (name, email) VALUES (?, ?)", "Bob Johnson", "bob@example.com");

四、最佳实践与注意事项

1. 事务管理

conn.setAutoCommit(false);
try {Long newId = insertAndGetKey(...);// 使用新ID进行后续操作insertRelatedRecords(newId);conn.commit();
} catch (SQLException e) {conn.rollback();throw e;
}

2. 处理复合主键

try (ResultSet keys = pstmt.getGeneratedKeys()) {if (keys.next()) {long id1 = keys.getLong(1);String id2 = keys.getString(2);// 处理复合主键}
}

3. 性能优化

  • 使用批量插入时获取主键:
pstmt.addBatch();
// 添加多个批次...
int[] counts = pstmt.executeBatch();try (ResultSet keys = pstmt.getGeneratedKeys()) {List<Long> generatedIds = new ArrayList<>();while (keys.next()) {generatedIds.add(keys.getLong(1));}
}

4. 常见问题解决

问题: 返回多个结果集
解决: 确保只插入一行或处理多个键

try (ResultSet keys = pstmt.getGeneratedKeys()) {while (keys.next()) {System.out.println("生成ID: " + keys.getLong(1));}
}

问题: 获取非自增主键
解决: 使用数据库特定函数或序列

// Oracle序列示例
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO items (id, name) VALUES (item_seq.NEXTVAL, ?)");

五、各数据库驱动支持情况

数据库标准方法支持推荐方法注意事项
MySQLRETURN_GENERATED_KEYS需要InnoDB引擎
PostgreSQLRETURNING子句更高效
OracleRETURNING INTO必须使用CallableStatement
SQL ServerOUTPUT子句兼容性好
SQLitelast_insert_rowid()使用SELECT last_insert_rowid()
DB2IDENTITY_VAL_LOCAL()需在插入后单独查询

六、完整示例(跨数据库)

public class KeyGenerator {private final DataSource dataSource;public KeyGenerator(DataSource dataSource) {this.dataSource = dataSource;}public long insertUser(String username, String email) throws SQLException {String sql = "INSERT INTO users (username, email) VALUES (?, ?)";try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {pstmt.setString(1, username);pstmt.setString(2, email);int affectedRows = pstmt.executeUpdate();if (affectedRows == 0) {throw new SQLException("创建用户失败");}try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) {if (generatedKeys.next()) {return generatedKeys.getLong(1);} else {// 回退到数据库特定方法return fallbackGetKey(conn, "users", "id");}}}}private long fallbackGetKey(Connection conn, String table, String pkColumn) throws SQLException {String database = conn.getMetaData().getDatabaseProductName();String query = "";switch (database) {case "MySQL":query = "SELECT LAST_INSERT_ID()";break;case "PostgreSQL":query = "SELECT lastval()";break;case "Microsoft SQL Server":query = "SELECT SCOPE_IDENTITY()";break;case "Oracle":// Oracle需要更复杂的处理throw new SQLException("Oracle需要显式使用序列");default:query = "SELECT MAX(" + pkColumn + ") FROM " + table;}try (Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(query)) {if (rs.next()) {return rs.getLong(1);}}throw new SQLException("无法获取生成的主键");}
}

总结

获取新增行主键值的最佳实践:

  1. 优先使用标准JDBC方法Statement.RETURN_GENERATED_KEYS
  2. 对于复杂场景:使用数据库特定语法(如RETURNING, OUTPUT
  3. 事务管理:确保获取主键操作在同一个事务中
  4. 错误处理:总是检查返回结果和受影响行数
  5. 兼容性考虑:为不同数据库提供后备方案

通过合理选择方法,您可以高效可靠地获取新插入行的主键值,为后续的关联操作提供基础。


文章转载自:

http://9AuK5jp2.gcspr.cn
http://PmxR2TSJ.gcspr.cn
http://Eagd3hA6.gcspr.cn
http://HJ6CjTXp.gcspr.cn
http://YaHmA08s.gcspr.cn
http://jTvbL7Cu.gcspr.cn
http://qu9OdV0Q.gcspr.cn
http://HXyFAzoa.gcspr.cn
http://UqO75PHO.gcspr.cn
http://37KLybY0.gcspr.cn
http://EaYhO911.gcspr.cn
http://0APHg9K3.gcspr.cn
http://Tx2H68U4.gcspr.cn
http://pyPuaD6F.gcspr.cn
http://H0MvyvG1.gcspr.cn
http://GcrjvsVP.gcspr.cn
http://0rH8pgk3.gcspr.cn
http://aytow2dZ.gcspr.cn
http://iZXWyGvk.gcspr.cn
http://whA5tIz7.gcspr.cn
http://Q1gnVofU.gcspr.cn
http://vwOXpMca.gcspr.cn
http://yyGwtjwH.gcspr.cn
http://6P6zVlXD.gcspr.cn
http://LeLM98eL.gcspr.cn
http://fAJXHI6N.gcspr.cn
http://91Y1otI7.gcspr.cn
http://BSZfPT2C.gcspr.cn
http://esAdeNFv.gcspr.cn
http://U1lNcGXp.gcspr.cn
http://www.dtcms.com/wzjs/729537.html

相关文章:

  • ppt 如何做网站交互式如何做网站英文简历模板
  • 网站开发实战作业答案wordpress爱搭配
  • 易县网站建设wordpress最强的教育网站
  • 国外网站网页设计兰州装修公司哪家好
  • 商务网站建设的一般流程是什么?私人信息调查
  • 网站优化推广服务wordpress开发框架
  • 网站改版建设征求意见书佛山市网站公司
  • 国外活动策划网站电子商务网站建设 李洪心
  • 网站备案密码忘wordpress虚化主题
  • 甲蛙网站建设建筑工程网上备案流程
  • 电商网站开发工作室东莞网站设计公司淘宝
  • 商城顺德网站建设pc网站建设建议
  • 秦皇岛建设网站公司哪家好手机可以创建网站吗
  • 前端如何做双语网站网站设计答辩ppt
  • 绍兴手机网站建设东陵网站制作
  • 学校能建设网站吗亚洲足球最新排名
  • 四字母域名建设网站可以吗免费的网页设计成品详解
  • 怎么让自己做的网站让别人看到手机网站范例
  • 做网站的图片字虚外贸公司网站多少钱
  • 天津做流产五洲网站北京网站建设华网天下
  • wordpress国主题公园搜索引擎优化员简历
  • 搭建flv视频网站嘉兴网站开发选哪家
  • 概念网站源码一套网站源码多少钱
  • 设计网站页面特效怎么做网址短链接在线生成免费
  • 哪几个小说网站做网编拿的钱多南昌做网站比较好的公司有哪些
  • 网站建设主要工作沈阳祥云医院看男科怎么样
  • 有什么做调查的网站好小程序申请流程
  • 用phpmysql做网站成都房屋装修设计公司
  • 怎么避免网站开发后门免费网线
  • 网站开发 需求wordpress 4.4