JDBC的CRUD操作中使用模板模式

来源:互联网 发布:阿瓦隆之王兵营数据 编辑:程序博客网 时间:2024/04/28 16:30

     在JDBC编程中无非是写CRUD之类的操作,但是这里面有好多代码是重复的,所以能够重用这些代码是很重要的。所以引进了模板模式,来

 

增强代码的可重用性。

 

首先来看看实体Bean的定义:

package viekie.du.jdbc.domain;
import java.util.Date;
public class User {
    private int id;
   
    private String username;
   
    private String password;
   
    private Date date;
   
    private float money;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public float getMoney() {
        return money;
    }
    public void setMoney(float money) {
        this.money = money;
    } 
    @Override
    public String toString() {     
        return "name:" + this.username + " password:" + this.password + ": money:" + this.money;
    }
}
DAO的建立

package viekie.du.jdbc.dao;
import viekie.du.jdbc.domain.User;
public interface UserDao {
    public void addUser(String sql, Object... objs);
    public User getUser(String sql, Object... objs);
    public void update(String sql, Object... objs);
    public void delete(String sql, Object... objs);
}
DAO的实现,这个类并没有实现DAO接口中的所有的方法,这里只是举例说明,

package viekie.du.jdbc.userDaoImpl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.sql.PreparedStatement;
import viekie.du.jdbc.DBUtil;
import viekie.du.jdbc.dao.UserDao;
import viekie.du.jdbc.domain.User;
import viekie.du.jdbc.exception.UserDaoException;
public abstract class AbstractUserDaoImpl implements UserDao {

    private void setPreparedStatementParameter(PreparedStatement pstmt,
            Object[] obj) throws SQLException {

        for (int i=0; i<obj.length; i++) {
            try {
                pstmt.setObject(i+1, obj[i]);
            } catch (SQLException e) {
                e.printStackTrace();
                throw new SQLException(e);
            }
        }
    }


    @Override
    /**
     *
     * 这个getUser方法是用了模板方法模式来生成每一个对象,
     * 所以当生成的对象,只需要调用getUserFormResultSet方法就可以了,
     * 然而这个方法的实现是在子类中进行实现。

     */
    public User getUser(String sql, Object... objs) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        DBUtil dbutil = null;
        ResultSet rs = null;
        try {
            dbutil = DBUtil.getInstance();
            conn = dbutil.getConnection();
           
            pstmt = conn.prepareStatement(sql);
            setPreparedStatementParameter(pstmt, objs);

            rs = pstmt.executeQuery();
   
            return getUserFormResultSet(rs);
        } catch (SQLException e) {

            e.printStackTrace();
            throw new UserDaoException(e.getMessage(), e);
        } finally {
            dbutil.releaseStatemetn(pstmt);
            dbutil.releaseConnection(conn);
        }
    }
    public abstract User getUserFormResultSet(ResultSet rs) throws SQLException;
}

在子类中实现了getUserFormResultSet方法,当我们在要生成其他的对象的时候,只需要改正这个子类就可以了,实现了解耦和。

package viekie.du.jdbc.userDaoImpl;

import java.sql.ResultSet;
import java.sql.SQLException;

import viekie.du.jdbc.domain.User;
public class UserDaoImpl extends AbstractUserDaoImpl{
    public User getUserFormResultSet(ResultSet rs) throws SQLException{       
        User usr = new User();
        if(rs.next()){           
            usr.setId(rs.getInt("id"));
            usr.setUsername(rs.getString("username"));
            usr.setPassword(rs.getString("password"));
            usr.setDate(rs.getDate("birthday"));
            usr.setMoney(rs.getFloat("money"));           
        }       
        return usr;
    }
    @Override
    public void addUser(String sql, Object... objs) {
        // TODO Auto-generated method stub       
    }
    @Override
    public void update(String sql, Object... objs) {
        // TODO Auto-generated method stub       
    }
    @Override
    public void delete(String sql, Object... objs) {
        // TODO Auto-generated method stub   
    }
}

原创粉丝点击