Java之JDBC与数据库编程!

举报
喵手 发表于 2025/09/24 21:30:31 2025/09/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

JDBC(Java Database Connectivity)是Java用于访问和操作关系型数据库的API。通过JDBC,Java应用程序能够与数据库进行连接、执行SQL查询、更新数据,并处理结果集。本文将介绍JDBC的基本概念、驱动程序、数据库连接池、SQL查询与事务管理等内容,并探讨Spring JDBC与MyBatis的集成。


1. JDBC简介与驱动程序

JDBC简介

JDBC是Java提供的标准接口,允许Java程序与各种关系型数据库进行交互。JDBC通过提供一组接口和类,允许开发者以数据库独立的方式进行数据库的连接、查询、更新等操作。

JDBC的核心概念包括:

  • Connection:数据库连接,用于与数据库建立通信。
  • Statement:SQL语句的执行接口。
  • ResultSet:存储查询结果的对象。
  • SQLException:处理SQL错误的异常。

JDBC驱动程序

JDBC驱动程序是Java程序与数据库之间通信的桥梁。JDBC驱动程序根据数据库类型提供不同的实现。常见的JDBC驱动程序有四种类型:

  1. 类型1(JDBC-ODBC桥接驱动程序):通过ODBC与数据库连接,速度较慢,不推荐使用。
  2. 类型2(本地API驱动程序):通过数据库的本地API与数据库通信。
  3. 类型3(网络协议驱动程序):通过中间层的服务与数据库通信,适合跨平台应用。
  4. 类型4(原生协议驱动程序):直接使用数据库的原生协议与数据库通信,性能最好,常用的驱动程序大多数属于这种类型。

常见的数据库驱动:

  • MySQL:com.mysql.cj.jdbc.Driver
  • PostgreSQL:org.postgresql.Driver
  • Oracle:oracle.jdbc.driver.OracleDriver

示例:

String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";

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

2. 数据库连接池(BasicDataSource、C3P0、Druid)

数据库连接池简介

数据库连接池是为了提高数据库访问性能而设计的技术。每次创建数据库连接都需要消耗大量资源,因此使用连接池可以复用连接,减少资源消耗,提高效率。

常见的连接池框架有:

  • BasicDataSource:Apache Commons DBCP提供的连接池实现。
  • C3P0:一个功能强大的数据库连接池实现,支持自动回收和连接测试等功能。
  • Druid:阿里巴巴开发的数据库连接池,性能和功能都非常强大,支持监控和配置优化。

使用示例

BasicDataSource

import org.apache.commons.dbcp2.BasicDataSource;

BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");

Connection connection = dataSource.getConnection();

C3P0

import com.mchange.v2.c3p0.ComboPooledDataSource;

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUser("root");
dataSource.setPassword("password");

Connection connection = dataSource.getConnection();

Druid

import com.alibaba.druid.pool.DruidDataSource;

DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");

Connection connection = dataSource.getConnection();

3. SQL查询与PreparedStatement

SQL查询

使用JDBC执行SQL查询时,通常使用Statement对象执行静态的SQL语句。

示例:

Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

while (resultSet.next()) {
    String username = resultSet.getString("username");
    System.out.println(username);
}

PreparedStatement

PreparedStatementStatement的一个扩展,适用于执行带有参数的SQL语句。PreparedStatement不仅能够提高执行效率,还能够防止SQL注入攻击。

示例:

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "john_doe");

ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
    String username = resultSet.getString("username");
    System.out.println(username);
}

使用PreparedStatement执行更新操作

String sql = "UPDATE users SET password = ? WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "new_password");
preparedStatement.setString(2, "john_doe");

int rowsAffected = preparedStatement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);

4. 事务管理与事务隔离

事务管理

事务是数据库中的一个重要概念,用于确保一组操作要么全部成功,要么全部失败。JDBC提供了事务管理功能,通过Connection对象的setAutoCommit()方法来控制事务的提交与回滚。

  • 开启事务:通过setAutoCommit(false)禁用自动提交,手动管理事务。
  • 提交事务:使用commit()方法提交事务。
  • 回滚事务:使用rollback()方法回滚事务。

示例:

connection.setAutoCommit(false);

try {
    Statement statement = connection.createStatement();
    statement.executeUpdate("UPDATE account SET balance = balance - 100 WHERE account_id = 1");
    statement.executeUpdate("UPDATE account SET balance = balance + 100 WHERE account_id = 2");

    connection.commit(); // 提交事务
} catch (SQLException e) {
    connection.rollback(); // 发生错误时回滚事务
    e.printStackTrace();
} finally {
    connection.setAutoCommit(true); // 恢复自动提交
}

事务隔离

事务隔离级别决定了事务之间的可见性,JDBC支持四种事务隔离级别:

  1. READ_UNCOMMITTED:最低级别,允许读取未提交的数据(脏读)。
  2. READ_COMMITTED:读取已提交的数据,防止脏读。
  3. REPEATABLE_READ:确保在事务期间多次读取的数据一致,防止不可重复读。
  4. SERIALIZABLE:最高级别,完全隔离,防止幻读。

设置事务隔离级别:

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

5. Spring JDBC与MyBatis的集成

Spring JDBC

Spring JDBC是Spring框架提供的一套简化JDBC操作的API,目的是减少开发者手动管理JDBC资源的工作量。它通过JdbcTemplate类封装了JDBC的各种操作,使得数据库操作更加简洁和高效。

Spring JDBC的基本使用:

import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;

public class UserDao {
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public void addUser(String username, String password) {
        String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
        jdbcTemplate.update(sql, username, password);
    }
}

MyBatis

MyBatis是一个优秀的持久层框架,通过XML或注解方式将SQL语句与Java对象进行映射。与JDBC相比,MyBatis简化了SQL查询的执行和结果的映射,提高了开发效率。

配置MyBatis

  1. MyBatis配置文件:配置数据源、事务管理等。
  2. 映射器文件:通过XML或注解来配置SQL语句和Java对象的映射。
  3. Mapper接口:通过接口定义数据库操作方法。

MyBatis集成示例:

<!-- MyBatis配置文件 -->
<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/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

Mapper接口:

public interface UserMapper {
    @Select("SELECT * FROM users WHERE username = #{username}")
    User findUserByUsername(String username);
}

Spring与MyBatis集成:
Spring和MyBatis集成可以通过Spring的SqlSessionFactoryJdbcTemplate进行事务管理和数据库操作。


总结

JDBC与数据库编程是Java开发中不可或缺的技能。掌握JDBC的基本操作、数据库连接池的使用、SQL查询与事务管理是高效开发的基础。此外,Spring JDBC和MyBatis的集成使得开发者能够更加轻松地处理数据库交互,减少了直接使用JDBC的繁琐过程。理解并应用这些技术,可以提高数据库操作的效率与代码的可维护性。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。