模板模式(通常又叫模板方法模式 Template Method)

一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

与策略模式比较:模板方法注重的是固定流程。策略模式注重的是某个流程用户的选择。

以查询为例:

1、定义一个模板:

public class JdbcTemplate {

    private DataSource dataSource;

    public JdbcTemplate(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    private  Connection getConnection() throws Exception{
        return  this.dataSource.getConnection();
    }

    private PreparedStatement creatPreparedStatement(String sql,Connection connection)throws Exception{
        return  connection.prepareStatement(sql);
    }

    private List<?> parsetResultSet(ResultSet resultSet,RowMapper rowMapper) throws Exception{
        List<Object> result = new ArrayList<Object>();
        int rowNum = 0;
        while (resultSet.next()){
            result.add(rowMapper.mapRow(resultSet,rowNum++));
        }
        return result;
    }

    private ResultSet excutQuery(PreparedStatement preparedStatement,Object[] objects) throws  Exception{
        for (int i = 0; i < objects.length; i++) {
            preparedStatement.setObject(i,objects[i]);
        }
        return preparedStatement.executeQuery();
    }

    private void closeStatement(Statement statement)throws Exception{
        statement.close();
    }

    private void closeResult(ResultSet resultSet)throws Exception{
        resultSet.close();
    }
    private void closeConnection(Connection connection)throws Exception{
        //通常是放在连接池,不会关闭
    }

    public List<?> executQuery(String sql,RowMapper<?> rowMapper, Object[] values){
        try{
            //1、获取链接
            Connection connection = this.getConnection();
            //2、创建语句集
            PreparedStatement statement = this.creatPreparedStatement(sql,connection);
            //3、执行语句集,并获得结果集
            ResultSet resultSet = this.excutQuery(statement,values);
            //4、解析语句集
            List<?> result = this.parsetResultSet(resultSet,rowMapper);

            //5、关闭结果集
            this.closeResult(resultSet);
            //6、关闭语句集
            this.closeStatement(statement);
            //7、关闭链接
            this.closeConnection(connection);
            return  result;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

2、查询结果的集合:

public class Member {
    private String userName;
    private String passWord;
    private String nickName;
    private int age;
    private String addr;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    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 String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}

3、查询结果的的接口。

public interface RowMapper<T> {

    public T mapRow(ResultSet rs,int rowNum) throws Exception;
}

4、Dao调用:

public class MemberDao {
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(null);

    public MemberDao(DataSource dataSource) {
        //super(dataSource);
    }

    public List<?> query(){
        String sql = "select * from t_member";
        return  jdbcTemplate.executQuery(sql, new RowMapper<Member>() {
            @Override
            public Member mapRow(ResultSet resultSet, int rowNum) throws Exception {
                Member member = new Member();
                member.setUserName(resultSet.getString("username"));
                member.setPassWord(resultSet.getString("password"));
                member.setNickName(resultSet.getString("nickname"));
                member.setAge(resultSet.getInt("age"));
                member.setAddr(resultSet.getString("addr"));
                return member;
            }
        },null);
    }
}

5、测试:

public class App 
{
    public static void main( String[] args )
    {
        MemberDao memberDao = new MemberDao(null);
        memberDao.query();

    }
}

猜你喜欢

转载自blog.csdn.net/ChenAi12345678910/article/details/81389573
今日推荐