JDBC:DAO(三)利用queryRunner实现一个较好的DAO架构

/**
 * 访问数据的 DAO 接口.
 * 里边定义好访问数据表的各种方法
 * @param T: DAO 处理的实体类的类型.
 */
public interface DAO<T> {

    /**
     * 批量处理的方法
     * @param connection
     * @param sql
     * @param args: 填充占位符的 Object [] 类型的可变参数.
     * @throws SQLException
     */  
    void batch(Connection connection,
            String sql, Object [] ... args) throws SQLException;
    
    /**
     * 返回具体的一个值, 例如总人数, 平均工资, 某一个人的 email 等.
     * @param connection
     * @param sql
     * @param args
     * @return
     * @throws SQLException
     */
    <E> E getForValue(Connection connection,
            String sql, Object ... args) throws SQLException;
    
    /**
     * 返回 T 的一个集合
     * @param connection
     * @param sql
     * @param args
     * @return
     * @throws SQLException
     */
    List<T> getForList(Connection connection,
            String sql, Object ... args) throws SQLException;
    
    /**
     * 返回一个 T 的对象
     * @param connection
     * @param sql
     * @param args
     * @return
     * @throws SQLException
     */
    T get(Connection connection, String sql,
            Object ... args) throws SQLException;
    
    /**
     * INSRET, UPDATE, DELETE
     * @param connection: 数据库连接
     * @param sql: SQL 语句
     * @param args: 填充占位符的可变参数.
     * @throws SQLException
     */
    void update(Connection connection, String sql,
            Object ... args) throws SQLException;

}


利用queryRunner实现之,也可以用上一篇文章的实现方法实现

/**
 * 使用 QueryRunner 提供其具体的实现
 * @param <T>: 子类需传入的泛型类型.
 */
public class JdbcDaoImpl<T> implements DAO<T> {

    private QueryRunner queryRunner = null;
    private Class<T> type;
    
    public JdbcDaoImpl() {
        queryRunner = new QueryRunner();
        type = ReflectionUtils.getSuperGenericType(getClass());
    }
    
    @Override
    public void batch(Connection connection, String sql, Object[]... args) throws SQLException {
        queryRunner.batch(connection, sql, args);
    }

    @Override
    public <E> E getForValue(Connection connection, String sql, Object... args) throws SQLException {
        return (E) queryRunner.query(connection, sql, new ScalarHandler(), args);
    }

    @Override
    public List<T> getForList(Connection connection, String sql, Object... args)
            throws SQLException {
        return queryRunner.query(connection, sql,
                new BeanListHandler<>(type), args);
    }

    @Override
    public T get(Connection connection, String sql, Object... args) throws SQLException {
        return queryRunner.query(connection, sql,
                new BeanHandler<>(type), args);
    }

    @Override
    public void update(Connection connection, String sql, Object... args) throws SQLException {
        queryRunner.update(connection, sql, args);
    }
    
}

针对不同的JavaBean自己添加需要的方法,可以先继接口再实现

public class CustomerDaoImpl
    extends JdbcDaoImpl<Customer>{
    //比如说分页方法,可以先在接口中声明
}



好像有点儿画蛇添足了,没必要弄得那么麻烦,以后在学习hibernate之后再完善。


你可能感兴趣的:(JDBC:DAO(三)利用queryRunner实现一个较好的DAO架构)