Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpRlOtm 274 of 322 menu
◀ ▶

Связь один ко многим в 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. Одной марке сопоставьте три модели и выведите их названия.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить