ТОР 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, содержащий ссылки на все внешниересурсы проекта, создается с помощью вызова статического метода Метаданные Существует целый ряд методов интерфейсов ResultSetMetaData Получить объект 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. Установка входных значений конкретных параметров этого объекта производится с помощью методов /* пример # 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); //выполнение подготовленного запроса Не нашли, что искали? Воспользуйтесь поиском:
|