DAO (Data Access Object)Agenda :Introduction :
The following is example of JDBC Template :JDBCTemplate.javapackage 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.javapackage 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.javapackage 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.javapackage 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 |