SSMSSM
首页
  • 我的博客
  • 我的Github
首页
  • 我的博客
  • 我的Github
  • 1-Java反射技术
  • 1-动态代理模式
  • 1-设计模式简介
  • 1-责任链模式
  • 1-观察者模式
  • 1-工厂模式与抽象工厂模式
  • 1-建造者模式
  • 2-Web开发历史
  • 2-Mybatis核心组件
  • 2-Mybatis的反射
  • 2-Mybatis配置(mybatis-config.xml)
  • 2-映射器(XxxMapper.xml)
  • 2-JDBC and ORM
  • 3-Java修饰符
  • 3-Bean
  • JDBC
    • ①.为什么需要 JDBC?
    • ②.JDBC 能做什么?
    • ③.JDBC 的核心组成
    • ④.一个完整 JDBC 示例
    • ⑤.JDBC 的事务管理
    • ⑥.JDBC 的缺点
    • ⑦.JDBC 与 MyBatis / Spring 的关系
    • ⑧.总结
  • ORM
    • ①.ORM诞生背景
    • ②.ORM 做了什么?
    • ③.常见 ORM 框架
    • ④.MyBatis is ORM?
    • ⑤.全自动 vs 半自动
    • ⑥.ORM 的优点
    • ⑦.ORM 的缺点
    • ⑧.ORM应用场景
    • ⑨.总结

JDBC ORM

JDBC

JDBC 是 Java Database Connectivity 的缩写,是 Java 访问关系型数据库的标准 API。

JDBC = Java 程序与数据库之间的“通用翻译官 / 规范接口”

①.为什么需要 JDBC?

不同数据库(MySQL / Oracle / PostgreSQL)协议不同、语法细节不同, 如果 Java 直接对接数据库会非常麻烦。

JDBC 的作用就是:

  • Java 只认 JDBC 接口
  • 各数据库厂商 实现 JDBC 驱动
  • 程序 不用关心底层数据库差异
Java 程序
   ↓ JDBC API
数据库驱动(MySQL / Oracle / PG)
   ↓
数据库

②.JDBC 能做什么?

JDBC 允许 Java 程序:

  • 连接数据库
  • 执行 SQL(CRUD)
  • 调用存储过程
  • 管理事务
  • 处理结果集

③.JDBC 的核心组成

(1).Driver(驱动)

  • 数据库厂商提供
  • 负责和数据库“说话”
Class.forName("com.mysql.cj.jdbc.Driver");

(JDBC 4 以后一般自动加载)


(2).Connection(连接)

代表一次数据库连接:

Connection conn = DriverManager.getConnection(
    url, username, password
);

(3).Statement / PreparedStatement / CallableStatement

Statement(不推荐)

Statement stmt = conn.createStatement();
stmt.executeQuery("SELECT * FROM t_user");

❌ SQL 注入风险


PreparedStatement(最常用)

PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM t_user WHERE id = ?"
);
ps.setLong(1, 1L);

✔ 防 SQL 注入 ✔ 性能更好(预编译)


CallableStatement(存储过程)

CallableStatement cs =
    conn.prepareCall("{call get_user_count(?)}");

(4).ResultSet(结果集)

ResultSet rs = ps.executeQuery();
while (rs.next()) {
    rs.getLong("id");
    rs.getString("username");
}

④.一个完整 JDBC 示例

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/test",
        "root", "123456"
    );

    ps = conn.prepareStatement(
        "SELECT id, username FROM t_user WHERE id = ?"
    );
    ps.setLong(1, 1L);

    rs = ps.executeQuery();

    while (rs.next()) {
        System.out.println(rs.getString("username"));
    }
} finally {
    rs.close();
    ps.close();
    conn.close();
}

代码冗长、易出错、资源管理麻烦


⑤.JDBC 的事务管理

conn.setAutoCommit(false);

ps.executeUpdate(...);
ps.executeUpdate(...);

conn.commit();

出错:

conn.rollback();

⑥.JDBC 的缺点

问题说明
SQL 写死可读性差
模板代码多try-catch + close
手动映射ResultSet → 对象
难维护大量重复代码

ORM 框架就是为了解决这些问题


⑦.JDBC 与 MyBatis / Spring 的关系

JDBC vs MyBatis

JDBCMyBatis
低层 API封装 JDBC
手写 SQL + 映射自动映射
手动事务可交给 Spring
易出错更安全

MyBatis 底层依然是 JDBC


Spring JDBC / MyBatis / JPA 的层级

Spring Transaction
       ↓
MyBatis / JPA / JdbcTemplate
       ↓
JDBC
       ↓
数据库驱动

⑧.总结

JDBC 是 Java 访问数据库的底层标准 API, MyBatis、JPA、Spring JDBC 本质上都是对 JDBC 的封装。


ORM

ORM 是 Object-Relational Mapping(对象关系映射) 的缩写。

ORM = 把“数据库的表”映射成“程序里的对象”, 让你用操作对象的方式来操作数据库。


①.ORM诞生背景

面向对象世界 和 关系型数据库世界 天然不一致。

面向对象(Java)关系型数据库(MySQL)
类(Class)表(Table)
对象(Object)行(Row)
属性(Field)列(Column)
继承、多态没有
引用关系外键

ORM 的作用就是: 在这两个世界之间搭一座桥


②.ORM 做了什么?

1️⃣ 表 ↔ 类

t_user
class User {
    Long id;
    String username;
}

2️⃣ 行 ↔ 对象

id | username
1  | Tom
User user = new User(1, "Tom");

3️⃣ CRUD ↔ 对象操作

没有 ORM(JDBC)

ResultSet rs = ps.executeQuery();
User u = new User();
u.setId(rs.getLong("id"));

有 ORM

User u = userMapper.getById(1L);

③.常见 ORM 框架

(Java里的)

框架特点
Hibernate全自动 ORM
JPAORM 规范
MyBatis半自动 ORM
MyBatis-PlusMyBatis 增强

④.MyBatis is ORM?

Mybatis是“半自动 ORM”

能力MyBatis
对象映射✅
SQL 自动生成❌(你写)
关系映射✅(resultMap)
缓存✅
灵活性⭐⭐⭐⭐⭐

你控制 SQL,MyBatis 负责映射


⑤.全自动 vs 半自动

对比项Hibernate / JPAMyBatis
SQL 控制❌✅
学习成本高低
复杂 SQL痛苦友好
性能可控一般高
适合场景标准 CRUD复杂业务

⑥.ORM 的优点

✔ 减少样板代码 ✔ 提高开发效率 ✔ 面向对象思维 ✔ 更易维护


⑦.ORM 的缺点

❌ 抽象层过厚 ❌ 复杂 SQL 难写 ❌ 性能不可控(不当使用) ❌ 不适合极端性能场景


⑧.ORM应用场景

适合

  • 业务系统
  • CRUD 为主
  • 中小型项目

不适合

  • 超复杂报表
  • 极致性能场景
  • 数据库强绑定逻辑

⑨.总结

ORM 是让程序员“用对象思维操作数据库”的技术, 本质是对象世界与关系世界的桥梁。

最近更新: 2026/1/5 08:03
Contributors: fireworks99
Prev
2-映射器(XxxMapper.xml)
Next
3-Java修饰符