当前位置: 首页 > 开发者资讯

Java 如何连接和操作数据库 Java 数据库编程教程

  在使用 Java 操作数据库前,首先要确保开发环境已正确配置。你需要安装 JDK(Java Development Kit),同时根据不同的数据库类型,引入对应的 JDBC(Java Database Connectivity)驱动。例如,连接 MySQL 数据库,需要下载并导入 MySQL Connector/J 驱动;连接 Oracle 数据库,则要获取 Oracle JDBC 驱动。将下载好的驱动 jar 包添加到项目的依赖中,Maven 项目可在pom.xml文件中添加依赖坐标,Gradle 项目则在build.gradle文件中配置。

  以 MySQL 驱动为例,Maven 项目的pom.xml配置如下:

  TypeScript取消自动换行复制

  <dependency>

  <groupId>mysql</groupId>

  <artifactId>mysql-connector-java</artifactId>

  <version>8.0.33</version>

  </dependency>二、建立数据库连接

  Java 中通过DriverManager类和Connection接口来建立与数据库的连接。以下是连接 MySQL 数据库的示例代码:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.SQLException;

  java.png

  public class DatabaseConnection {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  

  try (Connection connection = DriverManager.getConnection(url, username, password)) {

  if (connection != null) {

  System.out.println("成功连接到数据库!");

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }在上述代码中,url指定了数据库的地址、端口和数据库名称;username和password分别为数据库的登录用户名和密码。DriverManager.getConnection()方法用于尝试建立连接,使用try-with-resources语句可以确保连接在使用完毕后自动关闭,避免资源泄漏。

  执行 SQL 语句:增删改查操作

  3.1 查询操作(SELECT)

  使用Statement或PreparedStatement接口执行查询语句。PreparedStatement相较于Statement,具有更好的安全性,能有效防止 SQL 注入攻击。以下是使用PreparedStatement执行查询的示例:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  public class DatabaseQuery {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  String sql = "SELECT * FROM your_table_name WHERE id = ?";

  try (Connection connection = DriverManager.getConnection(url, username, password);

  PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

  preparedStatement.setInt(1, 1); // 设置参数值,假设id为整数类型

  ResultSet resultSet = preparedStatement.executeQuery();

  while (resultSet.next()) {

  int id = resultSet.getInt("id");

  String name = resultSet.getString("name");

  System.out.println("ID: " + id + ", Name: " + name);

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }在上述代码中,?为占位符,通过setInt()等方法设置参数值,executeQuery()方法执行查询并返回ResultSet对象,通过ResultSet的相关方法获取查询结果。

  3.2 插入操作(insert)

  使用PreparedStatement执行插入语句,示例如下:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  import java.sql.SQLException;

  

  public class DatabaseInsert {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  String sql = "insert INTO your_table_name (name, age) VALUES (?, ?)";

  try (Connection connection = DriverManager.getConnection(url, username, password);

  PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

  preparedStatement.setString(1, "John");

  preparedStatement.setInt(2, 30);

  int rowsAffected = preparedStatement.executeUpdate();

  if (rowsAffected > 0) {

  System.out.println("数据插入成功!");

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }executeUpdate()方法用于执行增删改操作,返回受影响的行数。

  3.3 更新操作(UPDATE)

  更新数据的示例代码如下:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  import java.sql.SQLException;

  public class DatabaseUpdate {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  String sql = "UPDATE your_table_name SET age = ? WHERE name = ?";

  try (Connection connection = DriverManager.getConnection(url, username, password);

  PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

  preparedStatement.setInt(1, 31);

  preparedStatement.setString(2, "John");

  int rowsAffected = preparedStatement.executeUpdate();

  if (rowsAffected > 0) {

  System.out.println("数据更新成功!");

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }3.4 删除操作(delete)

  删除数据的代码示例:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  import java.sql.SQLException;

  public class DatabaseDelete {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  String sql = "delete FROM your_table_name WHERE id = ?";

  try (Connection connection = DriverManager.getConnection(url, username, password);

  PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

  preparedStatement.setInt(1, 1);

  int rowsAffected = preparedStatement.executeUpdate();

  if (rowsAffected > 0) {

  System.out.println("数据删除成功!");

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }

  数据库事务处理

  数据库事务具有原子性、一致性、隔离性和持久性(ACID)特性。在 Java 中,通过Connection接口的相关方法来控制事务。示例代码如下:

  TypeScript取消自动换行复制

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  import java.sql.SQLException;

  public class DatabaseTransaction {

  public static void main(String[] args) {

  String url = "jdbc:mysql://localhost:3306/your_database_name";

  String username = "your_username";

  String password = "your_password";

  try (Connection connection = DriverManager.getConnection(url, username, password)) {

  connection.setAutoCommit(false); // 关闭自动提交,开启事务

  String sql1 = "UPDATE account SET balance = balance - 100 WHERE id = 1";

  String sql2 = "UPDATE account SET balance = balance + 100 WHERE id = 2";

  try (PreparedStatement statement1 = connection.prepareStatement(sql1);

  PreparedStatement statement2 = connection.prepareStatement(sql2)) {

  statement1.executeUpdate();

  statement2.executeUpdate();

  connection.commit(); // 提交事务

  System.out.println("事务处理成功!");

  } catch (SQLException e) {

  connection.rollback(); // 回滚事务

  e.printStackTrace();

  }

  } catch (SQLException e) {

  e.printStackTrace();

  }

  }

  }在上述代码中,通过setAutoCommit(false)关闭自动提交开启事务,commit()方法提交事务,rollback()方法回滚事务,确保数据的一致性和完整性。

  资源释放与异常处理

  在 Java 数据库编程中,及时释放数据库连接、语句对象(Statement或PreparedStatement)和结果集对象(ResultSet)至关重要。使用try-with-resources语句可以方便地实现资源的自动关闭。对于异常处理,捕获SQLException并进行适当处理,例如记录日志或向用户返回友好的错误提示,有助于提高程序的健壮性和可维护性。

 


猜你喜欢