Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JDBC как? 
:(
    Опции темы
Гость_junior
Дата 28.4.2005, 14:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я еще новичок, и поэтому задаю этот вопрос.
Скажите, как получить доступ из приложения к базе на Оракле 9i. Какой драйвер и как использовать?
  Вверх
batigoal
Дата 28.4.2005, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



JDBC драйвер Оракла, конечно. Использовать его так же, как это делается обычно. Код нужен? Он такой же, как и для любой другой базы.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Гость_junior
Дата 28.4.2005, 18:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если не сложно, то да! а то я никак не могу разобраться.
  Вверх
batigoal
Дата 28.4.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Ну, если без деталей, то так (драйвер можно качнуть на сайте Оракла):

Код

Connection conn;
Statement stmt;
PreparedStatement pstmt;
ResultSet rs;

URL = new String("jdbc:oracle:thin:@localhost:1521:db");
user = new String("15011");
password = new String("15011");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection(URL,user,password);
stmt=conn.createStatement();


Сейчас просто времени нет расписывать, извини smile
Загляни в документацию JDBC.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
igon
Дата 29.4.2005, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 1
Всего: 21



Вот "выдержки" из рабочей программы
Код

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
...
public class MyOracle
  {
    public  Connection   conn;
    public  String       url= "jdbc:oracle:thin:@localhost:1521:bank2";
    public  String       userName= "probe";
    public  String       userPwd= "probe";
...
    public MyOracle()
      {
        try
          {
            DriverManager.registerDriver(new OracleDriver());
          }
          catch(Exception e)
            {
              e.printStackTrace();
            }
      }
...
    private Connection setConnection() throws SQLException
      {
        conn = (OracleConnection)DriverManager.getConnection(url, userName, userPwd);
        return conn;
      }

    public Connection getConnection() throws SQLException
      {
        if (conn == null)
          {
            setConnection();   
          }
        return conn;
      }

    public void closeConnection() 
      {
        if (conn != null)
          {
            try
            {
              conn.commit();   
              conn.close();   
            }
            catch (SQLException e)
              {
                e.printStackTrace();
              }
          }
      }
Если будут вопросы и по conn - задавай




--------------------
Хотите поговорить об этом?
PM   Вверх
Се ля ви
Дата 2.5.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Я люблю делать всё короче. Например, Connection использую неявно, а драйвер оставляю возможность передавать параметром по этому импортировать внутри кода:
Код

public class ClassName {

    private Statement stmt;
    private ResultSet rs;

    public ClassName(){
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); // Загрузка драйвера

            stmt = DriverManager
                        .getConnection(                                       // Подключение к Базе Данных:
                            "jdbc:oracle:thin:@domain:1521:sid", // строка запроса
                            "user",                                                 // пользователь
                            "pass"                                                 // пароль
                        )
                            .createStatement();

        } catch (SQLException e){ e.printStackTrace(); }
    }
    public int method(){
        try {
             rs =
                stmt
                    .executeQuery(
                        "select field1 " +
                        "from table1"
                    );

            if (rs.next()) return Integer.parseInt(rs.getString(1));
            else return 0;


        } catch (SQLException e) { e.printStackTrace(); );
        return 0;
    }

    public void finalize(){

        try {
            stmt.close();
            stmt.getConnection().close();

        } catch (SQLException e){ e.printStackTrace(); }
    }
}


Это сообщение отредактировал(а) Се ля ви - 4.5.2005, 00:02


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Гость_junior
Дата 2.5.2005, 20:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, но все равно не понятно.
Во-первых, где можно взять документацию по jdbc понятную?

Во-вторых, что за пакеты:
Код

oracle.jdbc.OracleConnection,
oracle.jdbc.OracleDriver?


В-третьих, тут используется мост JDBC-ODBC:
Код

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")?


И последнее, у меня Oracle9iAS стоит, я так понимаю там есть сам JDBC драйвер. Что мне с ним вообще делать? Куда копировать? Как вообще все это происходит. Расскажите, пожалуйста, по-подробнее. Или ссылочку киньте8)

Спасибо
  Вверх
Се ля ви
Дата 2.5.2005, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Гость_junior
зарегистрируйся, пожалуйста smile

Цитата
где можно взять документацию по jdbc понятную?

На сайте SUN`а, например - http://java.sun.com/products/jdbc/index.jsp. В книжке ещё можно, в т.ч. и в электронной. Вообще, JDBC - это часть J2EE, соответственно поройся в ссылках на описание технологий J2EE.


Цитата
Во-вторых, что за пакеты:

Очевидно, драйверы.

Цитата
тут используется мост JDBC-ODBC

угу


Цитата
И последнее, у меня Oracle9iAS стоит, я так понимаю там есть сам JDBC драйвер. Что мне с ним вообще делать? Куда копировать? Как вообще все это происходит. Расскажите, пожалуйста, по-подробнее.

Копируй его в то место, где он будет доступен для твоей JRE - вот и всё. Например, в директорию \jre\lib\ext
После этого перегружай сервер или что там у тебя Java использует - и вперёд, с песней smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
LSD
Дата 3.5.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата
Во-вторых, что за пакеты:

Это Oralce-овская реализация классов java.sql.Connection java.sql.Driver. Кстати Oralce поставляет 2 типа драйверов thin и oci. В примерах что были используется thin. Для своей работы он требует только jar с драйверами. oci драйвер требует установленного клиента и использует информацию из tsnames.ora, и чуток побыстрее (при массовом insert он у меня оказался быстрее на 5%).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Stampede
Дата 3.5.2005, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата
Я люблю делать всё короче


Предупреждение начинающим: Се ля ви приводит очень неудачный пример организации кода. Использовать его в качестве шаблона для своих программ очень не рекомендуется. Почему - сейчас объясню.

Цитата
драйвер оставляю возможность передавать параметром по этому импортировать внутри кода


Немножко путанно, но если имеется в виду возмржность смены СУБД/дравера через конфигурацию, то в приведенного фрагмента кода этого как раз не происходит, а напротив, мы видим "зашитые" в код и имя драйвера, и строку соединения.


Цитата
Connection использую неявно


Тоже ничего хорошего. Что мы видим? Переменная типа Connection объявлена как приватная и типа инкапсулирована, и мы ее не видим и не слышим и знать про нее не хотим, а рассматриваем класс как объект, который знает, как получить какие-то определенные данные. Мысль понятная, но не все на самом деле так просто.

Раз у нас есть такой вот класс-"посредник к данным" (data-aware class), то должны быть каким-то образом продуманы вопросы, связанные с жизненным циклом его коннекции, а иначе есть возможность заполучить в будущем разного рода неприятности в виде бесконтрольного роста числа соединений (и исчерпание в конце концов их лимита), незакрытих коннекций, неправильно инициализированных коннекций и т. д.

Для этого нужно, чтобы или коннекция была доступна извне, или чтобы класс позволял в явном виде выполнять:
  • открытие;
  • фиксацию;
  • откат;
  • закрытие;

Более того, в любом мало-мальски серъезном приложении ты хочешь иметь полный контроль за тем, чтобы все действия по доступу к данным, которые относятся к одной логической операции, выполнялись в рамках одной транзакции. Поэтому таким методам, как приведенный метод method(), лучше использовать внешнюю коннекцию, передаваемую как параметр. Ну и я уж не говорю о том, что такой метод не имеет права глотать исключения, а должен отфутболивать их вверх по инстанции.

Резюмируя, что мы имеем? Мы имеем класс, где в одну кучу навалены вещи, которые при хорошем дизайне должны быть четко разделены:

- Выделение коннекций

Которое должно быть, во-первых, конфигурируемым, а во-вторых иметь достаточно абстрактный интерфейс, чтобы при случае его можно было заменить на механизм пула соединений или механизм получения через JNDI или бог знает какой еще механизм вы захотите подтыкнуть. Ну не надо зашивать эти вещи в код utility-класса!

- Выполнение действий по доступу к данным

Сама по себе идея неплохая - сгруппировать различные SQL команда в одном классе, но это годится только для небольших приложений, где количество различных запросов находится в обозримых пределах. Даже если идти по такому пути, нужно не забывать еще несколько вещей: по возможности использовать PreparedStatement вместо Statement, использовать внешниюю коннекцию, не ловить исключения.

- Управление жЫзненым циклом коннекций

Ну про метод finally() я вообще молчу. Очевидно, имелось в виду автоматическое закрытие коннекции при уничтожении объекта. Для этого служит метод finalize(), но использовать его для управления жизненным циклом таких нежных ресурсов как датабазные коннекции - идея не очень хорошая. Почему - могу объяснить. Потом.

Общий вывод: не используйте этот пример как руководство к действию

Се ля ви, чур, без обид - сам напросился smile
PM WWW   Вверх
Гость_junior
Дата 3.5.2005, 23:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ок, огромное спасибо. Пойду разбираться в столь исчерпывающей информации. Спасибо всем, если появятся вопросы, то обязательно задам.
А у меня тут первая проблемка, копирую архив с классами от Оракла в указанную директорию
Цитата
\jre\lib\ext

компилятор грит, что КлассНотФоунд. Копирую в директорию, указанную в переменной Класспатх - то же самое. А вот копирую в ту же директорию где и программка, то все ок. Почему так?
Спасибо
  Вверх
Се ля ви
Дата 4.5.2005, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Цитата(Stampede @ 3.5.2005, 22:24)
Цитата (Се ля ви @ 2.5.2005, 20:14)
драйвер оставляю возможность передавать параметром по этому импортировать внутри кода

Немножко путанно, но если имеется в виду возмржность смены СУБД/дравера через конфигурацию, то в приведенного фрагмента кода этого как раз не происходит, а напротив, мы видим "зашитые" в код и имя драйвера, и строку соединения.

Дык я тут каак раз и привёл код для замены. Просто строку запроса к драйверу меняем на параметр, читаемый из конфига - и загружается нужный драйвер smile Просто хотел продемонстрировать как можно имея строку с именем класса, загрузить драйвер уже в скомпилированном коде smile

Насчёт остального - не вижу особенного криминала в том, что я не сохраняю специально ссылку на объект connection - как раз наоборот, ИМХО, в больших программах от большого количества перемменных можно запутаться, а сам объект connection, соответствующий данному statement`у легко получить, вызвав его метод stmt.getConnection(), что я и проделывал в конце кода, когда коннекшн нужно закрыть. Т.е. от того, что я не сохранил ссылку, объект я никуда не потерял и если нужен, могу ссылку на него легко получить. smile

Впрочем это всё ИМХО. Так легче персонально мне, и я вовсе не пытаюсь тут кому-то чего-то навязывать. Каждый делает как проще именно ему. Я вот не люблю огромного количества переменных, по-этому люблю их использовать неявно и вытаскивать когда нужно. Я могу понять, если кому-то это удобней, чем помнить, как что когда откуда вытаскивать.

Цитата(Stampede @ 3.5.2005, 22:24)
а иначе есть возможность заполучить в будущем разного рода неприятности в виде бесконтрольного роста числа соединений (и исчерпание в конце концов их лимита), незакрытих коннекций, неправильно инициализированных коннекций и т. д.

Имено по-этому в конце - stmt.getConnection().close(); smile

Цитата(Stampede @ 3.5.2005, 22:24)
не ловить исключения.

Ну это я уже просто так поставил - на самом деле от специфики задачи зависит то, как будут исключения обрабатываться. Что мне по-твоему нужно было в типовом примере написать?

Цитата(Stampede @ 3.5.2005, 22:24)
Ну про метод finally() я вообще молчу. Очевидно, имелось в виду автоматическое закрытие коннекции при уничтожении объекта. Для этого служит метод finalize()

Да, совсэм забыл, ща поправлю...

Stampede вообще, многовато требований к типовому примеру у тебя, не находишь? Ну да, вместо finalize() можно использовать шаблон Singleton, или другие иинтересности, но это уже не для начинающих будет уж точно, а человеку бы в этом разобраться суметь - и то ладно... Это потом уж можно дальше копать, если интерес не отпадёт!..

P.S. Хотя действительно, соглашусь, что начинающим такой пример лучше не использовать - человек должен сам придти к такой простоте кода, иначе не будет
а) её ценить
б) понимать по-другому организованный код других программистов.

P.P.S.
Цитата(Stampede @ 3.5.2005, 22:24)
Се ля ви, чур, без обид - сам напросился

Да ладно, коли по делу, так не жалко... smile Лишь бы человек правильно сориентировался. smile
Добавлено @ 00:11
Цитата
А у меня тут первая проблемка, копирую архив с классами от Оракла в указанную директорию
Цитата
\jre\lib\ext

компилятор грит, что КлассНотФоунд

Попробуй винду перезагрузить, может JRE старая не закрылась?.. Должен работать вариант с \jre\lib\ext - проверено неоднократно.
Цитата
копирую в ту же директорию где и программка, то все ок.

Для этого перегрузка не нужна - он первым делом классы нужные ищет в директории твоей программы. Но вообще-то в маломальски-крупном проекте используются пакеты и там такой трюк не пройдёт...

А у тебя не может несколько JRE стоять?.. Тогда ты, может быть, не в ту суёшь? Например, в средах разработки типа JBuilder`а, IDEA и Eclipse - свои собственные JRE.

Можешь, конечно, использовать драйвер как библиотеку, но это не даст тебе его именно конфигурить, например из сервера...

Это сообщение отредактировал(а) Се ля ви - 4.5.2005, 00:35


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
batigoal
Дата 4.5.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Stampede @ 3.5.2005, 22:24)
Почему - могу объяснить. Потом.

Объясни сейчас, плз smile
Цитата(Stampede @ 3.5.2005, 22:24)
коннекция

Умоляю... соединение! smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Гость_junior
Дата 4.5.2005, 10:18 (ссылка)    |    (голосов: 1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
А у тебя не может несколько JRE стоять?.. Тогда ты, может быть, не в ту суёшь? Например, в средах разработки типа JBuilder`а, IDEA и Eclipse - свои собственные JRE.

у меня стоит NetBeans IDE 3.6 и jre там своего нету...по-моему. стоит так же j2sdk1.4.2_04 в jre директорию которого я и кидал классы Оракла. Так значит на переменную Classpath никакой завязки нет?
спасибо
  Вверх
batigoal
Дата 4.5.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата
значит на переменную Classpath никакой завязки нет?

Просто многие IDE, похоже, подменяют classpath на свое значение. Не знаю, как с этим у NetBeans.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1503 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.