Tuesday, December 05, 2006

Data Access with Spring and Struts: Part 2

Part 1 of "Data Access with Spring and struts" described how to make a struts application ready to use spring. In this post, we will see how to implement spring data access.
  1. Create a RowMapper: A row mapper is used to map a single row in the ResultSet to any object. The iteration through the result set is taken care of by the JdbcTemplate class.
    public class EmpMapper implements RowMapper {
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    int empNo = rs.getInt(1);
    String empName = rs.getString(2);
    String empJob = rs.getString(3);
    long salary = rs.getLong(4);
    Employee emp = new Employee();
    emp.setEmpId(empNo);
    emp.setEmpJob(empJob);
    emp.setEmpSal(salary);
    emp.setEmpName(empName);
    return emp;
    }
    }
    EmpMapper.java
  2. Create the Data Access Object: The Data access object uses spring's JdbcTemplate class to query the database. The JdbcTemplate class helps separate the static parts of JDBC DAO code by performing
    the common boilerplate tasks:
    • Retrieves connections from the datasource.
    • Prepares statement object.
    • Executes SQL CRUD operations.
    • Iterates over result sets and populates the results in standard collection objects.
    • Handles SQLException and translates it into a more explicit exception in the spring exception hierarchy.
    public class DAO extends JdbcDaoSupport {
    public long empId;
    public String empName;
    public String empJob;
    public long empSal;
    public String SQL = "SELECT EMPNO, ENAME, JOB, SAL " + "FROM EMP WHERE SAL >= ?";
    public List getData(long minSal) {
    Long params[] = { minSal };
    JdbcTemplate daoTmplt = getJdbcTemplate();
    return daoTmplt.query(SQL, params, new EmpMapper());
    }
    }
    DAO.java

    Note that the DAO class has to extend JdbcDaoSupport, which defines the getJdbcTemplate() method.
  3. Create the Business Interface: The business interface class acts as a simple facade to the DAO layer.
    public class BusinessInterface {
    DAO empDAO;
    public List getData(long minSal){
    List empList = empDAO.getData(minSal);
    return empList;
    }
    public void setDao(DAO empDAO){
    this.empDAO = empDAO;
    }
    }
    BusinessInterface.java
  4. Add the Action class, Business Interface and DAO to Spring
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@localhost:1521:orcl</value>
    </property>
    <property name="username">
    <value>scott</value>
    </property>
    <property name="password">
    <value>tiger</value>
    </property>
    </bean>

    <!-- Configure DAO -->
    <bean id="empDao" class="data.DAO">
    <property name="dataSource">
    <ref bean="dataSource"></ref>
    </property>
    </bean>
    <!-- Configure Business Service -->
    <bean id="businessInterface" class="business.BusinessInterface">
    <property name="dao">
    <ref bean="empDao"></ref>
    </property>
    </bean>
    <bean name="/search" class="actions.SearchAction">
    <property name="businessInterface">
    <ref bean="businessInterface" />
    </property>
    </bean>
    </beans>
    WEB-INF/applicationContext.xml

    Note that SearchAction is defined here, instead of in the struts-config.xml. The bean name "/search" is used to as a link between this file and struts-config.xml.

  5. Create the Sorter class: This is used in the JSP for sorting the result list.
    public class Sorter {
    public static List sort(List list, String sortBy) {
    Comparator comp = getComparator(sortBy);
    Collections.sort(list, comp);
    return list;
    }

    private static Comparator getComparator(String sortBy) {
    System.out.println("Sort by : " + sortBy);
    if (sortBy == null) {
    return new NameComparator();
    }
    if (sortBy.equals("empName"))
    return new NameComparator();
    if (sortBy.equals("empId"))
    return new IdComparator();
    if (sortBy.equals("empSal"))
    return new SalComparator();
    if (sortBy.equals("empJob"))
    return new JobComparator();

    return null;

    }

    private static class NameComparator implements Comparator {
    public int compare(Object emp1, Object emp2) {
    Employee employee1 = (Employee) emp1;
    Employee employee2 = (Employee) emp2;
    return employee1.getEmpName().compareTo(employee2.getEmpName());
    }
    }

    private static class IdComparator implements Comparator {
    public int compare(Object emp1, Object emp2) {
    Employee employee1 = (Employee) emp1;
    Employee employee2 = (Employee) emp2;
    return new Long(employee1.getEmpId()).compareTo(new Long(employee2.getEmpId()));
    }
    }

    private static class SalComparator implements Comparator {
    public int compare(Object emp1, Object emp2) {
    Employee employee1 = (Employee) emp1;
    Employee employee2 = (Employee) emp2;
    return new Long(employee1.getEmpSal()).compareTo(new Long(employee2.getEmpSal()));
    }
    }

    private static class JobComparator implements Comparator {
    public int compare(Object emp1, Object emp2) {
    Employee employee1 = (Employee) emp1;
    Employee employee2 = (Employee) emp2;
    return employee1.getEmpJob().compareTo(employee2.getEmpJob());
    }
    }
    }
    Sorter.java
  6. Create the Value object: The Employee.java bean used in the row mapper is shown below.
    public class Employee {
    public long empId;
    public String empName;
    public String empJob;
    public long empSal;
    public long getEmpId() {
    return empId;
    }
    public void setEmpId(long empId) {
    this.empId = empId;
    }
    public String getEmpJob() {
    return empJob;
    }
    public void setEmpJob(String empJob) {
    this.empJob = empJob;
    }
    public String getEmpName() {
    return empName;
    }
    public void setEmpName(String empName) {
    this.empName = empName;
    }
    public long getEmpSal() {
    return empSal;
    }
    public void setEmpSal(long empSal) {
    this.empSal = empSal;
    }
    }
    Employee.java
REQUIREMENTS
  1. JAR Files: In order for you to run this example, you must have the following jar files in your class path: displaytag-1.1.jar || commons-chain-1.1.jar || commons-collections.jar || commons-dbcp.jar || commons-digester-1.6.jar || commons-lang.jar || commons-logging.jar || commons-pool-1.3.jar || commons-validator-1.3.0.jar || commons-beanutils.jar || displaytag-export-poi-1.1.jar || jta.jar || ojdbc14.jar || oro-2.0.8.jar || spring.jar || struts-core-1.3.5.jar || struts-taglib-1.3.5.jar || struts-tiles-1.3.5.jar || xml-apis.jar
  2. Tomcat Server
  3. Java 5.0
  4. A log4j configuration file.

7 comments:

  1. Thank you so much for organizing and providing this quality information in an easy to understand way.

    ReplyDelete
  2. It’s great to know about many things from your website blog.

    ReplyDelete
  3. The post is very nice, by the way, I want to share with you information about the best.

    ReplyDelete
  4. I blog frequently and I seriously appreciate your information.

    ReplyDelete
  5. I really love the theme/design of your website.

    ReplyDelete

Popular Posts