Работа с SQLite в Java: создание простого консольного приложения
В этом уроке мы научимся работать с базой данных SQLite в Java. Создадим простое консольное приложение, которое позволяет добавлять и просматривать записи в базе данных. Перед началом работы нужно скачать драйвер SQLite JDBC.
Установка драйвера SQLite JDBC
- Перейдите на страницу GitHub проекта SQLite JDBC.
- Найдите последнюю версию в разделе Releases. Мы будем использовать
sqlite-jdbc-3.47.1.0.jar
. - Перейдите к разделу Assets и скачайте файл с расширением
.jar
. - Поместите этот файл в ваш проект.
Теперь мы можем приступать к работе с кодом
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. Оно демонстрирует основы работы с базами данных: подключение, создание таблиц, добавление и чтение данных. Вы можете расширить этот пример, добавив, например, функции удаления или обновления записей.