JDBCTemplate-模板设计模式和策略模式

embedded/2025/1/21 4:37:51/

策略模式是一种行为型设计模式,它允许将算法的实现封装在不同的策略类中,并在运行时根据需要动态选择合适的策略。策略模式的核心思想是将算法或行为抽象为接口,然后通过具体的策略类来实现这些行为。

模板方法模式(Template Method Pattern) 是一种行为型设计模式,它定义了一个操作的算法骨架,而将某些步骤的实现推迟到子类中。通过模板方法,子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。

标准的 JDBC 操作步骤, 需要给 preparestatment 进行赋值,对于查询出来的语句需要 set。这样操作很繁琐。使用模板方法模式,将这些步骤放入到模板里面,减少了代码的编写。提高编码效率

public class JdbcTemplate {public <T> T queryObject(final String sql, RowMapper<T> rowMapper, Object... args) {Connection connection = JDBCUtils.getConnection(); //拿到数据库的连接try {PreparedStatement pst = connection.prepareStatement(sql);setParams(pst, args);ResultSet rs = pst.executeQuery();if (rs.next()) {return rowMapper.mapper(rs);}} catch (SQLException e) {throw new RuntimeException(e);}return null;}//给 pst 设置合理的参数private void setParams(PreparedStatement pst, Object[] args) {for (int i = 0; i < args.length; i++) {try {pst.setObject(i + 1, args[i]);} catch (SQLException e) {throw new RuntimeException(e);}}}
}
public static void main(String[] args) {JdbcTemplate jdbcTemplate=new JdbcTemplate();String sql = "SELECT * FROM tb_user WHERE name = ?";User user = jdbcTemplate.queryObject(sql, new UserRowMapper(), new Object[]{"zhangsan"});System.out.println(user);
}

对于查询出来的内容需要进行映射,是策略模式。设定一个固定的接口,具体的实现放在子类中。RowMapper 实现 result 到 实体类的映射。

import java.sql.ResultSet;public interface RowMapper <T>{T mapper(ResultSet res);
}
import java.sql.ResultSet;public class UserRowMapper implements RowMapper<User>{@Overridepublic User mapper(ResultSet res) {User user = new User();try {user.setName(res.getString("name"));user.setAge(res.getInt("age"));user.setAddress(res.getString("address"));}catch (Exception e) {e.printStackTrace();}return user;}
}

运行查询到结果

public int insert(final String sql, Object... args) { //可变参数 本质是一个数组Connection connection = JDBCUtils.getConnection();try {PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);setParams(pst, args);int rows = pst.executeUpdate();if (rows<1){throw new RuntimeException("插入失败");}ResultSet generatedKeys = pst.getGeneratedKeys();if (generatedKeys.next()) {return generatedKeys.getInt(1);//返回第一列}} catch (SQLException e) {throw new RuntimeException(e);}return 0;
}

插入 User 返回主键值

更新 User

public int update(final String sql, Object... args) {Connection connection = JDBCUtils.getConnection();try {PreparedStatement pst = connection.prepareStatement(sql);setParams(pst, args);int rows = pst.executeUpdate();if (rows<1){throw new RuntimeException("更新失败");}return rows;} catch (SQLException e) {throw new RuntimeException(e);}
}

修改成功

还有批量查询等操作,包括分页都是可以用模板方法模式去实现的。


http://www.ppmy.cn/embedded/155677.html

相关文章

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路&#xff1a; 攻击外网服务器&#xff0c;获取外网服务器的权限&#xff0c;接着利用入侵成功的外网服务器作为跳板&#xff0c;攻击内网其他服务器&#xff0c;最后获得敏感数据&#xff0c;并将数据传递到攻击者&#xff0…

以太网详解(五)GMII、RGMII、SGMII接口时序约束(Quartus 平台)

文章目录 接口时序Avalon Streaming 接口时序Receive TimingTransmit Timing GMII 接口时序Receive TimingTransmit Timing RGMII 接口时序Receive TimingTransmit Timing 如何创建 .sdc 约束文件三速以太网系统时钟信号创建 set_input_delay&#xff0c;set_output_delay 约束…

20250116联想笔记本电脑ThinkBook 16 G5+使用TF卡拷贝速度分析

20250116联想笔记本电脑ThinkBook 16 G5使用TF卡拷贝速度分析 2025/1/16 19:30 结论&#xff1a;看使用的环境&#xff0c;速度大概是22-50-80MBps。 根据你是直接接到电脑的读卡器&#xff0c;还是外置读卡器&#xff0c;以及USB2.0/USB3.0/type-C【USB3.1接口】对读写速度都有…

解决wordpress媒体文件无法被搜索的问题

最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…

红黑树封装map和set(c++版)

前言 在前面&#xff0c;我们介绍了c中map和set库的使用&#xff0c;也实现了一颗简单的红黑树。那么现在我们就利用这两部分的知识&#xff0c;实现一个简单的myMap和mySet。 源码阅读 在我们实现之前&#xff0c;我们可以阅读一些标准库的实现&#xff0c;学习标准库的实现…

UnderTow服务器

1.Undertow架构概述 Undertow是一个灵活的、高性能的Web服务器&#xff0c;它的设计理念是通过组合不同的组件来满足不同的应用需求。以下是对Undertow架构的详细分析&#xff1a; 1. 整体架构 Undertow服务器由三个主要部分组成&#xff1a; XNIO工作者实例&#xff1a;负责…

速通Docker === 介绍与安装

目录 Docker介绍 Docker优势 Docker组件 Docker CLI (命令行接口) Docker Host (Docker 守护进程) 容器 (Container) 镜像 (Image) 仓库 (Registry) 关系总结 应用程序部署方式 传统部署 (Traditional Deployment) 虚拟化部署 (Virtualization Deployment) 容器部署…