我有一个 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;
}
因此,在此之后,我在 Controller (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,一切正常。但现在我有了图层服务。
之前: Controller > DAO
现在: Controller > 服务 > DAO
我不想将我的连接(conn)作为参数传递给Service,并在Service之后将conn作为参数传递给DAO。这似乎不是一个好方法。
我想,也许可以在我的 DAO 中获取连接工厂,但我不确定,拦截器似乎仍然是更好的管理方法。
那么,你会怎样做呢?抱歉,如果这是一个愚蠢的问题,但我此刻不想编造任何东西,只是为了跟随人们正在做的事情来创建一个好的样板......
- 我不打算在此项目中使用 Hibernate。
最佳答案
有几件事......您可能甚至不应该接触除 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,将它们注入(inject)到您的服务层中,然后将您的服务类注入(inject)到您的 Controller 中。下面是使用 Spring 首选 JDBC DAO 模式的示例:The Spring Jdbc Template for Database Access - Tutorial
关于java - 如何与Service层操作JDBC连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16294019/