下面是使用策略模式在模板方法之上的dao层改进代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 定义一个抽象的dao父类
*
* @author abing
*
*/
class BaseDao {
/**
* 在模板方法的基础上,为getObject方法添加了一个RowMapper[策略接口]接口属性,
* 通过调用方构建不同的RowMapper[策略接口]来完成不同的行为
*
* @param sql
* @param args
* @return
*/
public Object getObject(String sql, Object[] args, RowMapper rm) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);// 给sql中得参数赋值
}
if (rs.next()) {
obj = rm.mapRows(rs);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放数据库链接对象
}
return obj;
}
}
/**
* 定义一个行映射器-[策略接口] 只需要这么一个接口,通过内部类的使用就可以构建不同的方法实现体,来完成不同的事情
*
* @author abing
*
*/
interface RowMapper {
public Object mapRows(ResultSet rs) throws SQLException;
}
class UserDaoImpl extends BaseDao {
/**
* 根据id查询user对象
*
* @return User
*/
public User getUser() {
String sql = "select user_id,user_name,age from uset_tbl where user_id= ";
Object[] args = new Object[] { "abing" };
// 这里使用匿名内部类
User user = (User) this.getObject(sql, args, new RowMapper() {
@Override
public Object mapRows(ResultSet rs) throws SQLException {
// 构建并且返回user对象,这是一种策略
User user = new User();
user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setAge(rs.getInt("age"));
return user;
}
});
return user;
}
/**
* 根据id查询userName属性
*
* @return User
*/
public String getUserName() {
String sql = "select user_id,user_name,age from uset_tbl where user_id= ";
Object[] args = new Object[] { "abing" };
// 构建且仅返回userName字符串对象,这也是一种策略
String userName = (String) this.getObject(sql, args, new RowMapper() {
@Override
public Object mapRows(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
return rs.getString("user_name");
}
});
return userName;
}
}
class User {
private String userId;
private String userName;
private int age;
public String getUserId() {
return userId;
}
public void s