Помогите получить данные из таблицы 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 шт):
Вы не сможете получить данные об имени покупателя и названии товара из таблицы 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")
));
}