java - 如何与Service层操作JDBC连接

标签 java design-patterns service jdbc

我有一个 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/

相关文章:

design-patterns - 什么时候设计模式会让你的软件变得更糟?

java - android中无法启动服务错误

c# - 服务耗尽 TCP 连接

android - 如何将参数从 Activity 传递到服务......当用户停止服务时

java - 如何使用 Spring Security 正确获取与用户关联的 GrantedAuthority 列表?

java - Glassfish SSE 未成功将事件发送到浏览器 EventSource(最新的 Chrome)

c++ - A 类的对象作为 B 类的成员。B 需要 A 的对象来初始化自身

java - 读取驻留在从另一个 jar 文件调用的 jar 中的文件

java - 为什么我不能在类中声明字符串?

java - 我应该如何设计我的 restful API 以通过 POST 以不同格式(JSON、CSV)接受数据以达到相同目的?