• jdbctemplate 批量插入 返回自增id


    import org.springframework.dao.DataAccessException;
    import org.springframework.jdbc.core.*;
    import org.springframework.jdbc.support.JdbcUtils;
    import org.springframework.jdbc.support.KeyHolder;
    import java.sql.*;
    import java.util.List;
    public class CustomerJdbcTemplate extends JdbcTemplate {
        public int[] batchUpdate(final String sql,final BatchPreparedStatementSetter pss,
                                 final KeyHolder generatedKeyHolder) throws DataAccessException {
            return (int[]) execute(
                    new PreparedStatementCreator() {
                        public PreparedStatement createPreparedStatement(Connection conn)
                                throws SQLException {
                            return conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                        }
                    },
                    new PreparedStatementCallback() {
                        public Object doInPreparedStatement(PreparedStatement ps) throws SQLException {
                            if (logger.isDebugEnabled())
                                logger.debug("Executing batch SQL update and returning " +
                                        "generated keys [" + sql + "]");
                            try {
                                int batchSize = pss.getBatchSize();
                                int totalRowsAffected = 0;
                                int[] rowsAffected = new int[batchSize];
                                List generatedKeys = generatedKeyHolder.getKeyList();
                                generatedKeys.clear();
                                ResultSet keys = null;
                                for (int i = 0; i < batchSize; i++) {
                                    pss.setValues(ps, i);
                                    rowsAffected[i] = ps.executeUpdate();
                                    totalRowsAffected += rowsAffected[i];
                                    try {
                                        keys = ps.getGeneratedKeys();
                                        if (keys != null) {
                                            RowMapper rowMapper = new ColumnMapRowMapper();
                                            RowMapperResultSetExtractor rse =
                                                    new RowMapperResultSetExtractor(rowMapper, 1);
                                            generatedKeys.addAll((List) rse.extractData(keys));
                                        }
                                    } finally {
                                        JdbcUtils.closeResultSet(keys);
                                    }
                                }
                                if (logger.isDebugEnabled())
                                    logger.debug("SQL batch update affected "
                                            + totalRowsAffected + " rows and returned "
                                            + generatedKeys.size() + " keys");
                                return rowsAffected;
                            } finally {
                                if (pss instanceof ParameterDisposer)
                                    ((ParameterDisposer) pss).cleanupParameters();
                            }
                        }
                    });
        }
    }
    final List<User> users = new ArrayList();
            for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setName("name"+1L);
            user.setAge(i)
            users.add(user);
            }
            String sql = "insert into user(name,age) values(?,?)";
            GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
            customerJdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
            User user = users.get(i);
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            }
    @Override
    public int getBatchSize() {
            return users.size();
            }
            }, generatedKeyHolder);
            List<Map<String, Object>> objectMap = generatedKeyHolder.getKeyList();
            for(Map<String, Object> map : objectMap){
            System.out.println(map.get("GENERATED_KEY"));
            }
  • 相关阅读:
    连续多步骤业务流程的暂停、中断和恢复
    什么是XML
    泛型擦除和反射配置文件
    类加载器和反射
    网络安全协议(二)
    网络通信协议(一)
    多线程之线程安全
    JAVA之线程池
    JAVA之多线程
    2020/8/1 JAVA之IO流(四)
  • 原文地址:https://www.cnblogs.com/LcxSummer/p/16189894.html
Copyright © 2020-2023  润新知