Java 中连接数据库方式详解

目录

一、JDBC(Java Database Connectivity)

1、添加依赖

2、连接数据库

3、建立连接

4、执行 SQL 语句

5、处理结果集

1)查询语句处理

2)插入语句处理

3)更新语句处理

4)删除语句处理

6、关闭连接

二、数据库连接池

1、添加依赖

2、基本使用步骤

1)配置数据源:

2)获取数据库连接:

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

3、监控功能

4、结合 Spring 使用

三、ORM框架

1、添加依赖

2、创建实体类

3、创建映射接口

4、编写 SQL 映射文件

5、配置 MyBatis


一、JDBC(Java Database Connectivity)

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

  1. 导入数据库驱动:首先需要将特定数据库的 JDBC 驱动添加到项目的依赖中。
  2. 加载驱动:使用Class.forName()方法加载数据库驱动。例如,Class.forName("com.mysql.cj.jdbc.Driver");
  3. 建立连接:使用DriverManager.getConnection()方法建立与数据库的连接。例如,String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";Connection connection = DriverManager.getConnection(url, username, password);
  4. 执行 SQL 语句:通过StatementPreparedStatement对象执行 SQL 查询、插入、更新或删除等操作。
  5. 处理结果集:如果是查询操作,需要处理返回的ResultSet结果集。
  6. 关闭连接:在操作完成后,务必关闭连接、语句和结果集以释放资源。
1、添加依赖
  1. 确定数据库类型:首先确定你要连接的数据库类型,比如 MySQL、Oracle、SQL Server 等。不同的数据库需要不同的 JDBC 驱动。
  2. 添加依赖:将相应数据库的 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)查询语句处理
  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 开始。


 

  1. 获取特定类型的数据:
    • 根据数据库中列的数据类型,选择合适的ResultSet方法来获取值。
    • 例如,如果列是整数类型,可以使用getInt;如果是字符串类型,可以使用getString;如果是浮点数类型,可以使用getDouble等。
    • 同时,可以传入列名或者列索引作为参数。例如:
int id = resultSet.getInt(1); // 通过列索引获取第一列的值(整数类型)
     String name = resultSet.getString("name"); // 通过列名获取名为"name"的列的值(字符串类型)


 

2)插入语句处理
  1. 执行插入语句后,通常可以获取插入行的自增主键值(如果数据库表有自增主键):
    • 使用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)更新语句处理
  1. 执行更新语句后,通常会返回受影响的行数:
    • 使用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)删除语句处理
  1. 与更新语句类似,执行删除语句后也会返回受影响的行数:
    • 使用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 提供了强大的监控功能,可以通过以下方式访问监控页面:

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

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

4、结合 Spring 使用

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

  1. 在配置文件中配置数据源:
<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();
        }
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值