目录
[第一章:JDBC - 数据库操作的基石](#第一章:JDBC - 数据库操作的基石)
[1.1 什么是JDBC?](#1.1 什么是JDBC?)
[💡 核心概念理解](#💡 核心概念理解)
[1.2 快速上手:用户登录功能实战](#1.2 快速上手:用户登录功能实战)
[🛠️ 环境准备](#🛠️ 环境准备)
[💻 代码实现:查询用户数据](#💻 代码实现:查询用户数据)
[1.3 核心技术点解析](#1.3 核心技术点解析)
[🔐 预编译SQL的优势](#🔐 预编译SQL的优势)
[📊 SQL注入原理与防护](#📊 SQL注入原理与防护)
[🔄 JDBC执行不同类型SQL](#🔄 JDBC执行不同类型SQL)
[1.4 本章总结](#1.4 本章总结)
[第二章:MyBatis - 企业级持久层框架](#第二章:MyBatis - 企业级持久层框架)
[2.1 为什么需要MyBatis?](#2.1 为什么需要MyBatis?)
[2.2 MyBatis快速入门](#2.2 MyBatis快速入门)
[🚀 5步完成MyBatis整合](#🚀 5步完成MyBatis整合)
[⚙️ 实用配置技巧](#⚙️ 实用配置技巧)
[🗂️ MyBatis核心组件](#🗂️ MyBatis核心组件)
[2.3 MyBatis增删改查实战](#2.3 MyBatis增删改查实战)
[📝 完整的CRUD示例](#📝 完整的CRUD示例)
[🔑 参数传递的两种方式](#🔑 参数传递的两种方式)
[🔍 #{}和{}的区别](#{}和{}的区别)
[2.4 XML映射配置(复杂SQL场景)](#2.4 XML映射配置(复杂SQL场景))
[📁 XML配置规范](#📁 XML配置规范)
[2.5 数据库连接池技术](#2.5 数据库连接池技术)
[🏊 连接池工作原理](#🏊 连接池工作原理)
[🔧 主流连接池对比](#🔧 主流连接池对比)
[2.6 本章总结](#2.6 本章总结)
[3.1 YAML vs Properties](#3.1 YAML vs Properties)
[📊 格式对比分析](#📊 格式对比分析)
[3.2 YAML语法精要](#3.2 YAML语法精要)
[📋 基本规则](#📋 基本规则)
[🎯 常用数据结构](#🎯 常用数据结构)
[3.3 多环境配置策略](#3.3 多环境配置策略)
[🌳 环境分离配置](#🌳 环境分离配置)
[🔧 激活环境的方式](#🔧 激活环境的方式)
[3.4 配置属性注入](#3.4 配置属性注入)
[🎯 多种注入方式](#🎯 多种注入方式)
[3.5 高级配置技巧](#3.5 高级配置技巧)
[🔐 敏感信息加密](#🔐 敏感信息加密)
[📁 配置外部化](#📁 配置外部化)
[3.6 本章总结](#3.6 本章总结)
[🎯 学习路线总结](#🎯 学习路线总结)
[💼 技术选型指南](#💼 技术选型指南)
[🚀 性能优化策略](#🚀 性能优化策略)
[📈 持续学习建议](#📈 持续学习建议)
[🔍 深入学习方向](#🔍 深入学习方向)
[💡 实战提升建议](#💡 实战提升建议)
本文系统介绍了Java数据库开发的技术体系,涵盖JDBC基础、MyBatis框架和SpringBoot配置三大核心内容。首先详细解析JDBC的工作原理、预编译SQL的优势及SQL注入防护措施;然后深入讲解MyBatis框架的使用方法,包括注解开发、XML配置和连接池技术;最后重点阐述SpringBoot的YAML配置语法、多环境配置策略和属性注入方式。全文通过代码示例演示各技术要点的实际应用,并提供了企业级开发的技术选型建议和性能优化策略,帮助开发者构建完整的Java数据库开发知识体系。
第一章:JDBC - 数据库操作的基石
1.1 什么是JDBC?
JDBC(Java DataBase Connectivity)是使用Java语言操作关系型数据库的一套API,它是所有Java数据库操作技术的底层基础。
💡 核心概念理解
-
JDBC本质:一套操作所有关系型数据库的规范接口
-
驱动作用:各个数据库厂商实现的JDBC接口
-
开发模式:面向接口编程,真正执行的是驱动jar包中的实现类
1.2 快速上手:用户登录功能实战
🛠️ 环境准备
1. 创建数据库表
sql
CREATE TABLE user(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
username VARCHAR(20) COMMENT '用户名',
password VARCHAR(32) COMMENT '密码',
name VARCHAR(10) COMMENT '姓名',
age TINYINT UNSIGNED COMMENT '年龄'
) COMMENT '用户表';
INSERT INTO user VALUES
(1, 'daqiao', '123456', '大乔', 22),
(2, 'xiaoqiao', '123456', '小乔', 18);
2. Maven依赖配置
sql
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
💻 代码实现:查询用户数据
sql
@ParameterizedTest
@CsvSource({"daqiao,123456"})
public void testJdbc(String username, String password) throws Exception {
// 1. 建立数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web",
"root",
"1234"
);
// 2. 创建预编译SQL语句
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 3. 设置参数(防止SQL注入)
pstmt.setString(1, username);
pstmt.setString(2, password);
// 4. 执行查询
ResultSet rs = pstmt.executeQuery();
// 5. 处理结果集
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("用户名: " + rs.getString("username"));
System.out.println("姓名: " + rs.getString("name"));
System.out.println("年龄: " + rs.getInt("age"));
}
// 6. 释放资源
rs.close();
pstmt.close();
conn.close();
}
1.3 核心技术点解析
🔐 预编译SQL的优势
静态SQL vs 预编译SQL
java
// ❌ 不推荐:静态SQL(容易SQL注入)
String sql = "SELECT * FROM user WHERE username = '" + username + "'";
// ✅ 推荐:预编译SQL(安全高效)
String sql = "SELECT * FROM user WHERE username = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
预编译SQL的两大好处:
-
防止SQL注入攻击
-
提升执行性能(SQL语句只需编译一次)
📊 SQL注入原理与防护
攻击示例:
java
-- 正常登录
SELECT * FROM user WHERE username = 'admin' AND password = '123456'
-- SQL注入攻击
SELECT * FROM user WHERE username = 'admin' AND password = '' OR '1' = '1'
防护措施:
-
始终使用PreparedStatement
-
输入验证和过滤
-
最小权限原则
🔄 JDBC执行不同类型SQL
java
// DQL查询语句
ResultSet rs = pstmt.executeQuery(); // 返回结果集
// DML增删改语句
int rows = pstmt.executeUpdate(); // 返回影响行数
1.4 本章总结
✅ 掌握要点:
-
JDBC的核心原理和工作流程
-
Connection、Statement、ResultSet三大核心对象
-
预编译SQL的使用和优势
-
资源正确关闭的重要性
⚠️ 注意事项:
-
数据库连接是有限资源,必须及时关闭
-
生产环境一定要使用连接池
-
SQL参数必须使用预编译方式
第二章:MyBatis - 企业级持久层框架
2.1 为什么需要MyBatis?
JDBC虽然基础,但存在以下问题:
-
代码冗余,重复性工作多
-
手动处理结果集映射
-
需要手动管理连接资源
-
SQL语句与Java代码混杂
MyBatis应运而生! 它是一款优秀的持久层框架,极大简化了JDBC开发。
图片位置:MyBatis与JDBC代码量对比图
2.2 MyBatis快速入门
🚀 5步完成MyBatis整合
第1步:创建SpringBoot项目
- 选择依赖:MyBatis Framework + MySQL Driver + Lombok
第2步:准备数据实体
java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
}
第3步:配置数据库连接
java
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
第4步:编写Mapper接口
java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> findAll();
}
第5步:编写单元测试
java
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testFindAll() {
List<User> users = userMapper.findAll();
users.forEach(System.out::println);
}
}
⚙️ 实用配置技巧
1. 开启SQL日志
java
// properties
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2. IDEA智能提示配置
图片位置:IDEA配置数据库连接截图
🗂️ MyBatis核心组件
2.3 MyBatis增删改查实战
📝 完整的CRUD示例
java
@Mapper
public interface UserMapper {
// 查询所有用户
@Select("SELECT * FROM user")
List<User> findAll();
// 根据ID查询
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Integer id);
// 新增用户
@Insert("INSERT INTO user(username,password,name,age) " +
"VALUES(#{username},#{password},#{name},#{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insert(User user);
// 更新用户
@Update("UPDATE user SET username=#{username}, name=#{name}, " +
"age=#{age} WHERE id=#{id}")
Integer update(User user);
// 删除用户
@Delete("DELETE FROM user WHERE id = #{id}")
Integer deleteById(Integer id);
// 条件查询
@Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}")
User findByUsernameAndPassword(
@Param("username") String username,
@Param("password") String password
);
}
🔑 参数传递的两种方式
java
// 方式1:使用@Param注解明确参数名
@Select("SELECT * FROM user WHERE username = #{username}")
User findByUsername(@Param("username") String name);
// 方式2:直接使用形参名(需要编译器支持)
@Select("SELECT * FROM user WHERE username = #{username}")
User findByUsername(String username);
🔍 #{}和${}的区别
| 特性 | #{} | ${} |
|---|---|---|
| 预编译 | ✅ 是 | ❌ 否 |
| 防SQL注入 | ✅ 是 | ❌ 否 |
| 参数类型 | 任意类型 | 只能字符串 |
| 使用场景 | 参数值传递 | SQL片段插入 |
2.4 XML映射配置(复杂SQL场景)
当SQL语句比较复杂时,推荐使用XML配置方式:
UserMapper.xml
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- 复杂查询示例 -->
<select id="findByConditions" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="minAge != null">
AND age >= #{minAge}
</if>
<if test="maxAge != null">
AND age <= #{maxAge}
</if>
ORDER BY id DESC
</select>
</mapper>
📁 XML配置规范
-
同包同名原则(Mapper接口与XML文件)
-
namespace对应Mapper接口全限定名
-
SQL的id对应接口方法名
-
resultType对应返回类型
2.5 数据库连接池技术
🏊 连接池工作原理
🔧 主流连接池对比
| 特性 | HikariCP | Druid |
|---|---|---|
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 监控功能 | 基础 | 强大 |
| SQL防注入 | 支持 | 支持 |
| SpringBoot默认 | ✅ 是 | ❌ 否 |
Druid连接池配置示例:
XML
// yaml配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/web
username: root
password: 1234
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
filters: stat,wall # 开启统计和防火墙功能
2.6 本章总结
✅ MyBatis核心优势:
-
SQL与代码分离,易于维护
-
自动结果集映射,减少重复代码
-
动态SQL支持,灵活应对复杂查询
-
插件机制,便于功能扩展
🎯 开发建议:
-
简单CRUD使用注解方式
-
复杂SQL使用XML配置
-
生产环境使用Druid连接池
-
开启SQL日志便于调试
📈 性能优化点:
-
合理配置连接池参数
-
使用二级缓存提升查询性能
-
批量操作减少数据库交互次数
第三章:SpringBoot配置文件进阶
3.1 YAML vs Properties
SpringBoot支持两种配置文件格式,YAML因其结构清晰而更受青睐:
application.properties(传统格式)
XML
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
application.yml(推荐格式)
XML
spring:
datasource:
url: jdbc:mysql://localhost:3306/web
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
📊 格式对比分析
| 维度 | Properties | YAML |
|---|---|---|
| 可读性 | 一般 | 优秀 |
| 层次结构 | 不直观 | 清晰 |
| 数据类型支持 | 有限 | 丰富 |
| 多环境配置 | 繁琐 | 简洁 |
3.2 YAML语法精要
📋 基本规则
-
使用缩进表示层级关系(空格,非Tab)
-
缩进空格数不重要,同级对齐即可
-
大小写敏感
-
#表示注释,到行尾结束 -
字符串可以不加引号,特殊字符需要加
🎯 常用数据结构
1. 对象/Map配置
XML
user:
name: 张三
age: 25
address:
city: 北京
street: 中关村
# 多行字符串使用|
description: |
这是第一行
这是第二行
第三行
2. 数组/List配置
XML
# 多行数组写法
hobbies:
- 篮球
- 游泳
- 阅读
# 行内数组写法
hobbies: [篮球, 游泳, 阅读]
# 复杂对象数组
users:
- name: 张三
age: 25
- name: 李四
age: 30
3. 特殊值处理
XML
# 布尔值
enabled: true
disabled: false
# 数字
port: 8080
price: 99.99
# 特殊字符串(以0开头、包含特殊字符)
phone: '01234567890' # 不加引号会被解析为八进制
message: 'Hello:World' # 包含特殊字符需要引号
3.3 多环境配置策略
🌳 环境分离配置
1. 主配置文件(application.yml)
XML
# 公共配置
spring:
profiles:
active: @profileActive@ # 使用Maven变量动态指定
# 日志配置(所有环境共享)
logging:
level:
root: INFO
com.example: DEBUG
2. 环境特定配置
XML
# application-dev.yml(开发环境)
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
redis:
host: localhost
port: 6379
XML
# application-prod.yml(生产环境)
server:
port: 80
spring:
datasource:
url: jdbc:mysql://192.168.1.100:3306/prod_db
username: prod_user
password: ${DB_PASSWORD:default_pass} # 使用环境变量
redis:
host: redis-cluster
port: 6379
XML
# 生产环境特有配置
management:
endpoints:
web:
exposure:
include: health,info
🔧 激活环境的方式
方式1:配置文件指定
XML
spring:
profiles:
active: dev
方式2:启动参数指定
XML
java -jar app.jar --spring.profiles.active=prod
方式3:环境变量指定
XML
export SPRING_PROFILES_ACTIVE=test
3.4 配置属性注入
🎯 多种注入方式
1. @Value注解注入
java
@Component
public class AppConfig {
@Value("${server.port}")
private int serverPort;
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${app.feature.enabled:false}") // 默认值
private boolean featureEnabled;
}
2. @ConfigurationProperties批量注入
java
@Configuration
@ConfigurationProperties(prefix = "app.datasource")
@Data
public class DataSourceProperties {
private String url;
private String username;
private String password;
private int maxPoolSize = 20;
private int minIdle = 5;
// 嵌套对象
private Pool pool = new Pool();
@Data
public static class Pool {
private int timeout = 30000;
private String validationQuery = "SELECT 1";
}
}
对应YAML配置:
java
app:
datasource:
url: jdbc:mysql://localhost:3306/test
username: test_user
password: test_pass
max-pool-size: 30
pool:
timeout: 60000
validation-query: "SELECT 1 FROM DUAL"
3.5 高级配置技巧
🔐 敏感信息加密
1. 使用Jasypt加密
java
spring:
datasource:
password: ENC(加密后的密码字符串)
2. 启动时解密
java
java -jar app.jar --jasypt.encryptor.password=密钥
📁 配置外部化
配置加载优先级(从高到低):
-
命令行参数
-
操作系统环境变量
-
外部配置文件(application-{profile}.yml)
-
内部配置文件(resources/application.yml)
-
@Configuration类上的@PropertySource
外部配置文件示例:
java
# 指定外部配置文件目录
java -jar app.jar --spring.config.location=file:/etc/app/config/
3.6 本章总结
✅ YAML核心优势:
-
层次结构清晰,便于管理复杂配置
-
支持多种数据类型,表达力强
-
多环境配置简洁,易于维护
🔧 最佳实践建议:
-
环境分离:dev/test/prod环境配置分离
-
敏感信息:密码等敏感信息使用环境变量或加密
-
配置外部化:生产环境配置放在外部目录
-
版本控制:配置文件纳入版本管理(排除敏感信息)
⚠️ 注意事项:
-
YAML缩进必须使用空格,不能用Tab
-
字符串包含特殊字符时需要引号
-
数值以0开头需要引号包裹
-
配置属性名使用kebab-case(短横线分隔)
🎯 总结
技术演进路径
java
JDBC(基础)
↓
MyBatis注解版(快速开发)
↓
MyBatis XML配置(复杂SQL)
↓
MyBatisPlus(增强功能)
↓
Spring Data JPA(面向对象)
企业级开发建议
💼 技术选型指南
| 场景 | 推荐技术 | 理由 |
|---|---|---|
| 快速原型开发 | MyBatis注解 | 开发速度快,代码简洁 |
| 复杂业务逻辑 | MyBatis XML | SQL与代码分离,易于维护 |
| 单表CRUD为主 | MyBatisPlus | 代码生成,减少重复工作 |
| 微服务架构 | Spring Data JPA | 面向对象,与SpringCloud集成好 |
🚀 性能优化策略
-
数据库层面
-
合理设计索引
-
避免N+1查询问题
-
使用批处理减少交互
-
-
连接池层面
-
根据并发量调整连接池大小
-
设置合理的超时时间
-
开启连接健康检查
-
-
框架层面
-
合理使用MyBatis缓存
-
避免不必要的字段查询
-
使用分页减少数据量
-
📈 持续学习建议
🔍 深入学习方向
-
底层原理
-
数据库事务原理
-
连接池实现机制
-
SQL执行计划分析
-
-
高级特性
-
MyBatis插件开发
-
动态数据源切换
-
分布式事务处理
-
-
生态整合
-
SpringBoot自动配置原理
-
监控与指标收集
-
容器化部署配置
-
💡 实战提升建议
-
项目实战
-
从单体应用到微服务
-
数据库分库分表实践
-
读写分离架构设计
-
-
性能调优
-
SQL语句优化实战
-
连接池参数调优
-
缓存策略设计
-
-
故障排查
-
慢查询日志分析
-
连接泄漏排查
-
死锁问题处理
-