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;
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;
10 import java.util.Properties;
11 import java.util.logging.Level;
12 import java.util.logging.Logger;
18 public class SuperDAO {
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>());
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
35 protected String getSQL(Enum klic) {
39 return getHodnota(sql, "sql.xml", klic);
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
48 protected String getVlastnost(Enum klic) {
49 return getHodnota(vlastnosti, "xml", klic);
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
57 private String getHodnota(Map<Class, Properties> mezipamet, String pripona, Enum klic) {
59 if (mezipamet.get(getClass()) == null) {
60 /** Ještě nemáme načteno ze souboru */
61 mezipamet.put(getClass(), getHodnoty(pripona));
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());
69 return mezipamet.get(getClass()).getProperty(klic.toString());
72 public static void main(String[] args) {
73 System.out.println(new SuperDAO().getSQL(SQL.AHOJ));
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
83 private Properties getHodnoty(String pripona) {
84 Class trida = getClass();
85 String soubor = trida.getSimpleName() + "." + pripona;
87 Properties hodnoty = null;
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);
101 * @param spojeni DB spojení
102 * @param prikaz DB dotaz
103 * @param vysledek DB výsledek
105 protected void zavri(Connection spojeni, Statement prikaz, ResultSet vysledek) {
106 if (vysledek != null) {
109 } catch (Exception e) {
112 if (prikaz != null) {
115 } catch (Exception e) {
118 if (spojeni != null) {
121 } catch (Exception e) {