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