Альтернатива “PDO:: lastInsertId” / “mysql_insert_id”

Squiddie в комментариях рекомендует вам хорошее решение. Однако, если вы все еще хотите отключить текстовое поле, чтобы имя файла было видно пользователю (в случае JFileChooser.DIRECTORIES_ONLY это , а не ), вы можете использовать следующий код, чтобы «захватить» текстовое поле. от выбора и отключить его.

import java.awt.Component;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TextFieldFromFileChooser {
    public TextFieldFromFileChooser() {
        JFileChooser chooser = new JFileChooser();
        JTextField fileChooserTextField = getFileChooserTextField(chooser);
        fileChooserTextField.setText("I name this file.txt");
        fileChooserTextField.setEditable(false);
        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            // Selected file has the name of the fileChooserTextField' text
            System.out.println(chooser.getSelectedFile().getAbsolutePath());
        }
    }

    private static JTextField getFileChooserTextField(JFileChooser chooser) {
        JTextField f = null;
        for (Component c : getComponents(chooser)) {
            if (c instanceof JTextField){
                f = (JTextField) c;
                break;
            }
        }
        return f;
    }

    private static List<Component> getComponents(JComponent component) {
        List<Component> list = new ArrayList<>();
        for (Component c : component.getComponents()) {
            if (c instanceof JPanel)
                list.addAll(getComponents((JPanel) c));
            else if (c instanceof JTextField)
                list.add((JTextField) c);
        }
        return list;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TextFieldFromFileChooser());
    }
}

Обратите внимание, что это было протестировано с Windows LAF и Java LAF. Если у вашего выбора есть 2 текстовых поля (я понятия не имею, как обстоят дела с MAC / Linux), у вас могут возникнуть проблемы, потому что вы не знаете, какие из текстовых полей вы отключаете.

6
задан BlaM 14 November 2008 в 13:04
поделиться

5 ответов

Если Вы идете путем ADOdb (http://adodb.sourceforge.net/), то можно создать идентификатор вставки перед рукой и явно конкретный идентификатор при вставке. Это может быть реализовано портативно (ADOdb поддерживает тонну различных баз данных...), и гарантирует, что Вы используете корректный идентификатор вставки.

Тип ПОСЛЕДОВАТЕЛЬНЫХ ДАННЫХ PostgreSQL подобен за исключением того, что это - per-table/per-sequence, Вы указываете таблицу, Вы хотите последний идентификатор вставки для того, когда Вы запрашиваете это.

2
ответ дан 17 December 2019 в 00:16
поделиться

По моему скромному мнению, это только считают "злым", потому что едва любая другая база данных SQL (если таковые имеются) имеет его.

Лично я нахожу его невероятно полезным, и жаль, что не должен был обращаться к другим более сложным методам в других системах.

4
ответ дан 17 December 2019 в 00:16
поделиться

Я предполагаю, что это не действительно состояние ни один, но я использую блокировки записи, чтобы удостовериться, что я действительно получаю последний вставленный идентификатор.

1
ответ дан 17 December 2019 в 00:16
поделиться

Одна альтернатива должна использовать последовательности вместо этого, таким образом, Вы генерируете идентификатор сами, прежде чем Вы сделаете вставку.

К сожалению, они не поддерживаются в MySQL, но библиотеки как Adodb могут эмулировать их использующий другую таблицу. Я думаю однако, что сама эмуляция будет использовать lastInsertId () или эквивалентный..., но по крайней мере у Вас, менее вероятно, будет триггер на таблице, которая просто используется для последовательности

3
ответ дан 17 December 2019 в 00:16
поделиться

Это не сложно, и не эффективно, но если данные, которые Вы вставили, включают уникальные поля, затем ВЫБОР может, очевидно, привести к тому, что Вы после.

Например:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';
0
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: