Java中连接数据库方式详细步骤记录

 更新时间:2025年01月08日 11:05:50   作者:噢小程  
这篇文章主要介绍了Java中连接数据库方式的详细步骤,包括添加依赖、建立连接、执行SQL语句、处理结果集和关闭连接,还讨论了数据库连接池的使用,需要的朋友可以参考下

一、JDBC(Java Database Connectivity)

这是 Java 连接数据库最基本的方式。

  • 导入数据库驱动:首先需要将特定数据库的 JDBC 驱动添加到项目的依赖中。
  • 加载驱动:使用Class.forName()方法加载数据库驱动。例如,Class.forName("com.mysql.cj.jdbc.Driver");
  • 建立连接:使用DriverManager.getConnection()方法建立与数据库的连接。例如,String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";Connection connection = DriverManager.getConnection(url, username, password);
  • 执行 SQL 语句:通过StatementPreparedStatement对象执行 SQL 查询、插入、更新或删除等操作。
  • 处理结果集:如果是查询操作,需要处理返回的ResultSet结果集。
  • 关闭连接:在操作完成后,务必关闭连接、语句和结果集以释放资源。

1、添加依赖

  • 确定数据库类型:首先确定你要连接的数据库类型,比如 MySQL、Oracle、SQL Server 等。不同的数据库需要不同的 JDBC 驱动。
  • 添加依赖:将相应数据库的 JDBC 驱动添加到你的项目中。如果是 Maven 项目,可以在pom.xml文件中添加依赖;如果是 Gradle 项目,则在build.gradle文件中添加。例如,对于 MySQL 数据库,可以添加mysql-connector-java依赖。

2、连接数据库

Java 虚拟机能够找到并加载特定数据库的 JDBC 驱动程序

try {
       Class.forName("com.mysql.cj.jdbc.Driver");
   } catch (ClassNotFoundException e) {
       e.printStackTrace();
   }

3、建立连接

  • url是数据库的连接字符串,其中localhost是数据库服务器地址,3306是 MySQL 的默认端口号,your_database_name是你要连接的数据库名称。
  • usernamepassword分别是数据库的用户名和密码。
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);
       // 连接成功后可以进行后续数据库操作
   } catch (SQLException e) {
       e.printStackTrace();
   }

4、执行 SQL 语句

可以使用StatementPreparedStatement来执行 SQL 语句。

Statement示例:

try {
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
         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();
     }

若使用PreparedStatement,(可以防止 SQL 注入):

try {
         String sql = "SELECT * FROM your_table_name WHERE id =?";
         PreparedStatement preparedStatement = connection.prepareStatement(sql);
         preparedStatement.setInt(1, 123); // 设置参数值
         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();
     }

5、处理结果集

根据执行的 SQL 语句类型(查询、插入、更新、删除等),处理结果集的方式不同。

对于查询语句,使用ResultSet的方法(如getIntgetString等)获取结果集中的列值。

1)查询语句处理

  • 使用ResultSet遍历结果集:
    • 当执行查询语句后,会得到一个ResultSet对象,它代表了从数据库返回的结果集。可以使用while循环结合ResultSet.next()方法来遍历结果集中的每一行数据。
    • 例如:
try {
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("SELECT * FROM your_table_name");
         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();
     }
  • 在循环中,可以根据列名或者列索引,使用ResultSet的相应方法(如getIntgetStringgetDouble等)来获取每一列的值。列索引从 1 开始。
  • 获取特定类型的数据:
    • 根据数据库中列的数据类型,选择合适的ResultSet方法来获取值。
    • 例如,如果列是整数类型,可以使用getInt;如果是字符串类型,可以使用getString;如果是浮点数类型,可以使用getDouble等。
    • 同时,可以传入列名或者列索引作为参数。例如:
int id = resultSet.getInt(1); // 通过列索引获取第一列的值(整数类型)
     String name = resultSet.getString("name"); // 通过列名获取名为"name"的列的值(字符串类型)

2)插入语句处理

  • 执行插入语句后,通常可以获取插入行的自增主键值(如果数据库表有自增主键):
    • 使用PreparedStatement执行插入语句,并设置返回自增主键的参数。
    • 例如:
String sql = "INSERT INTO your_table_name (column1, column2) VALUES (?,?)";
     try {
         PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
         preparedStatement.setString(1, "value1");
         preparedStatement.setString(2, "value2");
         int rowsInserted = preparedStatement.executeUpdate();
         if (rowsInserted > 0) {
             // 获取自增主键
             ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
             if (generatedKeys.next()) {
                 int generatedId = generatedKeys.getInt(1);
                 System.out.println("Inserted row with id: " + generatedId);
             }
         }
     } catch (SQLException e) {
         e.printStackTrace();
     }
  • 在执行插入操作后,通过PreparedStatement.getGeneratedKeys()方法可以获取包含自增主键值的ResultSet,然后可以从这个结果集中获取插入行的主键值。

3)更新语句处理

  • 执行更新语句后,通常会返回受影响的行数:
    • 使用StatementPreparedStatement执行更新语句,然后通过executeUpdate方法的返回值来判断有多少行被更新。
    • 例如:
String sql = "UPDATE your_table_name SET column1 =? WHERE column2 =?";
     try {
         PreparedStatement preparedStatement = connection.prepareStatement(sql);
         preparedStatement.setString(1, "newValue1");
         preparedStatement.setString(2, "conditionValue");
         int rowsUpdated = preparedStatement.executeUpdate();
         System.out.println("Updated " + rowsUpdated + " rows.");
     } catch (SQLException e) {
         e.printStackTrace();
     }
  • 如果返回值大于 0,表示有行被更新;如果返回值为 0,表示没有满足条件的行被更新。

4)删除语句处理

  • 与更新语句类似,执行删除语句后也会返回受影响的行数:
    • 使用StatementPreparedStatement执行删除语句,然后通过executeUpdate方法的返回值来判断有多少行被删除。
    • 例如:
String sql = "DELETE FROM your_table_name WHERE column1 =?";
     try {
         PreparedStatement preparedStatement = connection.prepareStatement(sql);
         preparedStatement.setString(1, "valueToDelete");
         int rowsDeleted = preparedStatement.executeUpdate();
         System.out.println("Deleted " + rowsDeleted + " rows.");
     } catch (SQLException e) {
         e.printStackTrace();
     }
  • 如果返回值大于 0,表示有行被删除;如果返回值为 0,表示没有满足条件的行被删除。

在处理这些 SQL 语句时,需要注意捕获SQLException异常,以确保在出现数据库错误时能够正确处理异常情况,并进行适当的错误处理和日志记录。

6、关闭连接

在完成数据库操作后,务必关闭连接以释放资源。

try {
       if (connection!= null) {
           connection.close();
       }
   } catch (SQLException e) {
       e.printStackTrace();
   }

二、数据库连接池

使用数据库连接池可以提高数据库连接的性能和效率,常见的数据库连接池有 HikariCP、C3P0、Druid 等。

以 Druid 为例,首先添加 Druid 的依赖到项目中,配置连接池参数,如数据库 URL、用户名、密码、最大连接数等,通过连接池获取数据库连接进行操作。

1、添加依赖

如果是 Maven 项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.12</version>
</dependency>

如果是 Gradle 项目,在build.gradle中添加:

implementation 'com.alibaba:druid:1.2.12'

2、基本使用步骤

1)配置数据源:

import com.alibaba.druid.pool.DruidDataSource;

   public class DruidExample {
       public static void main(String[] args) {
           // 创建 Druid 数据源对象
           DruidDataSource dataSource = new DruidDataSource();
           dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
           dataSource.setUsername("your_username");
           dataSource.setPassword("your_password");
           // 可以设置其他属性,如最大连接数、最小连接数等
           dataSource.setInitialSize(5);
           dataSource.setMaxActive(10);
       }
   }

2)获取数据库连接:

try {
       Connection connection = dataSource.getConnection();
       // 使用连接进行数据库操作
   } catch (SQLException e) {
       e.printStackTrace();
   }

3)关闭数据源(通常在应用程序关闭时执行)

dataSource.close();

3、监控功能

Druid 提供了强大的监控功能,可以通过以下方式访问监控页面:

  • 在应用程序中配置 Druid 的监控属性:
dataSource.setFilters("stat");
   dataSource.setEnable(true);

访问监控页面:默认情况下,可以通过http://localhost:8080/druid/index.html访问 Druid 的监控页面,前提是你的应用程序在端口 8080 运行。在监控页面中,可以查看连接池的状态、SQL 执行情况等信息。

4、结合 Spring 使用

如果在 Spring 项目中使用 Druid,可以通过以下步骤进行配置:

  • 在配置文件中配置数据源:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
       <property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
       <property name="username" value="your_username"/>
       <property name="password" value="your_password"/>
       <!-- 其他属性配置 -->
   </bean>

在代码中通过@Autowired注入数据源:

import javax.sql.DataSource;

   @Service
   public class YourService {
       private DataSource dataSource;

       @Autowired
       public YourService(DataSource dataSource) {
           this.dataSource = dataSource;
       }

       public void doSomethingWithDatabase() {
           try {
               Connection connection = dataSource.getConnection();
               // 进行数据库操作
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
   }

三、ORM框架

  • Hibernate:Hibernate 是一个强大的 ORM 框架,它允许将数据库表映射为 Java 对象,简化了数据库操作。通过配置 Hibernate 的配置文件和实体类的映射文件,可以轻松地连接到数据库并进行各种数据库操作。
  • MyBatis:MyBatis 也是一种常用的数据库访问框架,它通过 SQL 映射文件将 SQL 语句与 Java 方法进行映射。虽然 MyBatis 不是严格意义上的 ORM 框架,但它提供了一种方便的方式来操作数据库,同时也允许编写自定义 SQL 语句以满足复杂的业务需求。

这里以MyBatis举例:

1、添加依赖

如果是 Maven 项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
</dependency>

如果是 Gradle 项目,在build.gradle中添加:

implementation 'org.mybatis:mybatis:3.5.10'

同时,如果使用数据库,还需要添加相应数据库的驱动依赖。

2、创建实体类

例如,有一个用户实体类:

public class User {
    private int id;
    private String username;
    private String password;

    // 构造函数、getter 和 setter 方法
}

3、创建映射接口

import java.util.List;

public interface UserMapper {
    List<User> getAllUsers();
    User getUserById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

4、编写 SQL 映射文件

创建一个与映射接口同名的 XML 文件,例如UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="your.package.name.UserMapper">

    <select id="getAllUsers" resultType="User">
        SELECT * FROM users;
    </select>

    <select id="getUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id};
    </select>

    <insert id="insertUser" parameterType="User">
        INSERT INTO users (username, password) VALUES (#{username}, #{password});
    </insert>

    <update id="updateUser" parameterType="User">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id};
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id};
    </delete>

</mapper>

5、配置 MyBatis

创建mybatis-config.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
                <property name="username" value="your_username"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="your/package/name/UserMapper.xml"/>
    </mappers>
</configuration>

在代码中加载配置文件并使用 MyBatis:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisExample {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();

            // 获取映射接口的实现
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            // 查询所有用户
            List<User> users = userMapper.getAllUsers();
            for (User user : users) {
                System.out.println(user.getId() + ", " + user.getUsername() + ", " + user.getPassword());
            }

            // 插入用户
            User newUser = new User();
            newUser.setUsername("newUser");
            newUser.setPassword("newPassword");
            userMapper.insertUser(newUser);
            sqlSession.commit();

            // 根据 ID 查询用户
            User userById = userMapper.getUserById(1);
            System.out.println(userById.getId() + ", " + userById.getUsername() + ", " + userById.getPassword());

            // 更新用户
            User userToUpdate = userMapper.getUserById(2);
            userToUpdate.setUsername("updatedUser");
            userMapper.updateUser(userToUpdate);
            sqlSession.commit();

            // 删除用户
            userMapper.deleteUser(3);
            sqlSession.commit();

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

到此这篇关于Java中连接数据库方式详细步骤的文章就介绍到这了,更多相关Java连接数据库方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot配置文件读取pom文件信息方式

    springboot配置文件读取pom文件信息方式

    这篇文章主要介绍了springboot配置文件读取pom文件信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot实现多数据源配置的示例详解

    SpringBoot实现多数据源配置的示例详解

    这篇文章主要为大家详细介绍了SpringBoot实现多数据源配置的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • java代码规范之不合理命名与重复代码示例详解

    java代码规范之不合理命名与重复代码示例详解

    这篇文章主要为大家介绍了java代码规范之不合理命名与重复代码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot启动指定profile的多种方式

    SpringBoot启动指定profile的多种方式

    这篇文章主要介绍了SpringBoot启动指定profile的多种方式,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • springboot自动扫描添加的BeanDefinition源码实例详解

    springboot自动扫描添加的BeanDefinition源码实例详解

    这篇文章主要给大家介绍了关于springboot自动扫描添加的BeanDefinition的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • SpringBoot中Aware接口使用及原理解析

    SpringBoot中Aware接口使用及原理解析

    在Spring中存在一个Aware接口,实现该接口可以让我们的Bean获取到Spring容器中特定的资源,但该接口只是个标记接口,不存在任何方法,本文将给大家详细介绍一下SpringBoot中Aware接口使用及原理,需要的朋友可以参考下
    2023-08-08
  • Java 字符串转float运算 float转字符串的方法

    Java 字符串转float运算 float转字符串的方法

    今天小编就为大家分享一篇Java 字符串转float运算 float转字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例

    Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)

    这篇文章主要介绍了Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例,需要的朋友可以参考下
    2014-10-10
  • Java Thread多线程开发中Object类详细讲解

    Java Thread多线程开发中Object类详细讲解

    这篇文章主要介绍了Java Thread多线程开发中Object类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 使用IDEA如何拉取GitLab项目

    使用IDEA如何拉取GitLab项目

    使用IDEA拉取GitLab项目,首先需要组长提供的socket和账号密码登录内网的GitLab,打开IDEA,选择新建项目,选择Project from Version Control,然后在项目路径后面添加.git,以上步骤为个人操作经验,希望能为大家提供参考
    2024-10-10

最新评论