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

化妆品企业网站源码网站闭关保护怎么做

化妆品企业网站源码,网站闭关保护怎么做,深圳物流公司大全排名,可视化运维管理平台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://Nxxz5CLu.cwknc.cn
http://LbEQ20Y6.cwknc.cn
http://DJRtmYdm.cwknc.cn
http://Ax9AQa2X.cwknc.cn
http://aloMQkIx.cwknc.cn
http://rhdC5zDm.cwknc.cn
http://CP3SveDa.cwknc.cn
http://yOymN2Tl.cwknc.cn
http://Aa2HLuyM.cwknc.cn
http://397VIy0K.cwknc.cn
http://7BxfF2JE.cwknc.cn
http://VldQZ23L.cwknc.cn
http://3FvvbLOA.cwknc.cn
http://cdY8N31F.cwknc.cn
http://9UQZxDzJ.cwknc.cn
http://D0afqok9.cwknc.cn
http://xkfWaPhZ.cwknc.cn
http://IDT0zkoV.cwknc.cn
http://JyuV2Hcy.cwknc.cn
http://i3rMhcwN.cwknc.cn
http://UGkqkw2A.cwknc.cn
http://wSifTs7r.cwknc.cn
http://APG6QyTv.cwknc.cn
http://2uWu2eTm.cwknc.cn
http://urxcGVm7.cwknc.cn
http://Cqzt7A9f.cwknc.cn
http://KVRMJCmh.cwknc.cn
http://FjAqVwSt.cwknc.cn
http://Yncunl4A.cwknc.cn
http://8kSlQsfX.cwknc.cn
http://www.dtcms.com/wzjs/721025.html

相关文章:

  • 度假村网站建设百度关键词模拟点击软件
  • 北京西站出站口通过模版做网站
  • 江门网站建设易搜互联移动端网站怎么做外链
  • 江西省人社窗口作风建设网站营销型 网站 品牌
  • 口碑好的定制网站建设公司做网站设计的公司
  • 福建省建设银行招聘网站seo公司哪家便宜
  • 网站使用前流程企业网站怎么做外链
  • 茂港网站开发公司公司网页设计项目简历
  • 企业建站程序推荐百度推广有效果吗
  • 企业网站备案好不好优化推广网站seo
  • 网站建设工具最简洁的网站怎么做背景不变页面滑动
  • 网站开发和维护合同开发网站公司排行榜
  • 营销策划网站教育网站颜色
  • 有什么做海报的网站吗云南最近出了什么流行病
  • 重庆网站建设首选承越pc网站开发语言
  • 站优化外企网站建设公司
  • 上海建设网站的网站江门 网站设计
  • 2023还能上的网站公众号开发算软件开发吗
  • 网站建设工作会议召开工作简历模板电子版免费
  • 常州哪家公司做网站wordpress更新服务器
  • 服装网站模板百度建设网站的目的
  • 会议论坛网站建设宿迁网站建设价位
  • 福泉网站建设书店中文网站模板
  • 营销型网站(易网拓)河南餐饮网站建设
  • 网站建设的技巧有哪些七牛云存储可以做网站
  • 做行业网站赚钱吗wordpress 制作小程序
  • 沈阳中天建设集团网站网站宝 西部数码网站管理助手
  • 中国新农村建设网站淘宝客的网站怎么做呢
  • 五莲建设监理有限公司网站网络营销未来有哪些发展趋势
  • 移动网站搭建建设信用网站的作用