百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文
java 使用Jdbc连接mysql数据库以及其存在的问题

java 使用Jdbc连接mysql数据库以及其存在的问题

  • 网站名称:java 使用Jdbc连接mysql数据库以及其存在的问题
  • 网站分类:技术文章
  • 收录时间:2025-08-03 01:42
  • 网站地址:

进入网站

“java 使用Jdbc连接mysql数据库以及其存在的问题” 网站介绍

写在前面

jdbc 是 java 中自带的连接数据库的方案。 后续衍生的很多ORM框架, 都是为了解决jdbc存在的问题。 下边是jdbc 连接数据库的一个例子。

连接mysql数据库

整体测试maven项目

jdbctest.zip

建立mysql表

/*
 Navicat Premium Data Transfer

 Source Server         : clean
 Source Server Type    : MySQL
 Source Server Version : 80032
 Source Host           : 127.0.0.1:3306
 Source Schema         : clean

 Target Server Type    : MySQL
 Target Server Version : 80032
 File Encoding         : 65001

 Date: 27/05/2025 21:26:21
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for myuser
-- ----------------------------
DROP TABLE IF EXISTS `myuser`;
CREATE TABLE `myuser`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


封装jdbcUtils工具类

package com.clean;

import java.sql.*;

public class JdbcUtils {
    // 数据库配置(需根据实际修改)
    private static final String URL = "jdbc:mysql://localhost:3306/clean?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    // 加载驱动(JDBC 4.0+ 可自动加载,此代码可省略)
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("找不到MySQL驱动", e);
        }
    }

    // 获取数据库连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    // 关闭资源
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

User实体类

package com.clean;

public class User {
    private int id;
    private String name;

    // 必须有无参构造函数
    public User() {}

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    // Getters and Setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "'}";
    }
}

测试类

package com.clean;

import java.sql.*;

public class UserDao {
    public User getUserById(int userId) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            // 1. 获取连接
            conn = JdbcUtils.getConnection();

            // 2. 创建预处理语句
            String sql = "SELECT id, name FROM myuser WHERE id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, userId);

            // 3. 执行查询
            rs = pstmt.executeQuery();

            // 4. 处理结果集
            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 5. 关闭资源
            JdbcUtils.close(conn, pstmt, rs);
        }
        return user;
    }

    // 测试代码
    public static void main(String[] args) {
        UserDao dao = new UserDao();
        User user = dao.getUserById(1);
        System.out.println(user != null ? user : "未找到用户");
    }
}


存在问题

数据库配置信息存在硬编码问题

可以使用配置文件存储这些信息

频繁创建释放数据库连接

数据库连接池解决

sql语句,设置参数,获取结果集参数均存在硬编码问题

使用配置文件解决

手动封装返回结果集,较为繁琐

使用反射,内省解决

写在最后

正是由于 jdbc 存在上述问题, 我们自己可以写一个简单的 框架,来解决这些问题。 这个框架,可以看做是 mybatis 的雏形。