模板方法模式实现封装jdbc

简介: 模板方法模式实现封装jdbc

模板方法模式


类图


1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png



实践1:各个课程流程 求同存异 写法


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

/**
 * 模板会有一个或者多个未现实方法,
 * 而且这几个未实现方法有固定的执行顺序
 */
public abstract class NetWorkCourse {
    protected final void createCourse() {
        //1、发布预习资料
        this.postPreResource();
        //2、制作PPT课件
        this.createPPT();
        //3、在线直播
        this.liveVideo();
        //4、提交课件、课堂笔记
        this.postNote();
        //5、提交源码
        this.postSource();
        //6、布置作业,有些课是没有作业,有些课是有作业的
        //如果有作业的话,检查作业,如果没作业,完成了
        if (needHomework()) {
            checkHomework();
        }
    }
    abstract void checkHomework();
    //钩子方法:实现流程的微调
    protected boolean needHomework() {
        return false;
    }
    final void postSource() {
        System.out.println("提交源代码");
    }
    final void postNote() {
        System.out.println("提交课件和笔记");
    }
    final void liveVideo() {
        System.out.println("直播授课");
    }
    final void createPPT() {
        System.out.println("创建备课PPT");
    }
    final void postPreResource() {
        System.out.println("分发预习资料");
    }


public class BigDataCource extends NetWorkCourse {
    private boolean needHomeworkFlag = false;
    public BigDataCource(boolean needHomeworkFlag) {
        this.needHomeworkFlag = needHomeworkFlag;
    }
    @Override
    void checkHomework() {
        System.out.println("检查大数据的课后作业");
    }
    @Override
    protected boolean needHomework() {
        return this.needHomeworkFlag;
    }
}
public class JavaCourse extends NetWorkCourse {
    @Override
    void checkHomework() {
        System.out.println("检查Java的架构课件");
    }
}


测试NetWorkCourseTest


public class NetWorkCourseTest {
    public static void main(String[] args) {
        System.out.println("---检查java作业--");
        NetWorkCourse javaCourse = new JavaCourse();
        javaCourse.createCourse();
        System.out.println("---检查大数据作业--");
        BigDataCource bigDataCource = new BigDataCource(true);
        bigDataCource.createCourse();
    }
}


1dc618a0ed9580ce8bfa6facb208c08f.png

可以看到java课程和大数据课程不同的作业,选择实现。相同的逻辑,父类给 实现了。


实践2:使用模板方法模式封装jdbc


5d4c6812c8535adbb050f4ddf2e1bce8.png

public abstract class JdbcTemplate {
    private DataSource dataSource;
    public JdbcTemplate(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    public List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values) {
        try {
            //1、获取连接
            Connection conn = this.getConnection();
            //2、创建语句集
            PreparedStatement pstm = this.createPrepareStatement(conn, sql);
            //3、执行语句集
            ResultSet rs = this.executeQuery(pstm, values);
            //4、处理结果集
            List<?> result = this.paresResultSet(rs, rowMapper);
            //5、关闭结果集
            this.closeResultSet(rs);
            //6、关闭语句集
            this.closeStatement(pstm);
            //7、关闭连接
            this.closeConnection(conn);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    //1、获取连接
    public Connection getConnection() throws Exception {
        return this.dataSource.getConnection();
    }
    //2、创建语句集
    protected PreparedStatement createPrepareStatement(Connection conn, String sql) throws Exception {
        return conn.prepareStatement(sql);
    }
    //3、执行语句集
    protected ResultSet executeQuery(PreparedStatement pstm, Object[] values) throws Exception {
        for (int i = 0; i < values.length; i++) {
            pstm.setObject(i,values[i]);
        }
        return pstm.executeQuery();
    }
    //4、处理结果集
    protected List<?> paresResultSet(ResultSet rs, RowMapper<?> rowMapper) throws Exception {
        List<Object> result = new ArrayList<Object>();
        int rowNum = 1;
        while (rs.next()){
            result.add(rowMapper.mapRow(rs,rowNum ++));
        }
        return result;
    }
    //5、关闭结果集
    protected void closeResultSet(ResultSet rs) throws Exception {
        rs.close();
    }
    //6、关闭语句集
    protected void closeStatement(PreparedStatement pstm) throws Exception {
        pstm.close();
    }
    //7、关闭连接
    protected void closeConnection(Connection conn) throws Exception {
        //数据库连接池,我们不是关闭
        conn.close();
    }
}
public class Member {
    private String username;
    private String password;
    private String nickname;
    private int age;
    private String 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;
    }
    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;
    }
}


/**
 * Title: RowMapper
 * Description: TODO
 *
 * @author hfl
 * @version V1.0
 * @date 2020-05-20
 */
public interface RowMapper<T> {
    T mapRow(ResultSet rs, int rowNum)throws Exception;
}


public class MemberDao extends JdbcTemplate {
    public MemberDao(DataSource dataSource) {
        super(dataSource);
    }
    public List<?> selectAll(){
        String sql = "select * from t_member";
        return super.executeQuery(sql, new RowMapper<Member>() {
            @Override
            public Member mapRow(ResultSet rs, int rowNum) throws Exception {
                Member member = new Member();
                //字段过多,原型模式
                member.setUsername(rs.getString("username"));
                member.setPassword(rs.getString("password"));
                member.setAge(rs.getInt("age"));
                member.setAddr(rs.getString("addr"));
                return member;
            }
        },null);
    }
}
public class MemberDaoTest {
    public static void main(String[] args) {
        MemberDao memberDao = new MemberDao(null);
        List<?> result = memberDao.selectAll();
        System.out.println(result);
    }
}


继续总结下模板方法模式:


好莱坞法则


1dc618a0ed9580ce8bfa6facb208c08f.png


模板方法模式的本质


5d4c6812c8535adbb050f4ddf2e1bce8.png46a9d80a6e05e4e3b19d57a0ee70bcdf.png



什么时候用到模板方法模式


66ba272a0bfc97be54a5fa679e3d5482.png


相关模式对比说明


88b9988b40447cb37c7e3c492d49867f.png


代码地址:


https://github.com/hufanglei/pattern-learn/tree/master/src/main/java/com/example/template


相关文章
|
7月前
|
Java 数据库连接
JDBC跨平台封装工具类
JDBC跨平台封装工具类
|
4月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
66 1
|
6月前
|
SQL Java 数据库连接
老程序员分享:JDBC工具类封装、封装DAO方法与数据库表实体类封装的使用案列详情
老程序员分享:JDBC工具类封装、封装DAO方法与数据库表实体类封装的使用案列详情
|
Java 数据库连接
Java 中封装JDBC连接到JDBCUtils工具类的详解
Java 中封装JDBC连接到JDBCUtils工具类的详解
95 0
|
7月前
|
SQL Java 数据库连接
JDBC如何封装成Mybaits持久层框架只需4
本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。
38 0
|
7月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
526 1
|
7月前
|
SQL druid Java
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
93 0
|
7月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
81 0
|
7月前
|
SQL 存储 Java
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
468 0
|
SQL 安全 Java
JDBC之DAO层封装思想超详解(下)
JDBC之DAO层封装思想超详解(下)