策略模式是一种行为型设计模式,它允许将算法的实现封装在不同的策略类中,并在运行时根据需要动态选择合适的策略。策略模式的核心思想是将算法或行为抽象为接口,然后通过具体的策略类来实现这些行为。
模板方法模式(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>{
@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;
}
}
运行查询到结果
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);
}
}
修改成功
还有批量查询等操作,包括分页都是可以用模板方法模式去实现的。