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

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

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

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

java 复制代码
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);
            }
        }
    }
}
java 复制代码
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 到 实体类的映射。

java 复制代码
import java.sql.ResultSet;

public interface RowMapper <T>{
    T mapper(ResultSet res);
}
java 复制代码
import java.sql.ResultSet;

public class UserRowMapper implements RowMapper<User>{
    @Override
    public 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;
    }
}

运行查询到结果

java 复制代码
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

java 复制代码
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);
    }
}

修改成功

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

相关推荐
snakecy4 小时前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
是2的10次方啊8 小时前
设计模式与生活①:你的脸,为什么不能有第二个?
设计模式
高晶10 小时前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶10 小时前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风13 小时前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观13 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu1 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL2 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803232 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw3 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计