Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Mysqld-nt -standalone




Если не появится сообщение об ошибке, то СУБД MySQL запущена. Для создания БД и таблиц используются команды языка SQL.

Дополнительно требуется подключить библиотеку, содержащую драйвер MySQL

mysql-connector-java-3.1.12.jar,

и разместить ее в каталоге /WEB-INF/lib проекта.

Простое соединение и простой запрос

Теперь следует воспользоваться всеми предыдущими инструкциями и создать пользовательскую БД с именем db2 и одной таблицей users. Таблица должна содержать два поля: символьное – name и числовое – phone и несколько занесенных записей. Сервлет, осуществляющий простейший запрос на выбор всей информации из таблицы, выглядит следующим образом.

/* пример # 1: соединение с базой: ServletToBase.java */

package chapt20;

import java.io.*;

import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*;

 

public class ServletToBase extends HttpServlet {

public void doGet(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

public void doPost(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

 

public void showInfo(PrintWriter out, ResultSet rs)

throws SQLException {

out.print("From DataBase:");

while (rs.next()) {

out.print("<br>Name:-> " + rs.getString(1)

+ " Phone:-> " + rs.getInt(2));

}

}

public void performTask(HttpServletRequest req,

HttpServletResponse resp) {

resp.setContentType("text/html; charset=Cp1251");

PrintWriter out = null;

try { //1

out = resp.getWriter();

try { //2

 

Class.forName( "org.gjt.mm.mysql.Driver" );

// для MSAccess

/* return "sun.jdbc.odbc.JdbcOdbcDriver" */

// для PostgreeSQL

/* return " org.postgreesql.Driver " */

Connection cn = null;

try { //3

cn =

DriverManager.getConnection( "jdbc:mysql://localhost/db2",

"root", "pass");

// для MSAccess

/* return "jdbc:odbc:db2"; */

// для PostgreeSQL

/* return "jdbc:postgreesql://localhost/db2"; */

Statement st = null;

try { //4

st = cn.createStatement();

ResultSet rs = null;

try { //5

rs = st.executeQuery( "SELECT * FROM users" );

out.print("From DataBase:");

while (rs.next()) {

out.print("<br>Name:-> " + rs.getString(1)

+ " Phone:-> " + rs.getInt(2));

}

} finally { // для 5-го блока try

/ * закрыть ResultSet, если он был открыт и ошибка

произошла во время чтения из него данных */

// проверка успел ли создаться ResultSet

if (rs!= null) rs.close();

Else

out.print("ошибка во время чтения данных из БД");

}

} finally { // для 4-го блока try

/* закрыть Statement, если он был открыт и ошибка

произошла во время создания ResultSet */

// проверка успел ли создаться Statement

if (st!= null) st.close();

else out.print("Statement не создан");

}

} finally { // для 3-го блока try

/* закрыть Connection, если он был открыт и ошибка произошла

во время создания ResultSet или создания и использования

Statement */

// проверка - успел ли создаться Connection

if (cn!= null) cn.close();

else out.print("Connection не создан");

}

} catch (ClassNotFoundException e) { // для 2-го блока try

out.print("ошибка во время загрузки драйвера БД");

}

}

/* вывод сообщения о всех SQLException и IOException в блоках finally, */

/* поэтому следующие блоки catch оставлены пустыми */

catch (SQLException e) {

} // для 1-го блока try

catch (IOException e) {

} // для 1-го блока try

finally { // для 1-го блока try

/* закрыть PrintWriter, если он был инициализирован и ошибка

произошла во время работы с БД */

// проверка, успел ли инициализироваться PrintWriter

if (out!= null) out.close();

Else

out.print("PrintWriter не проинициализирован");

}

}

}

В несложном приложении достаточно контролировать закрытие соединения, так как незакрытое (“провисшее”) соединение снижает быстродействие системы.

Еще один способ соединения с базой данных возможен с использованием файла ресурсов database.properties, в котором хранятся, как правило, путь к БД, логин и пароль доступа. Например:

url =jdbc:mysql://localhost/my_db?useUnicode=true&

characterEncoding=Cp1251

driver =org.gjt.mm.mysql.Driver

user =root

password =pass

В этом случае соединение создается в классе бизнес-логики, отвечающем
за взаимодействие с базой данных, с помощью следующего кода:

public Connection getConnection()

throws SQLException {

 

ResourceBundle resource =

ResourceBundle. getBundle ("database");

String url = resource.getString("url");

String driver = resource.getString("driver");

String user = resource.getString("user");

String pass = resource.getString("password");

try {

Class. forName (driver).newInstance();

} catch (ClassNotFoundException e) {

throw new SQLException("Драйвер не загружен!");

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

return DriverManager. getConnection (url, user, pass);

}

Объект класса ResourceBundle, содержащий ссылки на все внешниересурсы проекта, создается с помощью вызова статического метода
getBundle(String filename), с параметром в виде имени необходимого файла ресурсов. Если требуемый файл отсутствует, то генерируется исключи­тельная ситуация MissingResourceException. Для чтения из объекта ресурсов используется метод getString(String name), извлекающий информацию по указанному в параметре ключу. В классе ResourceBundle определен ряд полезных методов, в том числе метод getKeys(), возвращающий объект Enumeration, который применяется для последовательного обращения к элементам. Методы getObject(String key) и getStringArray(String key) извлекают соответственно объект и массив строк по передаваемому ключу.

Метаданные

Существует целый ряд методов интерфейсов ResultSetMetaData
и DatabaseMetaData для интроспекции объектов. С помощью этих методов можно получить список таблиц, определить типы, свойства и количество столбцов БД. Для строк подобных методов нет.

Получить объект ResultSetMetaData можно следующим образом:

ResultSetMetaData rsMetaData = rs.getMetaData();

Некоторые методы интерфейса ResultSetMetaData:

int getColumnCount() – возвращает число столбцов набора результатов объекта ResultSet;

String getColumnName(int column) – возвращает имя указанного столбца объекта ResultSet;

int getColumnType(int column) – возвращает тип данных указанного столбца объекта ResultSet и т.д.

Получить объект DatabaseMetaData можно следующим образом:

DatabaseMetaData dbMetaData = cn.getMetaData();

Некоторые методы весьма обширного интерфейса DatabaseMetaData:

String getDatabaseProductName() – возвращает название СУБД;

String getDatabaseProductVersion() – возвращает номер версии СУБД;

String getDriverName() – возвращает имя драйвера JDBC;

String getUserName() – возвращает имя пользователя БД;

String getURL() – возвращает местонахождение источника данных;

ResultSet getTables() – возвращает набор типов таблиц, доступных для данной БД, и т.д.

Подготовленные запросы и хранимые процедуры

Для представления запросов существуют еще два типа объектов PreparedStatement и CallableStatement. Объекты первого типа используются при выполнении часто повторяющихся запросов SQL. Такой оператор предварительно готовится и хранится в объекте, что ускоряет обмен информацией с базой данных. Второй интерфейс используется для выполнения хранимых процедур, созданных средствами самой СУБД.

Для подготовки SQL-запроса, в котором отсутствуют конкретные параметры, используется метод prepareStatement(String sql) интерфейса Connection, возвращающий объект PreparedStatement. Установка входных значений конкретных параметров этого объекта производится с помощью методов
setString(), setInt() и подобных им, после чего и осуществляется
непосредственное выполнение запроса методами executeUpdate(),
executeQuery(). Так как данный оператор предварительно подготовлен, то он выполняется быстрее обычных операторов, ему соответствующих. Оценить пре-
имущества во времени можно, выполнив большое число повторяемых запросов
с предварительной подготовкой запроса и без нее.

/* пример # 2: создание и выполнение подготовленного запроса:

PreparedStatementServlet.java */

package chapt20;

import java.io.*;

import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class PreparedStatementServlet extends HttpServlet {

protected void doGet(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException, IOException {

performTask(req, resp);

}

protected void doPost(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException, IOException {

performTask(req, resp);

}

protected void performTask(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

resp.setContentType("text/html");

PrintWriter out = resp.getWriter();

try {

Class.forName("org.gjt.mm.mysql.Driver");

Connection cn = null;

try {

cn = DriverManager.getConnection("jdbc:mysql://localhost/db3","root","");

PreparedStatement ps = null;

String sql =

"INSERTINTO emp(id,name,surname,salary) VALUES(?,?,?,?)";

//компиляция (подготовка) запроса

ps = cn.prepareStatement(sql);

Rec.insert(ps, 2203, "Иван", "Петров", 230);

Rec.insert(ps, 2308, "John", "Black", 450);

Rec.insert(ps, 2505, "Mike", "Call", 620);

out.println("COMPLETE");

} finally {

if (cn!= null) cn.close();

}

} catch (Exception e) {

e.printStackTrace();

}

out.close();

}

}

class Rec {

static void insert(PreparedStatement ps, int id, String name, String surname, int salary)

throws SQLException {

//установка входных параметров

ps.setInt(1, id);

ps.setString(2, name);

ps.setString(3, surname);

ps.setInt(4, salary);

//выполнение подготовленного запроса






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных