Работа с SQLite в Java
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать, как работать с SQLite в Java. При работе с базами данных на Java будем использовать технологию JDBC (Java DataBase Connectivity)). JDBC — это API для работы с базами данных на Java. Компания Oracle разработала универсальный интерфейс для работы с драйверами JDBC. Допустим, вы написали какую-то СУБД. Для того, чтобы программа на Java могла работать с вашей СУБД вам необходимо реализовать данный интерфейс.
В данном примере мы будем работать с SQLite. Для этого скачаем драйвер JDBC для SQLite (в поисковике можете прямо так и указать).
Для того, чтобы подключить данный драйвер БД нужно зайти в File — Project Structure (Ctrl + Alt + Shift + S) — Libraries и указываем путь до драйвера, который скачали.
Создадим простую базу данных по учету расходов. Будет всего 1 таблица: Products. Таблица Products будет состоять из следующих столбцов: id, good (наименование товара), category_name (наименование категории, к которой относится товар), price (цена товара).
Файл базы данных вместе с проектом можно скачать по ссылке.
Создадим класс Product, в котором будет находиться информация по нашему продукту:
public class Product {
// Поля класса
public int id;
public String good;
public double price;
public String category_name;
// Конструктор
public Product(int id, String good, double price, String category_name) {
this.id = id;
this.good = good;
this.price = price;
this.category_name = category_name;
}
// Выводим информацию по продукту
@Override
public String toString() {
return String.format("ID: %s | Товар: %s | Цена: %s | Категория: %s",
this.id, this.good, this.price, this.category_name);
}
}
Создадим класс DbHandler, в котором будет находиться вся логика работы с базой данных:
import org.sqlite.JDBC;
import java.sql.*;
import java.util.*;
public class DbHandler {
// Константа, в которой хранится адрес подключения
private static final String CON_STR = "jdbc:sqlite:D:/myfin.db";
// Используем шаблон одиночка, чтобы не плодить множество
// экземпляров класса DbHandler
private static DbHandler instance = null;
public static synchronized DbHandler getInstance() throws SQLException {
if (instance == null)
instance = new DbHandler();
return instance;
}
// Объект, в котором будет храниться соединение с БД
private Connection connection;
private DbHandler() throws SQLException {
// Регистрируем драйвер, с которым будем работать
// в нашем случае Sqlite
DriverManager.registerDriver(new JDBC());
// Выполняем подключение к базе данных
this.connection = DriverManager.getConnection(CON_STR);
}
public List<Product> getAllProducts() {
// Statement используется для того, чтобы выполнить sql-запрос
try (Statement statement = this.connection.createStatement()) {
// В данный список будем загружать наши продукты, полученные из БД
List<Product> products = new ArrayList<Product>();
// В resultSet будет храниться результат нашего запроса,
// который выполняется командой statement.executeQuery()
ResultSet resultSet = statement.executeQuery("SELECT id, good, price, category_name FROM products");
// Проходимся по нашему resultSet и заносим данные в products
while (resultSet.next()) {
products.add(new Product(resultSet.getInt("id"),
resultSet.getString("good"),
resultSet.getDouble("price"),
resultSet.getString("category_name")));
}
// Возвращаем наш список
return products;
} catch (SQLException e) {
e.printStackTrace();
// Если произошла ошибка - возвращаем пустую коллекцию
return Collections.emptyList();
}
}
// Добавление продукта в БД
public void addProduct(Product product) {
// Создадим подготовленное выражение, чтобы избежать SQL-инъекций
try (PreparedStatement statement = this.connection.prepareStatement(
"INSERT INTO Products(`good`, `price`, `category_name`) " +
"VALUES(?, ?, ?)")) {
statement.setObject(1, product.good);
statement.setObject(2, product.price);
statement.setObject(3, product.category_name);
// Выполняем запрос
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
// Удаление продукта по id
public void deleteProduct(int id) {
try (PreparedStatement statement = this.connection.prepareStatement(
"DELETE FROM Products WHERE id = ?")) {
statement.setObject(1, id);
// Выполняем запрос
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Напишем основной класс Main, в котором будут вызываться все наши методы:
import java.sql.SQLException;
import java.util.List;
public class Main {
public static void main(String[] args) {
try {
// Создаем экземпляр по работе с БД
DbHandler dbHandler = DbHandler.getInstance();
// Добавляем запись
//dbHandler.addProduct(new Product("Музей", 200, "Развлечения"));
// Получаем все записи и выводим их на консоль
List<Product> products = dbHandler.getAllProducts();
for (Product product : products) {
System.out.println(product.toString());
}
// Удаление записи с id = 8
//dbHandler.deleteProduct(8);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
В данном примере мы рассмотрели как работать с базой данных в Java на примере SQLite. Рассмотрели операции: выборка данных, добавление и удаление данных. Операцию по обновлению данных оставляю в качестве домашнего задания. В следующих статьях я покажу вам, как работать с графическим интерфейсом (используя Swing) на примере создания игры крестики-нолики. Консольный вариант игры мы уже сделали, теперь сделаем — графический. Также вы можете выполнить все эти манипуляции с базой данных, используя графический интерфейс.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




