[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

15) Como carregar minhas listas de um banco de dados ao invés de arquivos?  XML
Forum Index -> F.A.Q.
Author Message
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Você pode utilizar o DBListData. Veja como é fácil:

Se as suas listas estão internacionalizadas no seu banco de dados, você provavelmente tem uma tabela mais ou menos assim:

Nome da Tabela: Genders

Campos:

ID, VALUE, LOCALE
m, Masculino, pt_BR
f, Feminino, pt_BR
m, Man, en_US
f, Woman, en_US

Então tudo que vc deve fazer é:

Code:
 
 DBListData list = new DBListData("genders", "ID", "VALUE", "LOCALE", "Genders", "VALUE");
 
 // genders = nome da lista
 // ID = nome da coluna do BD com o id (chave) do item da lista
 // VALUE = nome da coluna do BD com o valor do item da lista
 // LOCALE = nome da coluna do BD com o locale do item da lista
 // Genders = nome da tabela do BD onde a lista está armazenada
 // VALUE = coluna que será usada para ordenação (order by)
 
 // aqui vc pega a conexao do pool do mentawai ou da maneira que vc estiver fazendo...
 
 Connection conn = ...
 
 list.load(conn); // carrega todas as listas...
 
 ListManager.addList(list);
 
 


A query produzida será:

select ID,VALUE,LOCALE from Genders order by VALUE;

Vamos supor que vc não esteja trabalhando com internacionalização, então a sua tabela provavelmente estará assim:

Nome da Tabela: Genders

Campos:

ID, VALUE
m, Masculino
f, Feminino

Então tudo que vc precisa fazer é:

Code:
 
 DBListData list = new DBListData("genders", "ID", "VALUE", "Genders", "VALUE");
 
 // genders = Nome da lista do mentawai
 // ID = nome da coluna do BD com o id (chave) do item da lista
 // VALUE = nome da coluna do BD com o valor do item da lista
 // Genders = nome da tabela do BD onde a lista está armazenada
 // VALUE = coluna que será usada para ordenação (order by)
 
 // aqui vc pega a conexao do pool do mentawai ou da maneira que vc estiver fazendo...
 
 Connection conn = ...
 
 list.load(conn); // carrega todas as listas...
 
 ListManager.addList(list);
 
 


Agora vamos supor que no seu banco de dados, a coluna locale esteja indexada por ids e não pelo nome do locale:

Nome da Tabela: Genders

Campos:

ID, VALUE, LOCALE
m, Masculino, 1
f, Feminino, 1
m, Man, 2
f, Woman, 2

Tudo que vc tem que fazer nesse caso é herdar DBListData e sobrescrever o método getLocaleFromString(loc), ou seja, basicamente, vc precisa fazer um mapping de 1 para "pt_BR" e de 2 para "en_US".

A implementação default do método é:

Code:
 	protected Locale getLocaleFromString(String loc) {
 		
 		return new Locale(loc);
 	}
 


Sergio Oliveira

saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Mais uma explicação do Leiber:

Vou te mostrar como eu uso ok.

ApplicationManager
Code:
 public class ApplicationManager extends import org.mentawai.core.ApplicationManager {
 
       ListData listData; //Para listas em arquivos
       DBListData dbListData; //Para Listas no banco de dados
 
      public void init(Context application) {/*BLA BLA BLA*/}
 
      public void loadActions() {/*BLA BLA BLA*/}
 
      //Listas defaults pra todos tanto do arquivos lists quando do BD
      public void loadLists() throws IOException {
 
             //LISTA SIMPLES EM ARQUIVO (SEXO)
            listData = new BaseListData("gender", BaseListData.ORDER_BY_ID);
            ListManager.addList(listData);
 
          // LISTA DO BANCO DE DADOS DEFAULT PRA TODOS
          // 1 = name of list
          // 2 = name of column - id (key)
          // 3 = name of column - value of key
          // 4 = name of table on the DB
          // 5 = ORDER BY ? column
          // COUNTRYS (PAISES)
          dbListData = new DBListData("country", "paicod", "painom", "pais", "painom");
          try{
              dbListData.load(sessionFactory.openSession().connection());
          } catch(SQLException e){}
          ListManager.addList(dbListData);
      }
 }
 


Eu tenho um Serviço só pra cuidar dos combos "dinâmicos" e neste eu recebo os campos que eu passo da action ID, TABELA ETC, inclusive o WHERE nem preciso dizer seu uso correto, se eu nao quizer dar um WHERE passo NULL ou... posso por exemplo deixar como default um WHERE 1=1.

MinhaAction
Code:
 public class MinhaAction {
 
     public String meuMetodo() throws Exception {
           DBListData dbListData = dbListDataService.newListData("QualSeráONomeDaLista", "QualOValueDoOption", "OQueIráNoTextoDoOption", "EmQueTabelaBuscar", "OrderBy?", "WhereOqueIgualOQue?" );
           ListManager.addList(dbListData); //Adicionei a lista.
     }
 }
 


Omiti algumas coisas como GROUP de usuario que eu PASSO TB, pego na action e passo a lista de GRUPOS daquele usuario e dentro do service eu MONTO o WHERE de acordo com o GRUPO. Se vc quizer fazer o mesmo pros grupos, basta receber a lista de grupos daquele usuário (List groups = BaseLoginAction.getUserGroups(session) e passar como "variavel" também pro service e no service vc fazer suas "validações". Entendeu ?

Minha Interface DBListService
Code:
 public interface DBListService {
          DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws Exception;
 }
 


Minha Classe que implementa a interface DBListService
Code:
	
 public class DBListServiceImpl implements DBListService {
          public DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws Exception  {
                  if (meuDAO == null) throw new IllegalStateException(MSG);
                         return meuDAO.newListData(listName, columnId, columnName, table, orderBy, sqlWhere);
                 }
 }
 


Eu to usando Hibernate Annotations / Generics OK. Então tenho:

A Interface BaseDAO
Code:
 public interface BaseDAO<T, PK extends Serializable> {
 
     //OUTROS METODOS OMITIDOS
 
     DBListData newListData(String listName, String columnId, String
     		columnName, String table, String orderBy, String sqlWhere) throws HibernateException, SQLException;
 
 }
 


A Classe BaseDAOImpl que implementa BaseDAO
Code:
 public abstract class BaseDAOImpl<T, PK extends Serializable> implements BaseDAO<T,PK> {
 
         //OUTROS METODOS OMITIDOS
 
         public DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws HibernateException, SQLException {
                DBListData dbListData = new DBListData(listName, columnId, columnName, table, orderBy);
 	if (sqlWhere!=null) dbListData.setWhere(sqlWhere);
 	dbListData.load(conn.connection());
 	return dbListData;
          }
 }
 



Acho que é isso ai...

Sergio Oliveira

 
Forum Index -> F.A.Q.
Go to:   
Powered by JForum 2.1.6 © JForum Team