如何在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();
}
请务必关闭您打开的资源,例如 Connection
、Statement
、PreparedStatement
和 ResultSet
。通常最好使用 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.
了解更多信息
另请参阅:
- Implementation of JDBC DataSource in MySQL Connector/J 8
- Tutorial 由 Oracle 免费提供
- Why do we use a DataSource instead of a DriverManager?
我需要创建一个包含客户端、服务器和数据库的程序 客户端需要将数据输入数据库或通过服务器查询,我使用 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 theDriverManager
facility, aDataSource
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();
}
请务必关闭您打开的资源,例如 Connection
、Statement
、PreparedStatement
和 ResultSet
。通常最好使用 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.
了解更多信息
另请参阅:
- Implementation of JDBC DataSource in MySQL Connector/J 8
- Tutorial 由 Oracle 免费提供
- Why do we use a DataSource instead of a DriverManager?