Skip to content

数据库与 JDBC

从原生 SQL 到 JDBC 操作,再到 MyBatis 框架化。


SQL 基础

DDL — 数据定义语言

CREATE TABLE / ALTER TABLE / DROP TABLE 数据类型:int, varchar, datetime, decimal 约束:PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, DEFAULT, CHECK

DML — 数据操作语言

INSERT INTO ... VALUES ... UPDATE ... SET ... WHERE ... DELETE FROM ... WHERE ...

DQL — 数据查询语言

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ... 聚合函数:COUNT, SUM, AVG, MAX, MIN 子查询、EXISTS、IN

多表查询

内连接 (INNER JOIN)

SELECT * FROM A INNER JOIN B ON A.id = B.a_id 只返回两表中匹配的行

左连接 (LEFT JOIN)

SELECT * FROM A LEFT JOIN B ON A.id = B.a_id 返回左表全部行 + 右表匹配行(不匹配则 NULL)

右连接 (RIGHT JOIN)

SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id 返回右表全部行 + 左表匹配行(不匹配则 NULL)

全连接 (FULL JOIN)

返回两表全部行,不匹配的部分为 NULL

JDBC

基本流程

  1. 加载驱动:Class.forName("com.mysql.cj.jdbc.Driver")
  2. 获取连接:DriverManager.getConnection(url, user, password)
  3. 创建 Statement / PreparedStatement
  4. 执行 SQL:executeQuery() / executeUpdate()
  5. 处理结果集 ResultSet
  6. 关闭资源(先 ResultSet,再 Statement,最后 Connection)

PreparedStatement 优势

预编译 SQL,防止 SQL 注入 参数用 ? 占位符,通过 setXxx() 设置 性能更好(SQL 缓存复用)

批处理

addBatch():添加 SQL 到批处理队列 executeBatch():批量执行 减少网络往返次数,提升批量操作性能

事务管理

connection.setAutoCommit(false) connection.commit() / connection.rollback() ACID:原子性、一致性、隔离性、持久性 隔离级别:READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE

MyBatis

#{} 与 ${} 的区别

#{}:预编译占位符,防 SQL 注入,推荐使用 ${}:字符串拼接,有 SQL 注入风险,仅用于动态表名/列名

核心配置

typeAliases:为 Java 类型设置别名,简化 XML 配置 resultMap:自定义结果映射(字段名与属性名不一致时) settings:全局配置(缓存、懒加载等)

动态 SQL

if / when / choose / otherwise where / set(自动处理 AND/OR 和逗号) foreach(遍历集合,用于 IN 查询) sql / include(SQL 片段复用)

关联查询

association:一对一映射 collection:一对多映射 嵌套查询 vs 嵌套结果

AI 应用开发 / Agent 开发实习生