如何在 Java 中同时设置客户端-服务器程序和数据库?
Posted
技术标签:
【中文标题】如何在 Java 中同时设置客户端-服务器程序和数据库?【英文标题】:How to set-up a client-server program and a database together in Java? 【发布时间】:2022-01-09 15:50:45 【问题描述】:我需要创建一个包含客户端、服务器和数据库的程序 客户端需要将数据输入数据库或通过服务器查询,我正在使用 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);
我想知道这应该放在哪里,我应该将它放在服务器类还是连接到服务器的单独类中。这是我第一次做这样的事情,我希望我的做法很好,所以非常感谢帮助。
【问题讨论】:
Separation of Concerns。当然,您不会在服务器的主类中初始化数据库连接,而是在单独的类中初始化。而且您不会在类内部而是在外部配置文件(例如 config.properties)中硬连线连接详细信息,如数据库 URL、用户和密码。因此无需重新编译即可配置系统。 @vanje 如果连接代码在单独的类中,我将如何使服务器与数据库通信? 【参考方案1】:DataSource
SQL 包定义了DataSource
接口。这种类型的对象是您保存数据库连接信息的地方,例如数据库服务器地址、数据库用户名、密码等。
引用文档:
连接到此
DataSource
对象所代表的物理数据源的工厂。作为DriverManager
工具的替代方案,DataSource
对象是获得连接的首选方法。
选择该接口的实现。 JDBC 驱动程序通常带有一个或多个特定于该特定数据库的实现。您需要特定于该数据库的实现,因为各种数据库具有不同的功能和设置。
返回一个更通用类型的对象,接口,而不是更具体的类型,具体实现。这样做可以让您灵活地将具体类换成另一个类,而不会破坏任何调用代码。
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();
请务必关闭您的开放资源,例如 Connection
、Statement
、PreparedStatement
和 ResultSet
。一般最好使用try-with-resources语法自动关闭你的资源。
请注意,DataSource
永远不会“打开”,因此我们永远不需要关闭它。 DataSource
仅包含向数据库服务器请求连接所需的信息位。 DataSource
对象本身不是资源。
JNDI
最终你可能想要使用JNDI 来获得DataSource
对象。这使您可以通过Jakarta EE 服务器、LDAP 服务器等将数据库配置外部化,而不是硬编码用户名、密码等。
在这种方法下,当您的数据库更改其地址或密码时,您可以更新外部配置,而无需重新编译您的代码并重新部署您的应用程序。
引用文档:
实现
DataSource
接口的对象通常会注册到基于 Java 命名和目录 (JNDI) API 的命名服务。
更多信息
另见:
Implementation of JDBC DataSource in MySQL Connector/J 8 Tutorial 由 Oracle 提供,免费 Why do we use a DataSource instead of a DriverManager?【讨论】:
【参考方案2】:我猜您是在询问应用程序的设计/架构。如果是这种情况,那么您应该遵循 MVC 架构模式。
** 什么是 MVC?**
MVC 包含三个主要组件:
型号 查看 控制器他们每个人都有特定的职责。
型号 模型负责或维护数据。它实际上连接到数据库。所以任何数据操作,即你想要做的添加/更新/删除/插入都是在模型中完成的。基本上模型只与控制器对话并将所需的数据提供给控制器。即模型从不直接与数据通信。
查看 数据表示,即 UI(html/CSS 部分)由 View 完成。控制器向视图提供数据,这些数据将显示给最终用户。即 View 只与控制器对话。
控制器 控制器支持视图和模型之间的交互。它不必担心业务逻辑。它会告诉模型应该做什么。从 Model 接收数据后,它会将其发送到 View。
【讨论】:
【参考方案3】:你需要一个 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;
【讨论】:
Class.forName
很多年都不需要了。在现代 Java 中,JDBC 驱动程序通过 Java 中的 服务提供者接口 (SPI) 工具自动注册到 JVM。
@BasilBourque 在我的学校里他们教这个,顺便谢谢你的信息以上是关于如何在 Java 中同时设置客户端-服务器程序和数据库?的主要内容,如果未能解决你的问题,请参考以下文章