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

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

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

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

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

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

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



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


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

Да и DAO, тогда не нужен.
Т.е. вы просто пишите функцию, которая собирает нужный вам объект :-)
...
Рейтинг: 0 / 0
07.03.2014, 09:03
    #38580781
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC + SQL + Model = как правильно сделать запрос ?
Вам верно сказали.
Начните с карандаша и формы которую вы хотите.
И не пишите свой первый велосипед.
...
Рейтинг: 0 / 0
07.03.2014, 09:07
    #38580785
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC + SQL + Model = как правильно сделать запрос ?
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
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC + SQL + Model = как правильно сделать запрос ? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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