powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC + SQL + Model = как правильно сделать запрос ?
11 сообщений из 11, страница 1 из 1
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580378
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте представим, что есть доступ до БД через JDBC, запросы к БД используя SQL. Есть база данных, допусти музыки.
Есть много связанных табличек, допустим есть Альбом а в нем есть (Артист, Описание альбома, Картинка да еще и Песни) = то есть целая композиция.
а таблицы Артист, Описание альбома, Картинка, Песня = еще связанные как то там и имеют поля разные.

И вот мне надо на JSP страницу отрендерить Альбом и прочую инф., дак вот сам вопрос, как это правильно из БД вытащить эти данные, что бы было правильно сделано и не геморно.

Я например знаю как сделать простой селект к БД, вытащить данные из ResultSet и передать 1-у модель куда то дальше, но когда Модель как в примере с Альбомом может включать и другие модель, которые с логике выступают атрибутами к таблице Альбом ...
понятия не имею, как это сделать, одним запросом или несколько простых селектов, используя ДАО в других ДАО, которые еще в других ДАО используют вытаскивание данных ... то ли inner join то ли natural join ...
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580381
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hibernate
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580387
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

я бы с большой радостью его бы использовал и даже собирают учить, но я хочу разобраться как это сделать так можно ... что надо и как оно выглядит хоть примерно ... полюбому hibernate использует JDBC - а другого доступа к БД на ДЖАВЕ не думаю что есть
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580390
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myBatis
QueryDSL
Spring JDBCTemplate
Apache Commons DB Utils
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580393
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580394
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111Я например знаю как сделать простой селект к БД, вытащить данные из ResultSet и передать 1-у модель куда то дальше, но когда Модель как в примере с Альбомом может включать и другие модель, которые с логике выступают атрибутами к таблице Альбом ...
понятия не имею, как это сделать, одним запросом или несколько простых селектов, используя ДАО в других ДАО, которые еще в других ДАО используют вытаскивание данных ... то ли inner join то ли natural join ...

Нужно выгрести данные, либо отдельными запросами. либо JOIN-ом, всё зависит от типа связей между сущностями.
Затем нужно данные поместить в объекты. Для этого используютя разнообразные инструменты, список, я привел выше.
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580407
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНужно выгрести данные, либо отдельными запросами. либо JOIN-ом, всё зависит от типа связей между сущностями.
Затем нужно данные поместить в объекты.

ну если в примере с Альбомом мне надо выгрести 3 запросами из 3 таблиц, потом вытащить основное из 4-й таблице Альбом,
поместить 3 поля в альбом + сам альбом и передать дальше. Ну это в теории понятно, а вот с ДЖОЙНАМИ не очень, по сути, если с джойнами оно мне выдаст большую таблицу и там будет надо выбрать что мне надо, как то не очень с ООПе стороны мне кажется, ну это пока в теории ...

Blazkowicz Для этого используютя разнообразные инструменты, список, я привел выше.
а без них никак ??? я еще не знаю, в каких моментах можно это все использовать и когда нельзя, не хочу себя со старта к хорошему приучаться и не понимать как оно работает, рано или поздно, боком вылезет непонимание ...
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580422
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111Ну это в теории понятно, а вот с ДЖОЙНАМИ не очень, по сути, если с джойнами оно мне выдаст большую таблицу и там будет надо выбрать что мне надо, как то не очень с ООПе стороны мне кажется, ну это пока в теории ...
Результат JOIN-а действительно не просто разгребать в объекты. Поэтому существует куча фреймверков, которые это сильно упращают.
ООП к этому отношения не имеет. Реляционная структура на объекты однозначно не проецируется. Поэтому приходится маппить одно на другое.



botasa111а без них никак ??? я еще не знаю, в каких моментах можно это все использовать и когда нельзя, не хочу себя со старта к хорошему приучаться и не понимать как оно работает, рано или поздно, боком вылезет непонимание ...
Ну, пишите велосипед самостоятельно. Будет понятнее польза от фреймверков.
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580767
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111И вот мне надо на JSP страницу отрендерить Альбом и прочую инф., дак вот сам вопрос, как это правильно из БД вытащить эти данные, что бы было правильно сделано и не геморно.


Ну я делаю так.
В начале пишу класс который будет отображать что-то на странице.
Например Album
Потом смотрю какие данные он использует.
Ну а дальше просто.
Если есть возможность замапить все данные одним запросом, то пишу его.
Если нет, то пишу несколько запросов.

Да и DAO, тогда не нужен.
Т.е. вы просто пишите функцию, которая собирает нужный вам объект :-)
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580781
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам верно сказали.
Начните с карандаша и формы которую вы хотите.
И не пишите свой первый велосипед.
...
Рейтинг: 0 / 0
JDBC + SQL + Model = как правильно сделать запрос ?
    #38580785
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Velosiped.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
package testvelosiped;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import oracle.jdbc.OraclePreparedStatement;
import oracle.jdbc.OracleTypes;
import static testvelosiped.Db.isNullOrClosed;
import static testvelosiped.Db.prepareStatement;

public class Velosiped {

    public final int id;
    private String modelName;
    private double height, length, width, weight;

    private Velosiped(ResultSet rs) throws SQLException {
        id        = rs.getInt   (1);
        modelName = rs.getString(2);
        height    = rs.getDouble(3);
        length    = rs.getDouble(4);
        width     = rs.getDouble(5);
        weight    = rs.getDouble(6);
    }

    //<editor-fold defaultstate="collapsed" desc="create">
    private static OraclePreparedStatement psCreate;
    public static Velosiped create(String modelName, double height, double length, double width, double weight) throws SQLException {
        if (isNullOrClosed(psCreate)) {
            psCreate = (OraclePreparedStatement) prepareStatement(
                    "INSERT INTO your_schema_name.velosipeds (model_name, height, length, width, weight) " +
                    "VALUES (?, ?, ?, ?, ?) " +
                    "RETURNING velosiped_id, model_name, height, length, width, weight INTO ?, ?, ?, ?, ?, ?");
            psCreate.registerReturnParameter(6,  OracleTypes.NUMBER);
            psCreate.registerReturnParameter(7,  OracleTypes.VARCHAR);
            psCreate.registerReturnParameter(8,  OracleTypes.NUMBER);
            psCreate.registerReturnParameter(9,  OracleTypes.NUMBER);
            psCreate.registerReturnParameter(10, OracleTypes.NUMBER);
            psCreate.registerReturnParameter(11, OracleTypes.NUMBER);
        }
        psCreate.setString(1, modelName);
        psCreate.setDouble(2, height);
        psCreate.setDouble(3, length);
        psCreate.setDouble(4, width);
        psCreate.setDouble(5, weight);
        if (psCreate.executeUpdate() > 0) {
            try (ResultSet rs = psCreate.getReturnResultSet()) {
                if (rs.next()) {
                    return new Velosiped(rs);
                }
            }
        }
        throw new SQLException("Не удалось вставить данные в таблицу velosipeds");
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="read">
    private static PreparedStatement psQueryAll;
    public static ArrayList<Velosiped> queryAll() throws SQLException {
        if (isNullOrClosed(psQueryAll)) {
            psQueryAll = prepareStatement(
                    "SELECT velosiped_id, model_name, height, length, width, weight " +
                    "FROM your_schema_name.velosipeds");
        }
        try (ResultSet resultSet = psQueryAll.executeQuery()) {
            ArrayList<Velosiped> list = new ArrayList<>(50);
            while (resultSet.next()) {
                list.add(new Velosiped(resultSet));
            }
            return list;
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="update">
    private static OraclePreparedStatement psUpdateModelName;
    public void updateModelName(String modelName) throws SQLException {
        if (isNullOrClosed(psUpdateModelName)) {
            psUpdateModelName = (OraclePreparedStatement) prepareStatement(
                    "UPDATE your_schema_name.velosipeds " +
                    "SET model_name = ? " +
                    "WHERE velosiped_id = ? " +
                    "RETURNING model_name INTO ?");
            psUpdateModelName.registerReturnParameter(3, OracleTypes.VARCHAR);
        }
        psUpdateModelName.setString(1, modelName);
        psUpdateModelName.setInt(2, id);
        if (psUpdateModelName.executeUpdate() > 0) {
            try (ResultSet rs = psUpdateModelName.getReturnResultSet()) {
                if (rs.next()) {
                    this.modelName = rs.getString(1);
                    return;
                }
            }
        }
        throw new SQLException("Не удалось обновить данные в таблице velosipeds");
    }
    //
    private static OraclePreparedStatement psUpdateSize;
    public void updateSize(double height, double length, double width) throws SQLException {
        if (isNullOrClosed(psUpdateSize)) {
            psUpdateSize = (OraclePreparedStatement) prepareStatement(
                    "UPDATE your_schema_name.velosipeds " +
                    "SET height = ?, length = ?, width = ? " +
                    "WHERE velosiped_id = ? " +
                    "RETURNING height, length, width INTO ?, ?, ?");
            psUpdateSize.registerReturnParameter(5, OracleTypes.NUMBER);
            psUpdateSize.registerReturnParameter(6, OracleTypes.NUMBER);
            psUpdateSize.registerReturnParameter(7, OracleTypes.NUMBER);
        }
        psUpdateSize.setDouble(1, height);
        psUpdateSize.setDouble(2, length);
        psUpdateSize.setDouble(3, width);
        psUpdateSize.setInt(4, id);
        if (psUpdateSize.executeUpdate() > 0) {
            try (ResultSet rs = psUpdateSize.getReturnResultSet()) {
                if (rs.next()) {
                    this.height = rs.getDouble(1);
                    this.length = rs.getDouble(2);
                    this.width  = rs.getDouble(3);
                    return;
                }
            }
        }
        throw new SQLException("Не удалось обновить данные в таблице velosipeds");
    }
    //
    private static OraclePreparedStatement psUpdateWeight;
    public void updateWeight(double weight) throws SQLException {
        if (isNullOrClosed(psUpdateWeight)) {
            psUpdateWeight = (OraclePreparedStatement) prepareStatement(
                    "UPDATE your_schema_name.velosipeds " +
                    "SET weight = ? " +
                    "WHERE velosiped_id = ? " +
                    "RETURNING weight INTO ?");
            psUpdateWeight.registerReturnParameter(3, OracleTypes.NUMBER);
        }
        psUpdateWeight.setDouble(1, weight);
        psUpdateWeight.setInt(2, id);
        if (psUpdateWeight.executeUpdate() > 0) {
            try (ResultSet rs = psUpdateWeight.getReturnResultSet()) {
                if (rs.next()) {
                    this.weight = rs.getDouble(1);
                    return;
                }
            }
        }
        throw new SQLException("Не удалось обновить данные в таблице velosipeds");
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="delete">
    private static PreparedStatement psDelete;
    public void delete() throws SQLException {
        if (isNullOrClosed(psDelete)) {
            psDelete = prepareStatement(
                    "DELETE FROM your_schema_name.velosipeds " +
                    "WHERE velosiped_id = ?");
        }
        psDelete.setInt(1, id);
        psDelete.executeUpdate();
    }
    //</editor-fold>


    //<editor-fold defaultstate="collapsed" desc="getters">
    public String getModelName() {
        return modelName;
    }

    public double getHeight() {
        return height;
    }

    public double getLength() {
        return length;
    }

    public double getWidth() {
        return width;
    }

    public double getWeight() {
        return weight;
    }
    //</editor-fold>

    @Override public int hashCode() {
        return id;
    }

    @Override public boolean equals(Object another) {
        return another instanceof Velosiped && ((Velosiped) another).id == id;
    }

    @Override public String toString() {
        return "Велосипед id: " + id + " модель: " + modelName;
    }
}

Db.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
package testvelosiped;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Properties;

public class Db {

    private static String
            CONNECTION_STRING = "jdbc:oracle:thin:@127.0.0.1:1521:XE",
            LOGIN = "velosipedist",
            PASSWORD = "velosiped"; //чтож ещё)))

    private static boolean driverLoaded;
    public static Connection openConnection() throws SQLException {
        if (!driverLoaded) {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException ex) {
                throw new SQLException("Не найден драйвер подключения к базе данных Oracle", ex);
            }
            driverLoaded = true;
        }

        Properties properties = new Properties();
        properties.put("user", LOGIN);
        properties.put("password", PASSWORD);
        properties.put("v$session.program", "velosiped_analyzer");

        Locale prevLocale = Locale.getDefault();
        try {
            Locale.setDefault(Locale.ENGLISH);
            return DriverManager.getConnection(CONNECTION_STRING, properties);
        } finally {
            Locale.setDefault(prevLocale);
        }
    }

    private static Connection connection;
    public static Connection getConnection() throws SQLException {
        if (isNullOrClosed(connection)) {
            connection = openConnection();
        }
        return connection;
    }

    public static PreparedStatement prepareStatement(String sql) throws SQLException {
        return getConnection().prepareStatement(sql);
    }

    public static boolean isNullOrClosed(Connection connection) throws SQLException {
        return connection == null || connection.isClosed();
    }

    public static boolean isNullOrClosed(PreparedStatement ps) throws SQLException {
        return ps == null || ps.isClosed() || ps.getConnection().isClosed();
    }
}

...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC + SQL + Model = как правильно сделать запрос ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]