Thursday, 5 December 2013

Template design pattern

In the template method of this design pattern, one or more algorithm steps can be overridden by subclasses to allow differing behaviors while ensuring that the overarching algorithm is still followed.

the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithmin a method, called template method, which defers some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm's structure.


package templateP;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;

/*
 * In the template method of this design pattern,
 *  one or more algorithm steps can be overridden by subclasses
 *  to allow differing behaviors while ensuring that the
 *  overall algorithm is still followed.

 */
public abstract class QueryDatabase {

      Connection connection;

      void executeQuery(String query) {
            loadDriver();
            connection = getConnection();
            fireQuery(query);
            closeConnection();
      }

      abstract void loadDriver();

      abstract Connection getConnection();

      abstract void fireQuery(String query);

      abstract void closeConnection();
}




class QuerySQL extends QueryDatabase{

      @Override
      void loadDriver() {
            // TODO Auto-generated method stub
           
      }

      @Override
      Connection getConnection() {
            // TODO Auto-generated method stub
            return null;
      }

      @Override
      void fireQuery(String query) {
            // TODO Auto-generated method stub
           
      }

      @Override
      void closeConnection() {
            // TODO Auto-generated method stub
           
      }
     
      }


For testing purpose I have actually written the code to fire in HSQLDB as follows:


class QueryHSQLDB extends QueryDatabase {
      @Override
      void closeConnection() {

            try {
                  connection.close();
            } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }

      }

      @Override
      void fireQuery(String s) {

            PreparedStatement pre;
            try {
                  pre = connection.prepareStatement(s);
                  ResultSet rs = pre.executeQuery();

                  if (rs != null) {
                        while (rs.next()) {
                              ResultSetMetaData rsmd = rs.getMetaData();
                              for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                                    if (i > 1) {
                                          System.out.print(",");
                                    }

                                    int type = rsmd.getColumnType(i);
                                    if (type == Types.VARCHAR || type == Types.CHAR) {
                                          System.out.print(rs.getString(i));
                                    } else {
                                          System.out.print(rs.getLong(i));
                                    }
                              }

                              System.out.println();
                        }
                  }
                 
                  rs.close();

            } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
           
      }

      @Override
      Connection getConnection() {
            Connection con = null;
            try {
                  con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/",
                              "sa", "");
            } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            return con;

      }

      @Override
      void loadDriver() {

            try {
                  Class.forName("org.hsqldb.jdbcDriver");
            } catch (ClassNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }

      }

}

class QueryDB2 extends QueryDatabase {
      @Override
      void closeConnection() {

            try {
                  connection.close();
            } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }

      }

      @Override
      void fireQuery(String s) {
            // TODO Auto-generated method stub
      }

      @Override
      Connection getConnection() {
            Connection con = null;
            try {
                  con = DriverManager.getConnection(
                              "jdbc:db2:@krishnaPc:1008:MAHADEV", "usrname", "xxxx");
            } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            return con;

      }

      @Override
      void loadDriver() {

            try {
                  Class.forName("com.ibm.db2.jcc.DB2Driver");
            } catch (ClassNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }

      }
}


Now time to test our code:
package templateP;

public class QueryDatabaseTest {
      public static void main(String[] args) {
            QueryHSQLDB queryHSLDB = new QueryHSQLDB();
            queryHSLDB.executeQuery("SELECT * FROM CUSTOMER");
           
            QueryDB2  db2 = new QueryDB2();
            db2.executeQuery("SELECT * FROM CUSTOMER");
           
      }
}


Result:
1,adi,India,Aditya Sharma
2,priya,India,Priyanka Sharma

java.lang.ClassNotFoundException: com.ibm.db2.jcc.DB2Driver

No comments:

Post a Comment