2022-11-05
一、自增长的键值问题
1、说明:
将在数据库表单中添加数据的自增长的字段返回给用户
2、使用方式:
在预编译语句中,除了要传入sql语句外,还要传入一个参数“Statement.RETURN_GENERATED_KEYS”。其中“Statement”表示的是一个接口,“RETURN_GENERATED_KEYS”表示在执行sql语句的同时,返回自增长的键值对。
之后,输出自增长键值对使用的方式是“先创建一个预编译对象的自增长结果集(如:rs)使用的语句是“
ResultSet rs = pst.getGeneratedKeys();
”,之后输出语句为自增长结果集对象的getObject(放要获取的列数编号)”。注意,要将输出的语句放置到判断获得的结果集是否有下一个的判断语句中,例如:if(rs.next()){语句放置位置},其中rs表示的是结果集的对象。使用的语句是
ResultSet rs = pst.getGeneratedKeys();
if(rs.next()){
System.out.println("您的员工编号是" + rs.getObject(1));
}
package com.haha.problem;import org.junit.Test;import java.sql.*;import java.util.Date;import java.util.Scanner;public class Problem4 { @Test public void test04() throws SQLException { Scanner input = new Scanner(System.in); System.out.println("请输入姓名:"); String ename = input.next(); System.out.println("请输入薪资:"); double salary = input.nextDouble(); System.out.println("请输入出生日期:"); String birthday = input.next(); System.out.println("请输入性别:"); String gender = input.next(); System.out.println("请输入手机号码:"); String tel = input.next(); System.out.println("请输入邮箱:"); String email = input.next(); input.close(); String url = "jdbc:mysql://localhost:3306/数据库名称?serverTimezone=UTC"; Connection conn = DriverManager.getConnection(url, "数据库用户名", "数据库密码"); String sql = "INSERT INTO t_employee(ename,salary,birthday,gender,tel,email,hiredate) VALUES(?,?,?,?,?,?,?)"; PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pst.setObject(1,ename); pst.setObject(2,salary); pst.setObject(3,birthday); pst.setObject(4,gender); pst.setObject(5,tel); pst.setObject(6,email); pst.setObject(7,new Date()); int len = pst.executeUpdate(); System.out.println(len>0?"添加成功":"添加失败"); ResultSet rs = pst.getGeneratedKeys(); if(rs.next()){ System.out.println("您的员工编号是" + rs.getObject(1)); } pst.close(); conn.close(); }}
二、批处理
1、说明:
批处理处理一般用于大批量的输入数据中使用。批处理中不是设置了一条数据就网数据库中添加一条数据,而是将添加的一些数据放置到缓冲区中,添加完后再放置到数据库中。如果缓冲池中满了以后,就会自动将数据放置到数据库中,清空缓冲池。
2、使用实例:
设置url(此处URL要多加一个参数,添加的参数是
rewriteBatchedStatements=true
,因为MySQL中batch没有自动开启,所以要告诉数据库开启缓冲),设置驱动管理类的连接,设置sql语句,设置连接对象的预编译,设置占位符的取值(将预编译对象先放置到缓冲池中),执行批处理,关闭流对象(连接对象、预编译对象)
3、代码实例:
package com.haha.problem;import org.junit.Test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class Problem5 { @Test public void test05() throws SQLException { long start = System.currentTimeMillis(); String url = "jdbc:mysql://localhost:3306/数据库名称?serverTimezone=UTC&rewriteBatchedStatements=true"; Connection conn = DriverManager.getConnection(url, "数据库用户名", "数据库密码"); String sql = "INSERT INTO t_department VALUES(NULL,?,?)"; PreparedStatement pst = conn.prepareStatement(sql); for(int i=1;i<=1000;i++){ pst.setObject(1,"测试部门名称"+i); pst.setObject(2,"测试部门简介"+i); pst.addBatch(); } pst.executeBatch(); pst.close(); conn.close(); long end = System.currentTimeMillis(); System.out.println("耗时:"+(end - start)); }}