1

我有一个 Spring MVC 应用程序,它工作正常,但现在我插入了服务模式,我不知道在我的 DAO 中处理我的 JDBC 连接的最佳方法是什么。

我有一个拦截器,它创建这样的连接:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    System.out.println("preHandle: Abrindo Conexao BD");

    conn = new ConnectionFactory().getConnection();
    request.setAttribute("conn", conn);

    return true;

}

所以,在这之后,我在我的控制器(servlet)中得到了这样的连接:

@RequestMapping("efetuaLogin")
public String efetuaLogin(Usuario usuario, HttpSession session, HttpServletRequest request) throws ServletException {

    Connection conn = (Connection) request.getAttribute("conn");

    if(new UsuarioDAO(conn).existeUsuario(usuario)){
        session.setAttribute("usuarioLogado", usuario);
        return "adm/main-adm";
    }

    return "redirect:loginForm";
}

非常简单,我将连接传递给 DAO,一切正常。但现在我有了图层服务。

之前:控制器 > DAO

现在:控制器 > 服务 > DAO

我不想将我的connection(conn) 作为参数传递给Service,并在Service 之后将conn 作为参数传递给DAO。这似乎不是一个好方法。

我想,也许是为了在我的 DAO 中获取连接工厂,但我不确定,拦截器似乎仍然是管理它的更好方法。

那么,你会怎么做呢?对不起,如果这是一个愚蠢的问题,但我不想在这一刻编造任何东西,只是为了跟随人们正在做的事情来创造一个好的样板......

  • 我不打算在这个项目中使用 Hibernate。
4

1 回答 1

2

有几件事......你可能甚至不应该在除 DAO 层之外的任何代码层接触连接。您的 DAO 正在使用 JDBC 的事实应该对其他人隐藏。此外,您正在使用 Spring,因此您根本不应该构建您的 DAO,让 Spring 处理。您可以一起摆脱拦截器。

对您的代码的最小侵入性更改是让您的拦截器将连接放入ThreadLocal

public class ConnectionHolder {
    private static final ThreadLocal tl = new ThreadLocal<Connection>();
    public static void setConnection(Connection c) { tl.set(c); }
    public static Connection getConnection() { return tl.get(); }
}

然后你的 DAO 可以检索它。现在,做这一切的首选方法是让 Spring 管理这一切。使您的 DAO 成为 Spring Bean,将它们注入您的服务层,然后将您的服务类注入您的控制器。这是使用 Spring 首选 JDBC DAO 模式的示例:The Spring Jdbc Template for Database Access - Tutorial

于 2013-05-02T10:51:35.800 回答