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. :)
палец вверх!
ОтветитьУдалить