今天看了一下模板设计模式,搜索了一下例子
看到Hibernate对jdbc的封装就是用了这个模式,以前自己写DaoImpl的时候总感觉那个Connection Statement ResultSet重复的太多,还有就是从数据库中取出数据设置到对象中重复性非常多。
模板模式是将重复的东西全部放到抽象的父类中去,让父类去实现一些共同的部分,让子类实现不同的部分,
这个模式很好的运用了抽象,继承的概念
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public abstract class BaseDao
{
public Object getObject(String sql,Object[] args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;
try{
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
if(rs.next()){
obj = rowMapperMethod(rs);
}
}catch(SQLException e){
e.printStackTrace();
}
}
public abstract Object rowMapperMethod(ResultSet rs);
}
package com.founder.template;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public abstract class BaseDao
{
public Object getObject(String sql,Object[] args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;
try{
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
if(rs.next()){
obj = rowMapperMethod(rs);
}
}catch(SQLException e){
e.printStackTrace();
}
}
public abstract Object rowMapperMethod(ResultSet rs);
}
package com.founder.template;
import java.util.List;
public interface UserDao
{
User findById(int id);
List<User> findAll();
User findByName(String name);
void deleteById(int id);
void update(User user);
}
package com.founder.template;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class UserDaoImpl extends BaseDao implements UserDao
{
public User findById(int id)
{
String sql = "select * from user where id=?";
Object[] params = new Object[]{id};
User user = (User)this.getObject(sql, params);
return user;
}
public List<User> findAll()
{
// TODO Auto-generated method stub
return null;
}
public User findByName(String name)
{
// TODO Auto-generated method stub
return null;
}
public void deleteById(int id)
{
// TODO Auto-generated method stub
}
public void update(User user)
{
// TODO Auto-generated method stub
}
@Override
public Object rowMapperMethod(ResultSet rs)
{
try
{
while(rs.next()){
User user = new User();
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
user.setAge(rs.getInt("age"));
user.setId(rs.getInt("id"));
}
}
catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
}
只需要实现自己的rowMapperMethod(rs)方法就可以了