Связь один ко многим в Java
Связь один ко многим означает: одна строка родителя
может иметь много дочерних, а каждая дочерняя
указывает ровно на одного родителя. В таблице книг
колонка author_id повторяет один и тот
же номер автора.
Два автора и три книги с общими внешними ключами оформляют так:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:otm_books.db")) {
connection.createStatement().execute(
"PRAGMA foreign_keys = ON"
);
try (Statement statement = connection.createStatement()) {
statement.execute(
"""
CREATE TABLE IF NOT EXISTS authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
"""
);
statement.execute(
"""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id)
REFERENCES authors (id)
)
"""
);
}
PreparedStatement author = connection.prepareStatement(
"INSERT INTO authors (name) VALUES (?)"
);
author.setString(1, "Mira Cole");
author.executeUpdate();
author.setString(1, "Jon Reed");
author.executeUpdate();
PreparedStatement book = connection.prepareStatement(
"""
INSERT INTO books (author_id, title)
VALUES (?, ?)
"""
);
book.setInt(1, 1);
book.setString(2, "Quiet Harbor");
book.executeUpdate();
book.setInt(1, 1);
book.setString(2, "Stone Path");
book.executeUpdate();
book.setInt(1, 2);
book.setString(2, "Wide Field");
book.executeUpdate();
}
}
}
Подсчёт книг у автора выполняют фильтром по
author_id. У первого автора в примере
получается две строки:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:otm_books.db")) {
connection.createStatement().execute(
"PRAGMA foreign_keys = ON"
);
try (Statement statement = connection.createStatement()) {
statement.execute(
"""
CREATE TABLE IF NOT EXISTS authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
"""
);
statement.execute(
"""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id)
REFERENCES authors (id)
)
"""
);
}
PreparedStatement author = connection.prepareStatement(
"INSERT INTO authors (name) VALUES (?)"
);
author.setString(1, "Mira Cole");
author.executeUpdate();
PreparedStatement book = connection.prepareStatement(
"""
INSERT INTO books (author_id, title)
VALUES (?, ?)
"""
);
book.setInt(1, 1);
book.setString(2, "Quiet Harbor");
book.executeUpdate();
book.setInt(1, 1);
book.setString(2, "Stone Path");
book.executeUpdate();
PreparedStatement count = connection.prepareStatement(
"""
SELECT COUNT(*) AS total
FROM books WHERE author_id = ?
"""
);
count.setInt(1, 1);
ResultSet result = count.executeQuery();
result.next();
System.out.println(result.getInt("total"));
}
}
}
В otm_books.db добавьте автора
"Eva Nash" и две его книги. Выведите
число книг с author_id этого автора.
Создайте otm_brands.db с таблицами
brands и models. Одной марке
сопоставьте три модели и выведите их названия.