22 ноября 2011 г.

Основы JDBC


JDBC (Java DataBase Connectivity) - очень простая технология, обеспечивающая вашему приложению связь с базой данных. Даже если вы не планируете использовать её напрямую, то в любом случае было бы полезно знать как на самом деле работает ваш любимый фреймворк для БД.
В данной заметке мне бы хотелось пройтись по всем методам технологии, которые вероятнее всего вы будете использовать при написании своего приложения. Начнем с установки соединения.


Соединение с БД
Существует 2 способа установки соединения с БД: через JNDI или вручную. Рассмотрим второй вариант. Для установки соединения вызывается метод getConnection класса DriverManager. Например:
Connection connection = DriverManager.getConnection(
    "jdbc:oracle:thin:@//localhost:1521/MY_DB",
    "username", "password");
Конечно драйвер БД должен быть в системе. Если он не подхватывается автоматически, вы можете указать его вручную следующим образом (для Оракла):
Class.forName("oracle.jdbc.driver.OracleDriver");
Теперь про JNDI. Предположим, что у вас уже зарегистрированый DataSource. Тогда получить соединение можно так:
InitialContext ctxt = new InitialContext();
DataSource ds = (DataSource) ctxt.lookup("jdbc/MyDataSource");
conn = ds.getConnection();
Итак, соединения установлено. Попробуем что-то получить из базы.

Выборка данных
Существует 2 способа выполнения запросов: через Statement и через PreparedStatement. Совсем скоро вы узнаете чем они отличаются.
Statement создается следующим образом:
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM MY_TABLE");
Теперь в rs у нас будет результат выполнения запроса, т.е. все записи из таблицы MY_TABLE. Переходить по ним можно через итератор rs.next(). Допустим таблица состояла из двух колонок "foo" и "bar". Для получения данных из колонок используется следующее обращение:
rs.getString("foo");
rs.getInt("bar");
Или, если вы не хотите хардкодить имена колонок, можно использовать обращения по индексу, например:
rs.getString(1);
rs.getInt(2);
После того как мы получили необходимые данные Statement нужно закрыть. Делается это так:
stmt.close();
Теперь о PreparedStatement. Если вы хотите: использовать один и тот же запрос несколько раз, хранить запросы отдельно от основного кода, сделать запрос более безопасным и т.п., то их использование было бы хорошим решением. Сначала вы описываете запрос, например так:
private static final String pstmtString = "SELECT * FROM MY_TABLE WHERE foo = ? AND bar = ?";
После этого вы создаете объект PreparedStatement, например так:
PreparedStatement stmt = connection.prepareStatement(pstmtString);
и в запросе подставляете вместо знаков ? значения:
stmt.setString(1, "abc");
stmt.setInt(2, "42);
Стоит заметить, что эти методы экранируют входные данные, т.е. если кто-то захочет вместо "abc" вставить свой запрос, то у него ничего не получится. Это является важным моментом в обеспечении безопасности вашего приложения.
Остальная работа с PreparedStatement проводится аналогично, как если бы мы использовали просто Statement.

Вычитка и обновление данных
Для вычитки данных использоуется метод класса Statement (или PreparedStatement) executeQuery(), а для обновления (и добавления) - updateQuery().

Вот собственно и всё, что нужно знать в рядовой работе с JDBC. Теперь осталось только выучить SQL. :)

1 комментарий:

Примечание. Отправлять комментарии могут только участники этого блога.