如何在Java中同时设置客户端-服务器程序和数据库?

How to set-up a client-server program and a database together in Java?

我需要创建一个包含客户端、服务器和数据库的程序 客户端需要将数据输入数据库或通过服务器查询,我使用 MySQL 和 JDBC 将 MySQL 连接到我的 java 代码。我想知道理想的设置是什么。

例如,我使用以下代码连接到我的数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class test2 {

    public static void main(String[] args) {
        
        String url = "jdbc:mysql://localhost:3306/CovidPreventation";
        String username = "test";
        String password = "test";

        System.out.println("Connecting database...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("Database connected!");
        } catch (SQLException e) {
            throw new IllegalStateException("Cannot connect the database!", e);
        }
    
    }

}

我想知道它应该去哪里,我应该把它放在服务器 class 中还是在连接到服务器的单独 class 中。这是我第一次做这样的事情,我希望我的做法是好的,所以感谢帮助。

所有你需要一个 jdbc 驱动程序,你可以在这里得到它:https://mvnrepository.com/artifact/mysql/mysql-connector-java

并将 jar 文件添加到您的 ide

在您需要像这样在您的代码中调用它之后:

public static Connection getConnection(String dbURL, String userName, 
            String password) {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(dbURL, userName, password);
            System.out.println("connect successfully!");
        } catch (Exception ex) {
            System.out.println("connect failure!");
            ex.printStackTrace();
        }
        return conn;
    }

我猜你问的是应用程序的design/architecture。如果是这种情况,那么您应该遵循 MVC 架构模式。

** 什么是 MVC?**

MVC 具有三个主要组件:

  • 型号
  • 查看
  • 控制器

他们每个人都有特定的职责。

型号
模型负责或维护数据。它实际上连接到数据库。所以任何数据操作,即你想做的 ADD/Update/Delete/Insert 都是在模型中完成的。基本上模型只与控制器对话并将所需的数据提供给控制器。即模型从不直接与数据通信。

查看
数据表示,即 UI(Html/CSS 部分)由 View 完成。控制器将数据提供给视图,这些数据将显示给最终用户。即视图只与控制器对话。

控制器
控制器支持视图和模型之间的交互。它不必担心业务逻辑。它会告诉模型应该做什么。从模型接收数据后,它会将其发送到视图。

DataSource

SQL 包定义了 DataSource 接口。该类型的对象是您保存数据库连接信息的地方,例如数据库服务器地址、数据库用户名、密码等。

引用文档:

A factory for connections to the physical data source that this DataSource object represents. An alternative to the DriverManager facility, a DataSource object is the preferred means of getting a connection.

选择该接口的实现。 JDBC 驱动程序通常带有一个或多个特定于该特定数据库的实现。您需要特定于该数据库的实现,因为各种数据库具有不同的功能和设置。

Return 更一般类型的对象,接口,而不是更具体类型的具体实现。这样做可以让您灵活地将具体 class 换成另一个,而不会破坏任何调用代码。

    private DataSource configureDataSource ( )
    {
        System.out.println( "INFO - `configureDataSource` method. " + Instant.now() );

        com.mysql.cj.jdbc.MysqlDataSource dataSource = Objects.requireNonNull( new com.mysql.cj.jdbc.MysqlDataSource() );  // Implementation of `DataSource`.
        dataSource.setServerName( "db-mysql-lon3-433-do-user-89673-1.x.db.ondigitalocean.com" );
        dataSource.setPortNumber( 24_090 );
        dataSource.setDatabaseName( "defaultdb" );
        dataSource.setUser( "scott" );
        dataSource.setPassword( "tiger" );
        return dataSource;
    }

在您的应用中保留 DataSource 对象。当需要数据库连接时,调用DataSource#getConnection.

        String sql = "SELECT name_ from  user_ ; " ;
        try (
                Connection conn = myDataSource.getConnection() ;
                Statement statement = conn.createStatement() ;
                ResultSet resultSet = statement.executeQuery( sql ) ;
        )
        {
            while ( resultSet.next() )
            {
                String userName = resultSet.getString( "name_" );
                System.out.println( username ) ;
            }
        }
        catch ( SQLException e )
        {
            e.printStackTrace();
        }

请务必关闭您打开的资源,例如 ConnectionStatementPreparedStatementResultSet。通常最好使用 try-with-resources 语法来自动关闭您的资源。

注意 DataSource 永远不会“打开”,所以我们永远不需要关闭它。 DataSource 仅包含向数据库服务器请求连接所需的信息位。 DataSource 对象本身 不是 资源。

JNDI

最终您可能希望使用 JNDI to obtain a DataSource object. This enables you to externalize the database configuration through a Jakarta EE server, LDAP 服务器等,而不是硬编码用户名、密码等

在这种方法下,当您的数据库更改其地址或密码时,您可以更新外部配置,而无需重新编译您的代码并重新部署您的应用程序。

引用文档:

An object that implements the DataSource interface will typically be registered with a naming service based on the Java Naming and Directory (JNDI) API.

了解更多信息

另请参阅: