创建一个模板类JdbcTemplate,封装所有的JDBC 操作。以查询为例,每次查询的表不同,返回的数据结构也就不一样。我们针对不同的数据,都要封装成不同的实体对象。而每个实体封装的逻辑都是不一样的,但封装前和封装后的处理流程是不变的,因此,我们可以使用模板方法模式来设计这样的业务场景。先创建约束ORM 逻辑的接口RowMapper:

/*** ORM映射定制化的接口*/
public interface RowMapper<T> {T mapRow(ResultSet rs,int rowNum) throws Exception;
}

在创建封装了所有处理流程的抽象类JdbcTemplate:

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;}protected void closeConnection(Connection conn) throws Exception {//数据库连接池,我们不是关闭conn.close();}protected void closeStatement(PreparedStatement pstm) throws Exception {pstm.close();}protected void closeResultSet(ResultSet rs) throws Exception {rs.close();}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;}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();}protected PreparedStatement createPrepareStatement(Connection conn, String sql) throws Exception {return conn.prepareStatement(sql);}public Connection getConnection() throws Exception {return this.dataSource.getConnection();}
}

创建实体对象Member 类:

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;}
}

创建数据库操作类MemberDao:

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>() {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);}
}

希望通过这两个案例的业务场景分析,能够帮助小伙们对模板方法模式有更深的理解。

利用模板模式重构JDBC操作相关推荐

  1. 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

    模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...

  2. 九、委派模式与模板模式详解

    14.委派模式 14.1.课程目标 1 .掌握委派模式, 精简程序逻辑, 提升代码的可读性. 2.学会用模板方法模式梳理使用工作中流程标准化的业务场景. 14.2.内容定位 1 .希望通过对委派模式的 ...

  3. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  4. 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...

  5. Hive 本地模式,远程模式模式的搭建、命令行操作、Hive JDBC操作

    追风赶月莫停留,平芜尽处是春山. 文章目录 追风赶月莫停留,平芜尽处是春山. 环境 下载安装包,解压到合适位置: Hive 本地模式的搭建 一.配置相关的文件: 二.安装并配置MySQL 三.配置Hi ...

  6. 【设计模式】模板模式——jdbc案例

    系列文章目录 [设计模式]策略模式--支付案例 [设计模式]适配器模式--登录案例 [设计模式]委派模式--登录案例 文章目录 系列文章目录 前言 一.lol案例 二.jdbc案例 总结 前言 假如开 ...

  7. 第四周作业:利用matlab制作图像的二值模板并分别利用模板进行“与模板相与”、“与模板相或”、“与模板异或”操作

    文章目录 第四周作业 第一题 第二题 第四周作业 第一题 题目: 利用 MATLAB 编程,打开自己的一张照片,依次完成下列要求: 1) 以照片的自己作为目标,制作二值模板 2) 分别利用模板进行&q ...

  8. 利用模板设计组合模式的心得

    这几天研究C++模板,,在开发的时候有时会实现了如下猫狗鼠类,由于设计原因,这三个没有做成共同一个基类 struct Dog { void Say() { std::cout<< Soun ...

  9. Java 利用EasyPoi做Excel模板的导入导出操作

    Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...

最新文章

  1. 如何终止正在在发送的ajax请求
  2. Nginx+keepalived负载均衡高可用篇第③版
  3. 传iPhone 4S下月初开卖
  4. 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt
  5. LeetCode 513. 找树左下角的值 思考分析
  6. null和undefined相等
  7. mysql sql执行cmd命令行_命令行执行MySQL的sql文件
  8. alwayson高可用组_AlwaysOn可用性组–简化工作的好奇心–第1部分
  9. 短视频抢了直播饭碗,花椒、映客们逆袭抖音、快手无门
  10. js的5种继承方式——前端面试
  11. 如何使用 Font Book 在 Mac 上添加或删除字体?
  12. #《机器学习》_周志华(西瓜书)南瓜书_第4章 决策树
  13. 解决tar.bz2解压报错
  14. catia三维轴承_基于CATIA的轴承三维参数化标准件库的开发
  15. arm android开发板推荐,arm7开发板推荐 最新arm开发板了解
  16. 使用家庭或宿舍宽带将个人电脑变为服务器
  17. 批量安装Windows系统
  18. Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备)
  19. 图文字浅谈--计算机网络常遇的面试问题(计网面经)
  20. cesium for unreal 坐标参考框架

热门文章

  1. ActiveMQ网络连接
  2. P1273 有线电视网
  3. 《javascript高级程序设计》第六章总结
  4. C#中Dictionary的用法
  5. mac命令行安装htop
  6. Java中的容器类List、Set、Map的对比
  7. javascript正则表达式(一)
  8. ABAP正则表达式 vs SPLIT INTO
  9. 探索 OpenStack 之(10):深入镜像服务Glance
  10. 教你如何用手机查看哪些人在蹭你家的WIFI,然后将他们屏蔽!