数据库与 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
基本流程
- 加载驱动:Class.forName("com.mysql.cj.jdbc.Driver")
- 获取连接:DriverManager.getConnection(url, user, password)
- 创建 Statement / PreparedStatement
- 执行 SQL:executeQuery() / executeUpdate()
- 处理结果集 ResultSet
- 关闭资源(先 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 嵌套结果