首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JDBC 連接 MySQL 實現增刪改查:MVC 分層架構完整實戰

     編輯:Java 綜合教學

JDBC 連接 MySQL 實現增刪改查:MVC 分層架構完整實戰

JDBC 是 Java 操作關係數據庫的基石,雖然生產多用 MyBatis/Hibernate,但理解 JDBC 原理對排查 ORM 問題、優化 SQL、閱讀框架源碼至關重要。

開發環境

  • JDK 8+、Eclipse/IDEA
  • MySQL 5.7+、Navicat/DBeaver
  • MySQL Connector/J 驅動(maven 坐標:mysql:mysql-connector-java)

一、數據庫準備

CREATE DATABASE imooc;
USE imooc;

CREATE TABLE goddess (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    mobile VARCHAR(20),
    email VARCHAR(100),
    address VARCHAR(200)
);

INSERT INTO goddess (name, mobile, email, address) VALUES 
('林志玲', '13800001111', 'lin@example.com', '台北市信義區'),
('劉亦菲', '13900002222', 'liu@example.com', '北京市朝陽區');

二、工程結構(MVC 分層)

src/main/java
├── com.czgo.db        # 數據庫工具
├── com.czgo.model     # 實體類
├── com.czgo.dao       # 數據訪問層
└── com.czgo.action    # 業務/控制層

三、核心代碼實現

1. 實體類

public class Goddess implements Serializable {
    private Integer id;
    private String name, mobile, email, address;
    // Getter/Setter 省略
}

2. 數據庫工具類(單例連接)

public class DBUtil {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/imooc?useSSL=false&characterEncoding=UTF-8";
    private static final String USER = "root";
    private static final String PASS = "root";
    
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
    
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASS);
    }
    
    public static void close(Connection c, Statement s, ResultSet r) {
        try { if (r != null) r.close(); } catch (SQLException e) {}
        try { if (s != null) s.close(); } catch (SQLException e) {}
        try { if (c != null) c.close(); } catch (SQLException e) {}
    }
}

3. DAO 層:PreparedStatement 防注入

public class GoddessDao {
    // 查詢全部
    public List query() throws SQLException {
        String sql = "SELECT id,name,mobile,email,address FROM goddess";
        try (Connection c = DBUtil.getConnection();
             PreparedStatement ps = c.prepareStatement(sql);
             ResultSet rs = ps.executeQuery()) {
            List list = new ArrayList<>();
            while (rs.next()) {
                Goddess g = new Goddess();
                g.setId(rs.getInt("id"));
                g.setName(rs.getString("name"));
                g.setMobile(rs.getString("mobile"));
                g.setEmail(rs.getString("email"));
                g.setAddress(rs.getString("address"));
                list.add(g);
            }
            return list;
        }
    }
    
    // 按 ID 查詢
    public Goddess queryById(Integer id) throws SQLException { ... }
    
    // 新增
    public void add(Goddess g) throws SQLException {
        String sql = "INSERT INTO goddess(name,mobile,email,address) VALUES(?,?,?,?)";
        try (Connection c = DBUtil.getConnection();
             PreparedStatement ps = c.prepareStatement(sql)) {
            ps.setString(1, g.getName());
            ps.setString(2, g.getMobile());
            ps.setString(3, g.getEmail());
            ps.setString(4, g.getAddress());
            ps.executeUpdate();
        }
    }
    
    // 修改
    public void update(Goddess g) throws SQLException { ... }
    
    // 刪除
    public void delete(Integer id) throws SQLException { ... }
}

4. Action 業務層

public class GoddessAction {
    private GoddessDao dao = new GoddessDao();
    
    public void add(Goddess g) throws Exception { dao.add(g); }
    public Goddess get(Integer id) throws SQLException { return dao.queryById(id); }
    public void edit(Goddess g) throws Exception { dao.update(g); }
    public void del(Integer id) throws SQLException { dao.delete(id); }
    public List query() throws Exception { return dao.query(); }
    
    // 測試入口
    public static void main(String[] args) throws Exception {
        GoddessAction action = new GoddessAction();
        action.query().forEach(g -> 
            System.out.println(g.getName() + " | " + g.getMobile() + " | " + g.getEmail()));
    }
}

四、運行結果驗證

林志玲 | 13800001111 | lin@example.com
劉亦菲 | 13900002222 | liu@example.com

五、進階優化方向

  1. 連接池:HikariCP/Druid 替換單例連接
  2. 事務管理:Connection.setAutoCommit(false) + try-catch-finally commit/rollback
  3. DAO 接口化:定義 GoddessDao 介面,便於測試與多實現切換
  4. ResultSet 映射封裝:提取 RowMapper 介面,減少樣板代碼
  5. 分頁查詢:LIMIT offset, size + 總數查詢
  6. 防注入:堅持 PreparedStatement,拒絕字符串拼接 SQL

六、常見坑點避雷

  • 驅動類名:MySQL 8.0+ 用 com.mysql.cj.jdbc.Driver
  • URL 參數:useSSL=false、serverTimezone=Asia/Shanghai、characterEncoding=UTF-8
  • 資源關閉:JDK 7+ try-with-resources 自動關閉,避免洩漏
  • 異常處理:DAO 拋出 SQLException,Action 統一轉換為業務異常

總結

本文通過完整的 MVC 分層實現 JDBC CRUD,展示了從數據庫建表、實體映射、DAO 封裝到業務調用的標準流程。掌握 JDBC 核心 API(Connection、PreparedStatement、ResultSet)與資源管理模式,是進階學習 MyBatis、Spring Data JPA 等 ORM 框架的紮實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved