GVKun编程网logo

JDBC批处理INSERT,返回ID(jdbc insert返回值)

20

本文将介绍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返回值)

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 操作

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

INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID

我有一个“标签”表,在“标签”列上有一个UNIQUE,以防止重复.

我有一个“bookmarks_tags”表,它将书签与标签相关联,并且在“bookmark_id”和“tag_id”列上有一个UNIQUE,以防止重复.

但是,我需要人们能够添加相同的标签,为了实现这一点,我需要一些方法来检索现有标签的ID,以用作“bookmarks_tags”表中的参考.

有没有办法编写INSERT,这样如果它检测到重复,它会返回该副本的ID?或者,INSERT … SELECT是否更适合“bookmarks_tags”表?

这里的关键是它必须在两种条件下工作;添加为新的,或检索旧的.

此外,LAST_INSERT_ID()在此方案中无用,因为可以随时添加相关标签.

有任何想法吗?

解决方法

一种方法是使用INSERT IGnorE:
INSERT IGnorE INTO tags (tags,...) VALUES (the_new_tags,...);

SELECT tag_id FROM tags WHERE tags=the_new_tags;

java jdbc 批处理数据 SqlServer数据库

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批处理执行速度极慢

java – JDBC批处理执行速度极慢

任何人都可以告诉我我做错了什么我在 mysql中执行350个插件并且它需要40秒.

这是代码

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秒,可能是什么问题?

解决方法

将?rewriteBatchedStatements = true添加到JDBC url的末尾.它会给你带来严重的性能提升.请注意,这是特定于MysqL的,不会对任何其他JDBC驱动程序产生任何影响.

关于JDBC批处理INSERT,返回IDjdbc insert返回值的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于47.JDBC_insert / select 操作、INSERT和返回ID,或者如果DUPLICATE KEY返回MySQL中的现有ID、java jdbc 批处理数据 SqlServer数据库、java – JDBC批处理执行速度极慢的相关信息,请在本站寻找。

本文标签: