本文将介绍JDBC批处理INSERT,返回ID的详细情况,特别是关于jdbcinsert返回值的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于47.
本文将介绍JDBC批处理INSERT,返回ID的详细情况,特别是关于jdbc insert返回值的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于47.JDBC_insert / select 操作、INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID、java jdbc 批处理数据 SqlServer数据库、java – JDBC批处理执行速度极慢的知识。
本文目录一览:- JDBC批处理INSERT,返回ID(jdbc insert返回值)
- 47.JDBC_insert / select 操作
- INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID
- java jdbc 批处理数据 SqlServer数据库
- java – JDBC批处理执行速度极慢
JDBC批处理INSERT,返回ID(jdbc insert返回值)
有什么办法可以使用RETURNING INTO来获取受影响的行的值?我必须将相同的行插入x次并获取插入的行的ID。
查询如下所示:
public static final String QUERY_FOR_SAVE = "DECLARE " + " resultId NUMBER ; " + "BEGIN " + " INSERT INTO x " + " (a, b, c, d, e, f, g, h, i, j, k, l, m) " + " values (sequence.nextVal, :a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l) " + " RETURNING a INTO :resultId;" + "END;";
现在我可以使用addBatch在JAVA循环中将此查询添加到批处理中
IntStream.range(0, count) .forEach(index -> { try { setting parameters... cs.addBatch(); } catch (SQLException e) { e.printStackTrace(); } }); cs.executeBatch();
有没有办法像这样从批处理中返回数组或列表?我可以仅使用sql来执行x次插入操作,但是在这种情况下,我还想知道如何返回ID数组。
提前致谢
答案1
我假设这是关于Oracle的。据我所知,这是不可能的,但是您可以FORALL
在匿名PL /
SQL块中使用进行批量插入,如我最近写的这篇文章中所述:https://codingdict.com/blog/1619
这是本文中的一个自包含的JDBC示例,该示例插入值数组,然后将结果批量收集回JDBC客户端:
try (Connection con = DriverManager.getConnection(url, props); Statement s = con.createStatement(); // The statement itself is much more simple as we can // use OUT parameters to collect results into, so no // auxiliary local variables and cursors are needed CallableStatement c = con.prepareCall( "DECLARE " + " v_j t_j := ?; " + "BEGIN " + " FORALL j IN 1 .. v_j.COUNT " + " INSERT INTO x (j) VALUES (v_j(j)) " + " RETURNING i, j, k " + " BULK COLLECT INTO ?, ?, ?; " + "END;")) { try { // Create the table and the auxiliary types s.execute( "CREATE TABLE x (" + " i INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY," + " j VARCHAR2(50)," + " k DATE DEFAULT SYSDATE" + ")"); s.execute("CREATE TYPE t_i AS TABLE OF NUMBER(38)"); s.execute("CREATE TYPE t_j AS TABLE OF VARCHAR2(50)"); s.execute("CREATE TYPE t_k AS TABLE OF DATE"); // Bind input and output arrays c.setArray(1, ((OracleConnection) con).createARRAY( "T_J", new String[] { "a", "b", "c" }) ); c.registerOutParameter(2, Types.ARRAY, "T_I"); c.registerOutParameter(3, Types.ARRAY, "T_J"); c.registerOutParameter(4, Types.ARRAY, "T_K"); // Execute, fetch, and display output arrays c.execute(); Object[] i = (Object[]) c.getArray(2).getArray(); Object[] j = (Object[]) c.getArray(3).getArray(); Object[] k = (Object[]) c.getArray(4).getArray(); System.out.println(Arrays.asList(i)); System.out.println(Arrays.asList(j)); System.out.println(Arrays.asList(k)); } finally { try { s.execute("DROP TYPE t_i"); s.execute("DROP TYPE t_j"); s.execute("DROP TYPE t_k"); s.execute("DROP TABLE x"); } catch (SQLException ignore) {} }}
47.JDBC_insert / select 操作
1.JDBC_insert
1.1 效果
1.2 代码
package cn.ma.com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class TestCRUD {
//插入
@Test //junit 4 测试
public void testInsert() throws SQLException{
// 创建数据库连接
Connection conn=null; //连接
Statement stmt=null; //
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// javaee_day08 是裤名
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee_day08", "root", "root");
// 3. 创建执行sql语句的对象 Statement
stmt = conn.createStatement();
// 4、执行sql语句
int i = stmt.executeUpdate("insert into product values(NUll,''Microsoft'',80.000,Null) ");
// 5、得到结果,并处理 ResultSet
if(i>0){
System.out.println("插入成功!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{// 6、关闭资源 无论是否成功关闭资源
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
2. JDBC_select
2.1 效果
2.2 代码
package cn.ma.com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class TestCRUD {
// 查询
@Test //junit 4 测试
public void testSelect() throws SQLException{
// 创建数据库连接
Connection conn=null; //连接
Statement stmt=null; //
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 20171003test 是裤名
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee_day08", "root", "root");
// 3. 创建执行sql语句的对象 Statement
stmt = conn.createStatement();
// 4、执行sql语句
ResultSet rs = stmt.executeQuery("select * from product");
// 5、得到结果,并处理 ResultSet
while(rs.next()){
String pid = rs.getString(1); //通过列名得到
String pname = rs.getString("pname"); //通过列名得到
String price = rs.getString("price"); //通过列名得到
String pdate = rs.getString("pdate"); //通过列名得到
System.out.println(pid+"---"+pname+"---"+price+"----"+pdate);
//System.out.println(cid);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{// 6、关闭资源 无论是否成功关闭资源
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID
我有一个“bookmarks_tags”表,它将书签与标签相关联,并且在“bookmark_id”和“tag_id”列上有一个UNIQUE,以防止重复.
但是,我需要人们能够添加相同的标签,为了实现这一点,我需要一些方法来检索现有标签的ID,以用作“bookmarks_tags”表中的参考.
有没有办法编写INSERT,这样如果它检测到重复,它会返回该副本的ID?或者,INSERT … SELECT是否更适合“bookmarks_tags”表?
这里的关键是它必须在两种条件下工作;添加为新的,或检索旧的.
此外,LAST_INSERT_ID()在此方案中无用,因为可以随时添加相关标签.
有任何想法吗?
解决方法
INSERT IGnorE INTO tags (tags,...) VALUES (the_new_tags,...); SELECT tag_id FROM tags WHERE tags=the_new_tags;
java jdbc 批处理数据 SqlServer数据库
//批量修改
public void zxupdate(List<InstRData> instlist) {
Connection conn = getConnection(); // 获得连接
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "update InstRData set LastPrice=?,BidPrice=?,AskPrice=?,TradeVolume=?,TradeAmount=?,DataTime=? WHERE InstCode =?";
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < instlist.size(); i++) {
ps.setFloat(1, instlist.get(i).getLastPrice());
ps.setFloat(2, instlist.get(i).getBidPrice());
ps.setFloat(3, instlist.get(i).getAskPrice());
ps.setFloat(4, instlist.get(i).getTradeVolume());
ps.setFloat(5, instlist.get(i).getTradeAmount());
ps.setTimestamp(6, instlist.get(i).getDataTime());
ps.setString(7, instlist.get(i).getInstCode());
ps.addBatch();
}
int[] executeBatch = ps.executeBatch();
System.out.println(Arrays.toString(executeBatch));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
close(rs, ps, conn);
}
}
java – JDBC批处理执行速度极慢
这是代码
long t0 = System.currentTimeMillis(); Connection con = connectionProvider.getConnection(); PreparedStatement s = con.prepareStatement("insert into domkee.friends(idFriends,friend1Id,friend2Id,friend2Name) values(?,?,?)"); con.setAutoCommit(false); for (Friend f : friends) { s.setLong(1,0); s.setLong(2,f.getFriend1Id()); s.setLong(3,f.getFriend2Id()); s.setString(4,f.getFriend2Name()); s.addBatch(); } long t1 = System.currentTimeMillis() - t0; s.executeBatch(); long t2 = System.currentTimeMillis()-t0; con.commit(); long t3 = System.currentTimeMillis()-t0; s.close(); con.close(); long t4 = System.currentTimeMillis()-t0; System.out.println(((double)t1/1000) + ";" + ((double)t2/1000) + ";" + ((double)t3/1000) + ";" + ((double)t4/1000));
这是控制台:
0.156;39.251;39.376;39.486
所以.executeBatch()花了40秒,可能是什么问题?
解决方法
关于JDBC批处理INSERT,返回ID和jdbc insert返回值的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于47.JDBC_insert / select 操作、INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID、java jdbc 批处理数据 SqlServer数据库、java – JDBC批处理执行速度极慢的相关信息,请在本站寻找。
本文标签: