专业的JAVA编程教程与资源

网站首页 > java教程 正文

java 数据库基础与JDBC(java数据库连接jdbc用到哪种设计模式)

temp10 2025-05-09 21:27:19 java教程 1 ℃ 0 评论

本文意在说明java最基础的数据库连接是如何做的,无需了解深入,后续可以使用ORM框架(如mybatis)进行,更方便、快速,想要做数据库深入了解请系统学习数据库理论知识,也可持续关注我,后续会介绍数据库系统性整理的知识

一、SQL基础回顾

SQL(Structured Query Language) 是操作关系型数据库的标准语言,核心操作包括:

java 数据库基础与JDBC(java数据库连接jdbc用到哪种设计模式)

  • DDL(数据定义语言): 定义表结构(CREATE, ALTER, DROP)
  • DML(数据操作语言): 增删改数据(INSERT, DELETE, UPDATE)
  • DQL(数据查询语言): 查询数据(SELECT)
  • DCL(数据控制语言): 权限管理(GRANT, REVOKE)

常用操作(增删改查)示例

-- 创建表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

-- 插入数据
INSERT INTO user (name, age) VALUES ("张三", 25);

-- 查询数据
SELECT * FROM user WHERE age > 20;

-- 更新数据
UPDATE user SET age = 30 WHERE id = 1;

-- 删除数据
DELETE FROM user WHERE id = 1;

二、JDBC核心概念

JDBC(Java Database Connectivity) 是Java操作数据库的标准API,允许通过统一的接口访问多种数据库(如MySQL、Oracle)。其核心流程为:
连接数据库 → 执行SQL → 处理结果 → 释放资源


1. JDBC核心组件

类/接口

作用

DriverManager

管理数据库驱动,获取数据库连接(Connection)

Connection

表示与数据库的连接,可创建Statement或PreparedStatement

Statement

执行静态SQL语句(有SQL注入风险)

PreparedStatement

预编译SQL语句,防止SQL注入,支持参数化查询

ResultSet

封装查询结果集,支持遍历和读取数据

SQLException

数据库操作异常


2. JDBC开发步骤(以MySQL为例)

步骤1:添加驱动依赖

  • Maven项目中添加MySQL驱动:
<dependency>
  <groupId>mysql</groupId> 
	<artifactId>mysql-connector-java</artifactId> 
	<version>8.0.30</version>
</dependency>

步骤2:注册驱动并连接数据库

// JDBC URL格式:jdbc:mysql://主机名:端口/数据库名?参数
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    System.out.println("数据库连接成功!");
} catch (SQLException e) {
    e.printStackTrace();
}

注意:JDBC 4.0+ 支持自动加载驱动(无需Class.forName("com.mysql.cj.jdbc.Driver"))。


步骤3:执行SQL语句

  • 使用Statement(适用于简单场景):
try (Statement stmt = conn.createStatement()) { 
  String sql = "INSERT INTO user (name, age) VALUES ('李四', 28)";
  int rows = stmt.executeUpdate(sql); // 返回受影响的行数 
  System.out.println("插入成功,影响行数:" + rows);
}
  • 使用PreparedStatement(推荐,防止SQL注入):
String sql = "INSERT INTO user (name, age) VALUES (?, ?)"; 
try (PreparedStatement pstmt = conn.prepareStatement(sql)) { 
  pstmt.setString(1, "王五"); // 参数索引从1开始 
  pstmt.setInt(2, 30);
  int rows = pstmt.executeUpdate();
}

步骤4:处理查询结果(ResultSet)

String sql = "SELECT id, name, age FROM user WHERE age > ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 20);
    ResultSet rs = pstmt.executeQuery();
    
    while (rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
        int age = rs.getInt("age");
        System.out.println("ID: " + id + ", 姓名: " + name + ", 年龄: " + age);
    }
}

3. 事务管理

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    conn.setAutoCommit(false); // 关闭自动提交
    
    try {
        // 执行多个SQL操作
        updateUserAge(conn, 1, 30);
        insertUser(conn, "赵六", 25);
        
        conn.commit(); // 提交事务
    } catch (SQLException e) {
        conn.rollback(); // 回滚事务
        e.printStackTrace();
    }
}

三、JDBC高级应用

1. 数据库连接池

为什么需要连接池
频繁创建和关闭连接消耗资源,连接池预先创建连接,复用已有连接,提升性能。

常用连接池

  • HikariCP(高性能,Spring Boot默认)
  • Druid(阿里开源,支持监控)

HikariCP示例

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123456");

HikariDataSource dataSource = new HikariDataSource(config);
try (Connection conn = dataSource.getConnection()) {
    // 使用连接操作数据库
}

2. 使用工具类封装JDBC

public class JdbcUtils {
    private static DataSource dataSource; // 从连接池获取
    
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3. 使用模板模式简化查询

public class JdbcTemplate {
    public static <T> T query(String sql, ResultSetHandler<T> handler, Object... params) {
        try (Connection conn = JdbcUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }
            
            ResultSet rs = pstmt.executeQuery();
            return handler.handle(rs);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

// 使用示例:查询单个用户
User user = JdbcTemplate.query(
    "SELECT * FROM user WHERE id = ?",
    rs -> {
        if (rs.next()) {
            return new User(rs.getInt("id"), rs.getString("name"));
        }
        return null;
    },
    1
);

四、常见问题与优化

1. SQL注入问题

  • 问题:拼接SQL时,恶意参数可能破坏SQL结构(如' OR 1=1 --)。
  • 解决:使用PreparedStatement预编译SQL,避免拼接。

2. 性能优化

  • 使用连接池(如HikariCP)减少连接创建开销。
  • 批量操作提升效率:
try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO user (name) VALUES (?)")) { 
  for (int i = 0; i < 1000; i++) { 
    pstmt.setString(1, "user" + i); 
    pstmt.addBatch(); // 添加到批处理 
  } 
  pstmt.executeBatch(); // 执行批量插入 
}

3. 资源释放

  • 使用try-with-resources自动关闭资源(JDK7+支持)。
  • 确保Connection、Statement、ResultSet在finally块中关闭。

五、JDBC与ORM框架对比

特性

JDBC

ORM框架(如MyBatis、Hibernate)

开发效率

手动编写SQL和映射代码,效率低

自动映射结果集,提供高级API,效率高

可维护性

SQL嵌入代码中,维护困难

SQL与代码分离,易于维护

性能

直接操作数据库,性能高

可能因反射和代理带来性能损耗(可优化)

适用场景

简单查询或需要极致性能的场景

复杂业务逻辑,快速开发场景


总结

  • JDBC是Java操作数据库的基石,掌握其核心API和事务管理是后端开发必备技能。
  • 连接池PreparedStatement是优化性能和安全性的关键。
  • ORM框架(如MyBatis)在复杂场景中更高效,但JDBC仍是理解底层原理的重要工具。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表