Работа с SQLite в Java

Тема: Уроки Java

Дата создания: 8 декабря 2024 г. 20:24

Работа с SQLite в Java

Работа с SQLite в Java: создание простого консольного приложения

В этом уроке мы научимся работать с базой данных SQLite в Java. Создадим простое консольное приложение, которое позволяет добавлять и просматривать записи в базе данных. Перед началом работы нужно скачать драйвер SQLite JDBC.

Установка драйвера SQLite JDBC

  1. Перейдите на страницу GitHub проекта SQLite JDBC.
  2. Найдите последнюю версию в разделе Releases. Мы будем использовать sqlite-jdbc-3.47.1.0.jar.
  3. Перейдите к разделу Assets и скачайте файл с расширением .jar.
  4. Поместите этот файл в ваш проект.

Теперь мы можем приступать к работе с кодом

1. Установка соединения с базой данных

private static final String DATABASE_URL = "jdbc:sqlite:test.db";

public static void main(String[] args) {
    try (Connection connection = DriverManager.getConnection(DATABASE_URL)) {
        System.out.println("Соединение с базой данных установлено.");
        createTable(connection);
        // Логика работы с базой (меню, ввод данных) будет здесь
    } catch (SQLException e) {
        System.out.println("Ошибка соединения с базой данных: " + e.getMessage());
    }
}



Что мы тут делаем?:
- DATABASE_URL содержит путь к базе данных. Если файл test.db не существует, SQLite создаст его автоматически.
- DriverManager.getConnection(DATABASE_URL) устанавливает соединение.

2. Создание таблицы

private static void createTable(Connection connection) throws SQLException {
    String sql = """
        CREATE TABLE IF NOT EXISTS notes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            text TEXT NOT NULL
        );
    """;
    try (Statement statement = connection.createStatement()) {
        statement.execute(sql);
        System.out.println("Таблица успешно создана или уже существует.");
    }
}



Пояснение:
- Метод createTable проверяет, существует ли таблица notes. Если нет, она создаётся.
- Таблица имеет два поля:
- id — уникальный идентификатор записи, увеличивается автоматически.
- text — текстовое поле для хранения данных.
- SQL-запрос выполняется через Statement.

3. Добавление записи в таблицу

private static void insertRecord(Connection connection, Scanner scanner) throws SQLException {
    System.out.print("Введите текст для записи в базу данных: ");
    String text = scanner.nextLine();

    String sql = "INSERT INTO notes (text) VALUES (?)";
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, text);
        preparedStatement.executeUpdate();
        System.out.println("Запись успешно добавлена.");
    }
}



Что происходит в этом коде?:
- Метод insertRecord принимает текст от пользователя и добавляет его в таблицу.
- PreparedStatement позволяет безопасно передавать параметры в SQL-запрос, предотвращая SQL-инъекции.
- Метод executeUpdate выполняет запрос на добавление данных.

4. Чтение записей из таблицы

private static void readRecords(Connection connection) throws SQLException {
    String sql = "SELECT * FROM notes";
    try (Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery(sql)) {
        System.out.println("\nВсе записи в базе данных:");
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String text = resultSet.getString("text");
            System.out.printf("ID: %d | Текст: %s%n", id, text);
        }
    }
}



Объяснение:
- Метод readRecords извлекает все записи из таблицы notes.
- ResultSet хранит результаты запроса. С его помощью можно получить данные каждой строки.

5. Меню взаимодействия с пользователем

Scanner scanner = new Scanner(System.in);

while (true) {
    System.out.println("\nВыберите действие:");
    System.out.println("1. Добавить запись");
    System.out.println("2. Показать все записи");
    System.out.println("3. Выйти");
    System.out.print("Ваш выбор: ");

    int choice = scanner.nextInt();
    scanner.nextLine(); // Очистка буфера

    switch (choice) {
        case 1 -> insertRecord(connection, scanner);
        case 2 -> readRecords(connection);
        case 3 -> {
            System.out.println("Выход из программы...");
            return;
        }
        default -> System.out.println("Неверный выбор. Попробуйте снова.");
    }
}



Полный код программы

import java.sql.*; // Импорт для работы с базой данных
import java.util.Scanner; // Импорт для чтения ввода с консоли

public class Main {
    // URL для подключения к SQLite базе данных
    private static final String DATABASE_URL = "jdbc:sqlite:test.db";

    public static void main(String[] args) {
        // Попытка установить соединение с базой данных
        try (Connection connection = DriverManager.getConnection(DATABASE_URL)) {
            System.out.println("Соединение с базой данных установлено.");

            // Создаем таблицу, если её ещё нет
            createTable(connection);

            // Сканнер для чтения пользовательского ввода
            Scanner scanner = new Scanner(System.in);

            // Основной цикл программы
            while (true) {
                // Меню действий
                System.out.println("\nВыберите действие:");
                System.out.println("1. Добавить запись");
                System.out.println("2. Показать все записи");
                System.out.println("3. Выйти");
                System.out.print("Ваш выбор: ");

                // Читаем выбор пользователя
                int choice = scanner.nextInt();
                scanner.nextLine(); // Очистка буфера

                // Выполняем действие в зависимости от выбора
                switch (choice) {
                    case 1 -> insertRecord(connection, scanner); // Добавить запись
                    case 2 -> readRecords(connection); // Показать все записи
                    case 3 -> {
                        System.out.println("Выход из программы...");
                        return; // Завершаем программу
                    }
                    default -> System.out.println("Неверный выбор. Попробуйте снова."); // Обработка неверного ввода
                }
            }
        } catch (SQLException e) {
            // Обработка ошибок соединения с базой данных
            System.out.println("Ошибка соединения с базой данных: " + e.getMessage());
        }
    }

    // Метод для создания таблицы в базе данных
    private static void createTable(Connection connection) throws SQLException {
        String sql = """
                CREATE TABLE IF NOT EXISTS notes ( -- SQL запрос для создания таблицы
                    id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
                    text TEXT NOT NULL -- Поле для текста, которое не может быть пустым
                );
                """;
        // Выполняем SQL запрос
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            System.out.println("Таблица успешно создана или уже существует.");
        }
    }

    // Метод для добавления новой записи в базу данных
    private static void insertRecord(Connection connection, Scanner scanner) throws SQLException {
        // Просим пользователя ввести текст
        System.out.print("Введите текст для записи в базу данных: ");
        String text = scanner.nextLine();

        // SQL запрос для вставки записи
        String sql = "INSERT INTO notes (text) VALUES (?)";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, text); // Устанавливаем значение текста
            preparedStatement.executeUpdate(); // Выполняем запрос
            System.out.println("Запись успешно добавлена.");
        }
    }

    // Метод для чтения всех записей из базы данных
    private static void readRecords(Connection connection) throws SQLException {
        String sql = "SELECT * FROM notes"; // SQL запрос для получения всех записей
        try (Statement statement = connection.createStatement();
             ResultSet resultSet = statement.executeQuery(sql)) { // Выполняем запрос

            System.out.println("\nВсе записи в базе данных:");
            // Проходим по результатам запроса
            while (resultSet.next()) {
                int id = resultSet.getInt("id"); // Получаем ID записи
                String text = resultSet.getString("text"); // Получаем текст записи
                System.out.printf("ID: %d | Текст: %s%n", id, text); // Выводим данные
            }
        }
    }
}



Итог

Теперь у вас есть простое консольное приложение на Java, работающее с базой данных SQLite. Оно демонстрирует основы работы с базами данных: подключение, создание таблиц, добавление и чтение данных. Вы можете расширить этот пример, добавив, например, функции удаления или обновления записей.

Ко всем постам