java/SuperDAO/src/cz/frantovo/superDAO/SuperDAO.java
author František Kučera <franta-hg@frantovo.cz>
Mon, 06 Oct 2008 09:36:27 +0200
changeset 0 4858f952774d
child 2 3df37f25b286
permissions -rw-r--r--
SuperDAO - předek DAO tříd, umí snadno načítat SQL dotazy a další parametry z XML souborů, které se jmenují stejně jako daná třída.
Je to lepší než používat konstanty v kódu.
     1 package cz.frantovo.superDAO;
     2 
     3 import java.io.InputStream;
     4 import java.sql.Connection;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 import java.util.Collections;
     8 import java.util.HashMap;
     9 import java.util.Map;
    10 import java.util.Properties;
    11 import java.util.logging.Level;
    12 import java.util.logging.Logger;
    13 
    14 /**
    15  * Předek všech DTOček
    16  * @author fiki
    17  */
    18 public class SuperDAO {
    19 
    20     protected Logger log = Logger.getLogger(getClass().getName());
    21     private static Map<Class, Properties> sql = Collections.synchronizedMap(new HashMap<Class, Properties>());
    22     private static Map<Class, Properties> vlastnosti = Collections.synchronizedMap(new HashMap<Class, Properties>());
    23 
    24     private enum SQL {
    25 
    26         AHOJ
    27     }
    28 
    29     /**
    30      * Načítá SQL dotazy ze souboru, který se jmenuje stejně jako třída a má příponu sql.xml
    31      * Do těchto souborů patří pouze SQL dotazy - všechny ostatní parametry dáme do .xml souboru.
    32      * @param klic Enum konstnanta z dané třídy
    33      * @return SQL dotaz nebo null v případě chyby
    34      */
    35     protected String getSQL(Enum klic) {
    36 
    37 
    38 
    39         return getHodnota(sql, "sql.xml", klic);
    40     }
    41 
    42     /**
    43      * Načítá textové hodnoty (vlastnosti) ze souboru, který se jmenuje stejně jako třída a má příponu xml
    44      * Sem patří všechny parametry tříd kromě SQL dotazů.
    45      * @param klic Enum konstnanta z dané třídy
    46      * @return textová hodnota nebo null v případě chyby
    47      */
    48     protected String getVlastnost(Enum klic) {
    49         return getHodnota(vlastnosti, "xml", klic);
    50     }
    51 
    52     /**
    53      * Nečte hodnoty přímo ze souboru, ale snaží se je nejprve najít ve statické mezipaměti.
    54      * @param klic Enum konstnanta z dané třídy
    55      * @return textová hodnota nebo null v případě chyby
    56      */
    57     private String getHodnota(Map<Class, Properties> mezipamet, String pripona, Enum klic) {
    58 
    59         if (mezipamet.get(getClass()) == null) {
    60             /** Ještě nemáme načteno ze souboru */
    61             mezipamet.put(getClass(), getHodnoty(pripona));
    62 
    63             if (mezipamet.get(getClass()) == null) {
    64                 /** Došlo k chybě --> už to příště nebudeme zkoušet načítat */
    65                 mezipamet.put(getClass(), new Properties());
    66             }
    67         }
    68 
    69         return mezipamet.get(getClass()).getProperty(klic.toString());
    70     }
    71 
    72     public static void main(String[] args) {
    73         System.out.println(new SuperDAO().getSQL(SQL.AHOJ));
    74 
    75     }
    76 
    77     /**
    78      * Načte vlastnosti dané třídy z XML souboru.
    79      * Soubory se dávají do stejného balíčku jako třída, akorát mají jinou příponu.
    80      * @param pripona přípona souboru - obvykle "sql.xml" nebo "xml" (bez tečky)
    81      * @return načtené vlastnosti nebo null v případě chyby
    82      */
    83     private Properties getHodnoty(String pripona) {
    84         Class trida = getClass();
    85         String soubor = trida.getSimpleName() + "." + pripona;
    86 
    87         Properties hodnoty = null;
    88         try {
    89             InputStream fis = trida.getResourceAsStream(soubor);
    90             hodnoty = new Properties();
    91             hodnoty.loadFromXML(fis);
    92         } catch (Exception e) {
    93             log.log(Level.SEVERE, "Chyba při načítání vlastností: " + soubor, e);
    94         }
    95 
    96         return hodnoty;
    97     }
    98 
    99     /**
   100      * Zavře všechno
   101      * @param spojeni DB spojení
   102      * @param prikaz DB dotaz
   103      * @param vysledek DB výsledek
   104      */
   105     protected void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
   106         if (vysledek != null) {
   107             try {
   108                 vysledek.close();
   109             } catch (Exception e) {
   110             }
   111         }
   112         if (prikaz != null) {
   113             try {
   114                 prikaz.close();
   115             } catch (Exception e) {
   116             }
   117         }
   118         if (spojeni != null) {
   119             try {
   120                 spojeni.close();
   121             } catch (Exception e) {
   122             }
   123         }
   124     }
   125 }