DAO (Data Access Object)Agenda :Introduction :
The following is example of JDBC Template :JDBCTemplate.java
package com.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
public class JDBCTemplate {
private DataSource dataSource;
public void setDataSource(DataSource dataSource){
this.dataSource=dataSource;
}
public DataSource getDataSource(){
return dataSource;
}
public int update(String query) throws SQLException{
Connection con=dataSource.getConnection();
Statement stmt=con.createStatement();
int result=stmt.executeUpdate(query);
stmt.close();
con.close();
return result;
}//update
}
JDBCTemplate is dependent on DataSource object.
Procedure to use DAO module in Spring :
package com.dao;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class MyApp {
public static void main(String[] args) {
DriverManagerDataSource ds=new DriverManagerDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
ds.setUsername("scott");
ds.setPassword("tiger");
JdbcTemplate jt=new JdbcTemplate();
jt.setDataSource(ds);
jt.update("insert into product values(1,'pone',2015)");
}
}
Procedure to use JdbcTemplate in a project :
applicationContext.xml <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="ds"/> </property> </bean>The following java code to insert a record into DataBase server.
package com.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/core/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
int no=jt.update("insert into product values(23,'pone',3450)");
System.out.println(no);
}
}
Procedure to use DBCP connection pool :
applicationContext.xml <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="ds"/> </property> </bean>
package com.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
int no=jt.update("insert into product values(2,'pone', 3450)");
System.out.println("success");
}
}
Using Weblogic connection pool in spring :
Requirement : Write a program JDBC application in DAO module to insert, update, delete the record.The following example to demonstrate how to use preparedStatement in spring DAO module.<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="ds"/> </bean>
package com.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
String query="insert into product values(?,?,?)";
Object obj[]={4,"four",4000};
int no=jt.update(query,obj); //OR
int no1=jt.update(query,"5","five","5000");
System.out.println("success");
}
}
Callback Mechanism :String internally uses callback mechanism our java application call the methods of spring. syntax : Object extractData(ResultSet rs); We need to develop a class which provides the implementation of ResultSetExtractor Develop a class which provides the implementation of ResultSetExtractor.GetData.java
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
public class GetData implements ResultSetExtractor {
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException {
while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}//while
return null;
}//extractData
}
We use a method query() to retrive the records and display it.
package com.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
String query="select * from product";
int no=jt.query(query, new GetData());
System.out.println("success");
}
}
ExampleProduct.java
package com.dao;
public class Product {
String pid;
String pname;
String price;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
GetData.java
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
public class GetData implements ResultSetExtractor {
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException {
ArrayList list=new ArrayList();
while(rs.next()) {
Product p=new Product();
p.setPid(rs.getString(1));
p.setPname(rs.getString(2));
p.setPrice(rs.getString(3));
list.add(p);
}//while
return list;
}//extractData
}
MyApp.java
package com.dao;
import java.util.ArrayList;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.*;
import org.springframework.jdbc.core.JdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
String query="select * from product";
ArrayList list=(ArrayList)jt.query(query, new GetData());
java.util.Iterator i=list.iterator();
while(i.hasNext()){
Product p= (Product) i.next();
System.out.println(p.getPid());
System.out.println(p.getPname());
System.out.println(p.getPrice());
System.out.println("------");
}//while
System.out.println("success");
}//main
}
Spring guys are provided the following Template classes as part of DAO module.
NamedParameterJdbcTemplate :
Procedure to work with NamedParameterJdbcTemplate :configure DataSource and NamedParameterJdbcTemplate by using constructor injection.<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="npjt" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg type="javax.sql.DataSource" index="0"> <ref bean="dataSource"/> </constructor-arg> </bean>MyApp.java
package com.dao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
NamedParameterJdbcTemplate npjt=
container.getBean("npjt",NamedParameterJdbcTemplate.class);
String query="insert into product values(:pid,:pname,:price)";
MapSqlParameterSource map=new MapSqlParameterSource();
map.addValue("pid", "10");
map.addValue("pname", "scoda");
map.addValue("price", "500000");
npjt.update(query, map);
System.out.println("success");
}//main
}
SimpleJdbcTemplate :SimpleJdbcTemplate class clubbed functionality of JdbcTemplate and NamedParameterJdbcTemplate.
DAO class is dependent on JdbcTemplate the following code : Product.java
package com.dao;
public class Product {
String pid;
String pname;
String price;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
ProductDAO.java
package com.dao;
import java.util.ArrayList;
import org.springframework.jdbc.core.JdbcTemplate;
public class ProductDAO {
JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int storeProductDetails(Object... values){
String query="insert into product values(?,?,?)";
return jdbcTemplate.update(query,values);
}
public int updateProductDetails(Object... values){
String query="update product set pid=? where pname=?";
return jdbcTemplate.update(query,values);
}
public int deleteProductDetails(Object... pid){
String query="delete from product where pid=?";
return jdbcTemplate.update(query,pid);
}
public ArrayList getAllProductRecords(){
String query="select * from product";
return (ArrayList)jdbcTemplate.query(query,new ProductRowMapper());
}
}
ProductRowMapper.java
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class ProductRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Product p=new Product();
p.setPid(rs.getString(1));
p.setPname(rs.getString(2));
p.setPrice(rs.getString(3));
return p;
}
}
Configure DataSource, JdbcTemplate, DAO in spring bean configuration file.
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="ds"/> </bean> <bean id="productDao" class="com.dao.ProductDAO"> <property name="jdbcTemplate"> <ref bean="jt"/> </property> </bean>MyApp.java
package com.dao;
import java.util.ArrayList;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
ProductDAO productDAO=container.getBean("productDao",ProductDAO.class);
productDAO.storeProductDetails(6,"six",60000);
productDAO.updateProductDetails(66,"six");
productDAO.deleteProductDetails(66);
ArrayList list=productDAO.getAllProductRecords();
java.util.Iterator i=list.iterator();
while(i.hasNext()){
Product p= (Product) i.next();
System.out.println(p.getPid());
System.out.println(p.getPname());
System.out.println(p.getPrice());
System.out.println("------");
}//while
System.out.println("success");
}//main
}
When we use RowMapper (or) ResultSetExtractor as seperate classes the no. of programs in project are becoming more because of this we get maintanance related problems. We have developed a class COne with a method which take an interface implementation class object.
The following example uses anonymous inner class in spring instead of developing our own RowMapper() object
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class MyApp {
public static void main(String[] args) {
ApplicationContext container=new ClassPathXmlApplicationContext(
"com/dao/applicationContext.xml");
JdbcTemplate jt=container.getBean("jt",JdbcTemplate.class);
String query="select * from Product";
ArrayList list=(ArrayList)jt.query(query, new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum)throws SQLException{
Product p=new Product();
p.setPid(rs.getString(1));
p.setPname(rs.getString(2));
p.setPrice(rs.getString(3));
return p;
}//mapRow
}//RowMapper
);
java.util.Iterator i=list.iterator();
while(i.hasNext()){
Product p= (Product) i.next();
System.out.println(p.getPid());
System.out.println(p.getPname());
System.out.println(p.getPrice());
System.out.println("------");
}//while
System.out.println("success");
}//main
}
The following example demonstrate use batchUpdate in Spring :
public void batchUpdates(final ArrayList products){
String query="insert into product values(?,?,?)";
jdbcTemplate.batchUpdate(query,new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps,int i)throws SQLException{
Product p=(Product) products.get(i);
ps.setString(1, p.getPid());
ps.setString(2, p.getPname());
ps.setString(3, p.getPrice());
}
public int getBatchSize() {
return products.size();
}
}); //batchUpdate
}//batchUpdates
|