Помогите получить данные из таблицы SQL в JAVA и вывести их?

Сделала часть кода, задача стоит из таблиц users и items, выделить пользователя с именем john и товары кaтегории hats, при этом занести их в третью таблицу orders. Далее из этой таблицы получить эти данные, чтобы они выводились в формате строк, где john купил и красную кепку, и синюю кепку.введите сюда описание изображения

Как их объединить так, чтобы они выводились? Нужно сделать именно на языке Java?

package dz4;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;


public class DB_dz4 {
    private final String HOST = "localhost";
    private final String PORT = "3306";
    private final String DB_NAME = "dz_4";
    private final String LOGIN = "root";
    private final String PASS = "root";

    private Connection dbConn = null;

    private Connection getDbConnection() throws ClassNotFoundException, SQLException {
        String connStr = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DB_NAME ;
        Class.forName("com.mysql.cj.jdbc.Driver");
        dbConn = DriverManager.getConnection(connStr, LOGIN, PASS);
        return dbConn;
    }

    public void isConnected() throws SQLException, ClassNotFoundException {
        dbConn = getDbConnection();
        System.out.println(dbConn.isValid(1000));
    }

    public void setOrders(String orders) throws SQLException, ClassNotFoundException{
        String sql = " SELECT `id` FROM `users` WHERE `login` = ? LIMIT 1";
        PreparedStatement prUsers = getDbConnection().prepareStatement(sql);
        prUsers.setString(1, "john");
        ResultSet resUsers = prUsers.executeQuery();

        int user_id = 0;
        while (resUsers.next())
            user_id = resUsers.getInt("id");
        System.out.println(user_id);

        sql = "SELECT `id` FROM `items` WHERE `category` = ?";
        PreparedStatement prTovar = getDbConnection().prepareStatement(sql);
        prTovar.setString(1, "hats");
        ResultSet resTovar = prTovar.executeQuery();

        List<Integer> arr_items_id = new ArrayList<>();

        while (resTovar.next())
            arr_items_id.add(resTovar.getInt("id"));
        for(int item_id: arr_items_id){
            sql = "INSERT INTO `orders` (user_id, item_id) VALUES (?,?)";
            PreparedStatement prOrders = getDbConnection().prepareStatement(sql);
            prOrders.setInt(1,user_id);
            prOrders.setInt(2, item_id);
            prOrders.executeUpdate();
        }

        sql = "SELECT CONCAT `user_id`,`item_id` FROM `orders` " +
                "GROUP BY `item_id` ";
        PreparedStatement order = getDbConnection().prepareStatement(sql);
        ResultSet res = order.executeQuery(sql);
        while (res.next())
            System.out.println(res.getString("item_id"));
    }
    }


Ответы (1 шт):

Автор решения: Nowhere Man

Вы не сможете получить данные об имени покупателя и названии товара из таблицы orders, так как в неё записываются только идентификаторы user_id, item_id.

Фактически вам нужно будет повторить вычитку данных, построив запрос с JOIN для всех указанных таблиц и WHERE для соответствующих полей.

Пример внизу написан с использованием многострочного литерала, который поддерживается начиная с Java 15, вышедшей в сентябре 2020. Для более старых версий его нужно будет переписать в одну строку.

sql = """
    SELECT u.login, i.name item_name 
    FROM `users` u 
    JOIN `orders` o ON u.id = o.user_id 
    JOIN `items` i ON o.item_id = i.id 
    WHERE u.id = ? AND i.category = ?
""";

PreparedStatement order = getDbConnection().prepareStatement(sql);
order.setInt(1, user_id);
order.setString(2, "hats");
ResultSet res = order.executeQuery();
while (res.next()) {
    System.out.println(String.join(
        " - ", res.getString("login"), res.getString("item_name")
    ));
}
→ Ссылка