JDBC高级——主键回显、批量插入、事务操作
自增主键回显
一般在插入数据时,设置主键为自增,然后我们就不用去维护这个主键值,其他的级联表可能以这个主键作为外键或参考,所以我们要拿到插入数据的主键值,这就是主键回显。
如何获取数据库自增的主键值?
在原生的JDBC中,实现主键回显非常简单。
- 创建PreparedStatement时,传入Statement.RETURN_GENERATED_KEYS这个常量,或直接传入“1”
PreparedStatement pstm = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
- 获取自增主键的结果集,这个结果集是一行一列,“id=值” 的形式
ResultSet rsKeys = pstm.getGeneratedKeys(); if(rsKeys.next()){ System.out.println("自增长的主键是为"+rsKeys.getInt(1)); // 或 System.out.println("自增长的主键值是"+ rsKeys.getString("GENERATED_KEY")); }
批量插入
当利用原生的JDBC做批量插入时,性能非常低,看个模拟的例子
Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=root"); String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setObject(1, "zhangsan"); pstm.setObject(2, "123321"); pstm.setObject(3, "123@com"); pstm.setObject(4, "2023-01-10"); long start = System.currentTimeMillis(); int i = 1000; while(i -- > 0){ // 模拟批量插入1000次 pstm.executeUpdate(); } long end = System.currentTimeMillis(); System.out.println("共耗时" + (end - start) + " 毫秒");
在学习MySQL时,在执行插入的SQL语句时,我们可以这样写,一次插入多个值
insert into user(name,password,email,birthday) values('zs','123','123','123'),('ls','222','222','333')
利用这个语法,JDBC封装了批量插入的方法,我们直接来使用即可。
- 在url后添加
rewriteBatchedStatements=true
,表示允许批量插入
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?rewriteBatchedStatements=true", "root", "root");
- 使用
addBatch()
方法追加值
// 此方法是将值追加到values后 pstm.addBatch();
- 使用
executeBatch()
方法来执行批量插入
看一下这个批量插入的耗时
Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?rewriteBatchedStatements=true", "root", "root"); String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setObject(1, "zhangsan"); pstm.setObject(2, "123321"); pstm.setObject(3, "123@com"); pstm.setObject(4, "2023-01-10"); long start = System.currentTimeMillis(); int i = 1000; while (i-- > 0) { // 模拟批量插入1000次 // 此方法是将值追加到values后 pstm.addBatch(); } pstm.executeBatch(); long end = System.currentTimeMillis(); System.out.println("共耗时" + (end - start) + " 毫秒");
注意
- sql语句为insert into 表名 values (), sql语句的末尾不能加分号";",否则无法追加value
- 执行时是调用的
executeBatch()
方法
事务操作
在原生的JDBC中,如何操作事务?
在原生的JDBC中,默认开启事务的自动提交,所以我们要是想自己管理事务,需要先关闭事务的自动提交。
一般按照这个结构执行事务
try{ // 关闭事务自动提交 conn.setAutoCommit(false); // 执行数据库操作 // 提交事务 conn.commit(); }catch (Exception e){ // 事务回滚 conn.rollback(); }
注意:JDBC中,事务的基本要求:必须是同一个连接connection
所以一般在业务层进行事务操作,DAO层负责接收这个连接对象并执行数据库操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!