Sunday, April 29, 2012

Spring JDBC Implementing RowMapper

In this tutorial, we implement a custom RowMapper class to map our domain objects. We then use this class to write fetch methods that return custom model objects.



 <Student> List<Student> org.springframework.jdbc.core.JdbcTemplate.query(String sql, RowMapper<Student> rowMapper) throws DataAccessException
query
public <T> List<T> query(String sql,
                         RowMapper<T> rowMapper)
              throws DataAccessException
Description copied from interface: JdbcOperations 
Execute a query given static SQL, mapping each row to a Java object via a RowMapper. 
Uses a JDBC Statement, not a PreparedStatement. If you want to execute a static query with a PreparedStatement, use the overloaded query method with null as argument array. 




Specified by:
query in interface JdbcOperations
Parameters:
sql - SQL query to execute
rowMapper - object that will map one object per row 
Returns:
the result List, containing mapped objects 
Throws: 
DataAccessException - if there is any problem executing the query
See Also:
JdbcOperations.query(String, Object[], RowMapper)
--------------------------------------------------------------------------------
An interface used by JdbcTemplate for mapping rows of a ResultSet on a per-row basis. Implementations of this interface perform the actual work of mapping each row to a result object, but don't need to worry about exception handling. SQLExceptions will be caught and handled by the calling JdbcTemplate. 

Typically used either for JdbcTemplate's query methods or for out parameters of stored procedures. RowMapper objects are typically stateless and thus reusable; they are an ideal choice for implementing row-mapping logic in a single place. 

Alternatively, consider subclassing MappingSqlQuery from the jdbc.object package: Instead of working with separate JdbcTemplate and RowMapper objects, you can build executable query objects (containing row-mapping logic) in that style. 
****************************************************************************
package com.venkat;

import java.util.Iterator;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.venkat.JdbcDao.JdbcDaoImpl;
import com.venkat.model.Student;

public class JDBCDemo {

/**
* @param args
* @throws Exception 
*/
public static void main(String[] args)   {
// TODO Auto-generated method stub
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
 JdbcDaoImpl dao=context.getBean("jdbcDaoImpl",JdbcDaoImpl.class);
 System.out.println(dao.getStudentCount());
 System.out.println(dao.getStudentName(121));
 System.out.println(dao.getStudentForId(121).getStudentrank());
List<Student> list=dao.getAllStudents();
System.out.println("Student Details...............");
for (Iterator iterator = list.iterator(); iterator.hasNext();) 
{
Student student = (Student) iterator.next();
System.out.print(student.getStudentid()+"\t");
System.out.print(student.getStudentname()+"\t");
System.out.println(student.getStudentrank());
}
}

}
******************************************************************
package com.venkat.JdbcDao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

import com.venkat.model.Student;

@Component
public class JdbcDaoImpl {
private DataSource datasource;
private JdbcTemplate jdbcTemplate;

public DataSource getDatasource() {
return datasource;
}


public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}


public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

@Autowired
public void setDatasource(DataSource datasource) {
this.jdbcTemplate = new JdbcTemplate(datasource);
}

public int getStudentCount()
{
String sql="select count(*) from STUDENT";
return jdbcTemplate.queryForInt(sql);
}

public String getStudentName(int studentid)
{
String sql="select studentname from STUDENT where studentid=?";
return jdbcTemplate.queryForObject(sql, new Object[]{studentid}, String.class);
}
public Student getStudentForId(int studentid)
{
String sql="select * from STUDENT where studentid=?";
return jdbcTemplate.queryForObject(sql, new Object[]{studentid}, new StudentMapper());
}
public List<Student> getAllStudents()
{
String sql="select * from STUDENT ";
return  jdbcTemplate.query(sql,   new StudentMapper());
}
private static final class StudentMapper implements RowMapper<Student>
{

@Override
public Student mapRow(ResultSet resultset, int rowNum) throws SQLException {
Student s=new Student();
s.setStudentid(resultset.getInt("studentid"));
s.setStudentname(resultset.getString("studentname"));
s.setStudentrank(resultset.getInt("studentrank"));
return s;
}
}
}
********************************************************************
package com.venkat.model;

public class Student {
private int studentid;
private String studentname;
private int studentrank;
public int getStudentid() {
return studentid;
}
public void setStudentid(int studentid) {
this.studentid = studentid;
}
public String getStudentname() {
return studentname;
}
public void setStudentname(String studentname) {
this.studentname = studentname;
}
public int getStudentrank() {
return studentrank;
}
public void setStudentrank(int studentrank) {
this.studentrank = studentrank;
}
public Student(int studentid, String studentname, int studentrank) {
super();
this.studentid = studentid;
this.studentname = studentname;
this.studentrank = studentrank;
}
public Student() {
// TODO Auto-generated constructor stub
}

}
*******************************************************************
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config/>

<context:component-scan base-package="com.venkat"></context:component-scan>



<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:xe">
</property>
<property name="username" value="venkat"></property>
<property name="password" value="venkat"></property>
</bean></beans>

No comments:

Post a Comment