后端篇——第四章 JDBC、MyBatis与SpringBoot配置

目录

[第一章: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 本章总结)

第三章:SpringBoot配置文件进阶

[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的两大好处:

  1. 防止SQL注入攻击

  2. 提升执行性能(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=密钥
📁 配置外部化

配置加载优先级(从高到低):

  1. 命令行参数

  2. 操作系统环境变量

  3. 外部配置文件(application-{profile}.yml)

  4. 内部配置文件(resources/application.yml)

  5. @Configuration类上的@PropertySource

外部配置文件示例:

java 复制代码
# 指定外部配置文件目录
java -jar app.jar --spring.config.location=file:/etc/app/config/

3.6 本章总结

✅ YAML核心优势:

  • 层次结构清晰,便于管理复杂配置

  • 支持多种数据类型,表达力强

  • 多环境配置简洁,易于维护

🔧 最佳实践建议:

  1. 环境分离:dev/test/prod环境配置分离

  2. 敏感信息:密码等敏感信息使用环境变量或加密

  3. 配置外部化:生产环境配置放在外部目录

  4. 版本控制:配置文件纳入版本管理(排除敏感信息)

⚠️ 注意事项:

  • 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集成好
🚀 性能优化策略
  1. 数据库层面

    • 合理设计索引

    • 避免N+1查询问题

    • 使用批处理减少交互

  2. 连接池层面

    • 根据并发量调整连接池大小

    • 设置合理的超时时间

    • 开启连接健康检查

  3. 框架层面

    • 合理使用MyBatis缓存

    • 避免不必要的字段查询

    • 使用分页减少数据量

📈 持续学习建议

🔍 深入学习方向
  1. 底层原理

    • 数据库事务原理

    • 连接池实现机制

    • SQL执行计划分析

  2. 高级特性

    • MyBatis插件开发

    • 动态数据源切换

    • 分布式事务处理

  3. 生态整合

    • SpringBoot自动配置原理

    • 监控与指标收集

    • 容器化部署配置

💡 实战提升建议
  1. 项目实战

    • 从单体应用到微服务

    • 数据库分库分表实践

    • 读写分离架构设计

  2. 性能调优

    • SQL语句优化实战

    • 连接池参数调优

    • 缓存策略设计

  3. 故障排查

    • 慢查询日志分析

    • 连接泄漏排查

    • 死锁问题处理

相关推荐
IvorySQL5 小时前
让源码安装不再困难:IvorySQL 一键安装脚本的实现细节解析
数据库·人工智能·postgresql·开源
云和数据.ChenGuang5 小时前
openGauss赋能新能源汽车智能制造——比亚迪MES系统数据库国产化升级案例
数据库·汽车·opengauss·gaussdb·数据库权限管理
xiaoyustudiowww5 小时前
Oracle 26AI 官方下载
oracle
洛小豆5 小时前
她问我:数据库还在存 Timestamp?我说:大人,时代变了
数据库·后端·mysql
邵伯5 小时前
为什么你的 SELECT 有时会阻塞?
数据库·后端
洛小豆5 小时前
代码修仙录 · 第1期:宗门大阵崩了?只因少了毫秒三魂!
数据库·后端·mysql
她说..5 小时前
Spring 核心工具类 AopUtils 超详细全解
java·后端·spring·springboot·spring aop
TH_15 小时前
33、IDEA无法获取最新分支
java·ide·intellij-idea
极客先躯6 小时前
Java Agent 技术全解析:从基础框架到落地实践
java·开发语言
yaso_zhang6 小时前
linux 下sudo运行程序,链接找不到问题处理
java·linux·服务器