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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файл .properties и Web-приложение 
V
    Опции темы
MisterCleric
Дата 23.5.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Здравствуйте, уважаемые.
Почитал все на форуме о properties и так и не понял нужно оно мне или нет.
А проблема стоит такая:
У меня есть класс для работы с БД, его методы вызываются из JSP.
Так вот, хочу все запросы к БД записать в файл BDProp.properties наподобие:
Код

select1=select * from table1, table2
select2=select * from table1 where field1=
update1=INSERT INTO table (field1, field2)

Чтобы можно было их в любой момент корректировать.
Стоит ли мне делать это в файле properties, если да, то где его бандлить: в JSP или можно мой класс сделать Листенером или Фильтром и все делать в нем, а если так, то как тогда связать такой класс с JSP? 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
batigoal
Дата 23.5.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Отставив в сторонку пока вопрос с хранением запроса в Properties, обращаю твоё внимание на гораздо более интересную вещь.

Цитата(MisterCleric @  23.5.2006,  16:05 Найти цитируемый пост)
select2=select * from table1 where field1=

Делать так настоятельно НЕ рекомендуется. Используй PreparedStatement. В противном случае ты серьезно потеряешь в производительности. Дело в том, что для каждого такого "склеенного" запроса будет создаваться новый план выполнения. В случае PreparedStatement - план будет составлен один раз.


А что касается твоего вопроса - мы делали такие запросы константными строками в классах. 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Спасибо за замечание, но эт я просто для примера привел - так, набросок.
А делаеться как раз через PreparedStatement и насчет констант я знаю.
Смысл в том, что бы сделать этот класс универсальным для выполнения запросов, которые я бы безболезненно мог бы редактировать даже со странички. 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
batigoal
Дата 23.5.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MisterCleric @  23.5.2006,  16:42 Найти цитируемый пост)
Смысл в том, что бы сделать этот класс универсальным для выполнения запросов, которые я бы безболезненно мог бы редактировать даже со странички.  

Т.е. чтобы можно было изменять тексты запросов без перекомпиляции, в рантайме? 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Ага. А в JSP просто передавать моему классу ключ тогда, когда мне надо. Я в фильтрах и листенерах пока не селен, так что делаю все через JSP.
Но если нет, то тогда заброшу пока тему о properties 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
ALKS
Дата 23.5.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 11



если ты будеш использовать для чтения файла properties класс java.util.Properties то фактически каждый раз вынимая запрос будеш читать фаил а сие есть зло. если ты будеш использовать java.util.ResourceBundle то напоришся на его внутринний кэш т.е. корректировать запросы на лету - не получиться.

я бы в твоем случае, хранил бы запросы... в БД. smile 
PM   Вверх
MisterCleric
Дата 24.5.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Ага. Спасибо.
Цитата

корректировать запросы на лету - не получиться

Пока и не собираюсь
Вот java.util.ResourceBundle меня и интересует.
Где мне его создавать - в классе или JSP?
А класс мне переделывать под фильтр или листенер или постоить цепочку бинов доступа к этому классу?
В общем подскажите основную идею работы с java.util.ResourceBundle, если я хочу разделить бизнесс-логику и прдеставление. 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
chief39
Дата 24.5.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

Репутация: 11
Всего: 77



Частенько делали простенький, заточенный под конкретную задачу, конструктор запросов. + Константы, как Lamer George заметил.
В пропертисах можно хранить имена таблиц и полей. При старте - подгружать их и делать препаред стейтменты, используя свой конструкторчик(который, кстати, будет зачастую гарантировать отсутствие досадных синтаксических ошибок в запросе) 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
MisterCleric
Дата 24.5.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Это все клево.
Но задача состоит в том, чтобы код моего класса для работы с БД был переносим в другое приложение с другой БД без подрехтовки и перекомпиляции.
В общем всем спасибо. Что-то я понял. 
Буду следовать вашим советам.
Как получится, выставлю код на обозрение (если интересно) 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
ALKS
Дата 24.5.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 11



MisterCleric,

ResourceBundle.getBundle("cool_property_file") - это статический вызов! тебе не нужно создавать никакого объекта.
более того этот класс обеспечивает внутринний кэш, так что в большинстве случаев ты будеш тягать уже закэшированные в память данные.

и совершенно безразлично где ты будеш вызывать. удобно тебе в JSP - юзай в JSP. 
PM   Вверх
chief39
Дата 24.5.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

Репутация: 11
Всего: 77



Цитата(MisterCleric @  24.5.2006,  12:45 Найти цитируемый пост)
Но задача состоит в том, чтобы код моего класса для работы с БД был переносим в другое приложение с другой БД без подрехтовки и перекомпиляции.

Делай конструктор, который использует стандартный СКЛ
в пропертисы заноси имена таблиц и полей, которые на другой системе подрихтуешь smile

Но если все запросы в корне будут различаться при переносе.... - тогда, конечно, лажа smile 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
MisterCleric
Дата 5.6.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Всем здрасте!
Значит так. У меня что-то вышло, как и обещал выкладываю.
Бин для работы с БД:
Код

package dbutil;

import javax.naming.*;
import javax.sql.*;
import java.sql.*;
import java.util.*;
import javax.sql.rowset.*;
import com.sun.rowset.*;


public class WorkWithDBBean {
    private Connection conn;
    private CachedRowSet crs;
    private PreparedStatement stmt;
    private String sourceJNDI;
    private DataSource ds;
    private int update;
    private Object[] args = null;
    private String sqlStatement;
    private ResourceBundle bundle;
    
  public WorkWithDBBean() {
       bundle = ResourceBundle.getBundle("dbutil.SelectResource");

    try {
          sourceJNDI = bundle.getString("JNDI");
        }
        catch(Exception e){e.printStackTrace();}
       
    try{
      Context initCtx = new InitialContext();
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      if(envCtx == null ) throw new Exception("Boom - No Context");

      ds = (DataSource)envCtx.lookup(sourceJNDI);
              
    }catch(Exception e) {e.printStackTrace();}
  }

  public void setSqlStatement(String sqlStatement){ this.sqlStatement = bundle.getString(sqlStatement); }

  public void setArgs(Object[] args){ this.args = args; }
  
  private ResultSet setSelect(String query, Object[] args){
       try {
            conn = ds.getConnection();
            stmt = conn.prepareStatement(query);
            if(args != null && args.length != 0){
               for(int i = 0; i < args.length; i++)
                   stmt.setObject(i+1, args[i]);
            }
            ResultSet result = stmt.executeQuery();
            crs = new CachedRowSetImpl();
            crs.populate(result);
            result.close();
            stmt.close();      
            conn.close();
           }catch(SQLException e) {System.out.println(e.getMessage());}
       return crs;
    }

  public ResultSet getResult(){ return setSelect(sqlStatement, args); }

  private int setUpdate(String sqlStmp, Object[] args){
       try {
            conn = ds.getConnection();
            stmt = conn.prepareStatement(sqlStmp);
            if(args != null)
               for(int i = 0; i < args.length; i++)
                  stmt.setObject(i+1, args[i]);        
            update = stmt.executeUpdate();
            stmt.close();      
            conn.close();
          }catch(SQLException e){}
      return update;
    }

  public int getUpdate(){ return setUpdate(sqlStatement, args); }
}    

Поскольку DataSource берется из JNDI, то бин независит от сервера БД
Поскольку все SQL-выражения берутся из ResourceBundle, а его параметры передаються в конкретной задаче, то он не зависит от приложения.
Файл  .properties выглядит примерно так:
Цитата

JNDI=jdbc/fact
selectAll=SELECT tabnom, lastname, name, phone, namejob, status, staff.job_id FROM jobs, staff WHERE jobs.job_id = staff.job_id
selectStatus=SELECT tabnom, lastname, name, phone, namejob, status, staff.job_id FROM jobs, staff WHERE jobs.job_id = staff.job_id and jobs.status = ?
selectJob=SELECT job_id, namejob FROM jobs
selectCurrent=SELECT name, lastname, phone, namejob, jobs.job_id FROM jobs, staff where jobs.job_id = staff.job_id and staff.tabnom = ?
insert=INSERT INTO staff (Name, LastName, Phone, job_id) VALUES (?, ?, ?, ?)
update=UPDATE staff SET Name = ?, LastName = ?, Phone = ?, Job_id = ?, Tabnom = ? where Tabnom = ?
delete=DELETE FROM staff where Tabnom = ?

И примерно такова работа с ним:
Код

<c:if test="${empty param['status']}">
    <jsp:setProperty name="myBeanDB" property="sqlStatement" value="selectAll" />
</c:if>

<c:if test="${not empty param['status']}">
<jsp:setProperty name="myBeanDB" property="sqlStatement" value="selectStatus" />
<jsp:scriptlet> 
    Object[] params = new Object[]{ request.getParameter("status") };
    myBeanDB.setArgs(params);
</jsp:scriptlet>
</c:if>     

<jsp:scriptlet> 
    java.sql.ResultSet resultSet = myBeanDB.getResult();
    javax.servlet.jsp.jstl.sql.Result result = javax.servlet.jsp.jstl.sql.ResultSupport.toResult(resultSet);
    pageContext.setAttribute("rs", result);
</jsp:scriptlet> 

<display:table name="pageScope.rs.rows" id="row" pagesize="10" defaultsort="1" defaultorder="ascending" sort="list" class="table1" >
   <display:column property="tabnom" title="Clock Num" />
   <display:column property="lastname" title="Last name"  sortable="true" headerClass="sortable" />
   <display:column property="name" title="Name" />
   <display:column property="phone" title="Phone" />
   <display:column sortProperty="job_id" title="Job" sortable="true" headerClass="sortable" value="${row.namejob}"/>

   <c:set var="Actions" value="${row.tabnom}" /> 
   <display:column title="Action" >
   
    <display:table name="${Actions}" class="simple1" >
         <display:column href="edit.jsp?tabnom=${Actions}" scope="session" value="Edit" />
         <display:column href="delete.jsp?tabnom=${Actions}" scope="session" value="Delete" />
   </display:table>
   </display:column>
</display:table>

Не претендую на гениальность. Уверен, что можно еще больше разделить бизнес-логику и представление. 
И по ходу вопрос можно ли сделать implements Filter по обращению к БД? 


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

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

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


 




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


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

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