Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java类中正确实现JDBC_Java_Mysql_Jdbc - Fatal编程技术网

如何在Java类中正确实现JDBC

如何在Java类中正确实现JDBC,java,mysql,jdbc,Java,Mysql,Jdbc,我是JDBC新手,我正试图了解如何在我的程序中实现它。我有一个有员工和会员的项目。我希望能够为每个查询创建许多不同的查询 员工和会员都是独立的职业。我为数据库信息创建了一个单独的类,因为我在这里看到了答案(堆栈溢出)。所以现在我想知道我是否正确地实现了它。在底部,我创建了一个名为getMemberID的方法。我的计划是从Members类中的数据库调用此方法 这是实现数据库类的正确方法吗?在我看来,我会在这个数据库类中进行所有查询,然后从我使用的任何类中调用该方法(比如,如果我想获得某个员工的工资

我是JDBC新手,我正试图了解如何在我的程序中实现它。我有一个有员工和会员的项目。我希望能够为每个查询创建许多不同的查询

员工和会员都是独立的职业。我为数据库信息创建了一个单独的类,因为我在这里看到了答案(堆栈溢出)。所以现在我想知道我是否正确地实现了它。在底部,我创建了一个名为getMemberID的方法。我的计划是从Members类中的数据库调用此方法

这是实现数据库类的正确方法吗?在我看来,我会在这个数据库类中进行所有查询,然后从我使用的任何类中调用该方法(比如,如果我想获得某个员工的工资,我会在类数据库中创建另一个方法,称为getSalary()。

Db Connection:

  • URL_DB的格式为
    jdbc:mysql://hostname:port_number/database_name
  • 您需要替换用户并传递给您真正的ussername和密码
数据库交互:

您可以使用
语句
PreparedStatement
与数据库交互(CRUD操作)

这只是一个关于您需要做什么的简短讨论。在线阅读更多JDBC教程,并亲自尝试

我建议在实现之前编写一个接口

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

很好的尝试,但是,不,您的代码不是包装JDBC的正确方法。在
getMemberID()
方法中,您每次都会打开一个连接,并在几十次调用后很快耗尽连接

包装JDBC时要做的第一件事是确保没有泄漏任何资源

实现这一点最直接的方法是使用类似

interface DbAccess{
    Connection connect(...);
    void close(...);
    createEmployee(...);
    update(...)
    delete(...);
}
接下来,打开连接是一个相当慢的操作,因此您不希望为要执行的每个SQL语句打开连接。因此,您需要一个连接池,如(有无数个JDBC连接池实现可供选择)

然后您需要将ResultSet值映射到Java变量中。我个人不喜欢Hibernate和JPA,但这只是一种观点。如果只是为了读取RDBMS的写入值,我个人的偏好是将ResultSet读取到映射中,然后为每个值创建getter和setter方法


还有几个提示:始终按与打开资源相反的顺序关闭资源,并始终关闭引发SQLException的连接,因为它很可能持有未完成的事务,这将导致在其上执行的任何下一个SQL语句失败。

这在SQLite中起作用。我认为人们应该转向WARds尝试使用资源

Connection con = null;
PreparedStatement stm = null;
ResultSet rst = null;
try {
    con = createConnection();
    stm  = con.prepareStatement("SELECT ... FROM ... WHERE ...");
    stm.setString (1, "value1");
    rst = stm.executeQuery();
    while (rst.next()) {
       // int i = rst.getInt(1);
    }
} catch (Exception e) {
    // do whatever
} finally {
    try { if (rst!=null) rst.close(); } catch (SQLException sqle) { }
    try { if (stm!=null) stm.close(); } catch (SQLException sqle) { }
    try { if (con!=null) con.close(); } catch (SQLException sqle) { }
}

在这之后尝试hibernate。它为您完成所有繁重的工作,代码可以被清晰地显示出来maintained@YCF_L因此,即使我计划使用update语句、insert、AGGRATE(例如group by、sum count),加入等。这会很好吗?我计划至少有30多个查询。这个问题太宽泛了,除此之外还有很多基于观点的问题。我建议阅读一些关于设计的教程或书籍,但我想你很快就会发现没有“一个正确的方法”@MarkRotteveel是的,我知道编程有多种方法可以完成一件事,但并不是所有的事情都有一个正确的答案,但我只是想看看这种实现这个数据库类的方法是否至少可以实现我所要做的(使用将调用该方法的两个类Employees和Members,例如数据库类中的getMemberID)再次,过于宽泛+观点。请搜索一些关于DAO模式(数据访问对象)和企业应用程序设计(或模式)的教程,以获得一些启示。对不起,我应该澄清我已完全连接到数据库(我只是漏掉了我的登录信息,因为它是为学校提供的)。我只关心我实现查询的方式。就像我在底部的方法getMemberID一样。你知道这是否是实现我的查询的正确方式吗?我计划使用update语句、insert语句、聚合语句(例如group by语句、sum count语句),连接等。这会很好吗?我计划至少有30多个查询。是的,即使您的代码正常工作,它也会工作。对于所有这些查询,您只需要适当的sql语句,就可以了。请尝试resources@XXIV我觉得不错。我的建议是你可以写一个界面(见我的更新),列出所有与外部世界的交互方法,你知道什么是公开的。但是如果我在每次查询调用后关闭所有连接,我不会耗尽连接,对吗?如果是这样,这段代码可以用于我正在进行的项目,对吗?为什么要在Java自Java 7开始尝试使用资源时提出这一建议?我不会耗尽连接f在每次调用后关闭它们。如果在使用完它们后不关闭连接,则会耗尽连接。try-with-resources是另一种语法可能性。但如果使用prepared语句,则需要两个try{}catch{}除非prepareStatement和参数绑定是通过helper方法完成的,否则不要使用一个。该示例的目的是说明确保资源在使用后关闭的重要性。不要偏爱一种代码样式而不是另一种。
Connection con = null;
PreparedStatement stm = null;
ResultSet rst = null;
try {
    con = createConnection();
    stm  = con.prepareStatement("SELECT ... FROM ... WHERE ...");
    stm.setString (1, "value1");
    rst = stm.executeQuery();
    while (rst.next()) {
       // int i = rst.getInt(1);
    }
} catch (Exception e) {
    // do whatever
} finally {
    try { if (rst!=null) rst.close(); } catch (SQLException sqle) { }
    try { if (stm!=null) stm.close(); } catch (SQLException sqle) { }
    try { if (con!=null) con.close(); } catch (SQLException sqle) { }
}
       String sql = "Update Employees SET age = ? WHERE id = ?"; 
        try (Connection conn = DriverManager.getConnection("jdbc:mysql://hostname:port_number/database_name");
             PreparedStatement ps = conn.prepareStatement(sql);)
        {
            ps.setString(1, age);
            ps.setString(2, id);
            ps.execute();                
        } 
        catch (SQLException e) {
            //Catch here!
        }