Spring Boot 实战:MyBatis 操作数据库(上)

Spring Boot 实战:MyBatis 操作数据库(上)
—JavaEE专栏—

Spring Boot 实战:MyBatis 操作数据库(上)

摘要

本文深度解析了 Spring Boot 环境下 MyBatis 的集成与应用。通过回顾传统 JDBC 的局限性,详细展示了 MyBatis 在日志配置、CRUD 操作、自增主键返回及多表查询中的实战用法。同时,文章深入探讨了 #{} ${} 的底层预编译差异及安全风险,并分享了企业级开发中的数据库命名规范与 Druid 连接池配置,助力开发者构建稳健的持久层架构。


文章目录

1. 为什么持久层开发需要 MyBatis?

1.1 传统 JDBC 的局限性

在 JDBC 编程中,开发者需要手动完成以下繁琐步骤:

  1. 创建数据库连接池 DataSource 并获取 Connection
  2. 编写带 ? 占位符的 SQL。
  3. 手动绑定每一个参数。
  4. 处理 ResultSet 结果集并手动映射到对象。
  5. finally 块中手动关闭资源。

这些重复性的“模板代码”不仅效率低下,且容易产生资源泄露风险。

1.2 MyBatis 的优势

MyBatis 是一款优秀的持久层框架(数据访问层 DAO),它通过以下特性解决了 JDBC 的痛点:

  • 简化交互:极大缩短了程序与数据库交互的代码量。
  • 解耦 SQL:支持将 SQL 从 Java 代码中分离到 XML 配置文件中。
  • 灵活映射:自动将 SQL 结果集关联到 Java 实体类。

2. 环境搭建与核心配置

2.1 依赖引入

pom.xml 中引入 MyBatis 起步依赖与 MySQL 驱动(注意使用自己合适的版本):

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

2.2 开启 SQL 执行日志

为了方便调试,建议在配置文件中开启日志打印,实时查看 SQL 生成逻辑:

mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 输出 SQL 到控制台

3. MyBatis 开发实战(双模式详解)

3.1 注解开发模式(适用于简单查询)

使用 @Mapper 接口定义数据访问逻辑:

@MapperpublicinterfaceUserInfoMapper{// 根据 ID 查询用户@Select("select * from user_info where id = #{id}")UserInfoqueryById(Integer id);// 插入并返回自增主键 ID@Insert("insert into user_info (username, password) values (#{username}, #{password})")@Options(useGeneratedKeys =true, keyProperty ="id")Integerinsert(UserInfo userInfo);}

3.2 XML 映射模式(适用于复杂业务)

对于多表查询或动态 SQL,XML 模式是最佳选择:

<mappernamespace="com.example.demo.mapper.UserInfoXMlMapper"><resultMapid="BaseMap"type="com.example.demo.model.UserInfo"><idcolumn="id"property="id"></id><resultcolumn="delete_flag"property="deleteFlag"></result></resultMap><selectid="queryAllUser"resultMap="BaseMap"> select * from user_info </select></mapper>

4. 核心原理:#{} 与 ${} 的本质区别

这是文章的技术深度所在,面试必考:

特性#{} (预编译 SQL)${} (即时 SQL)
工作原理使用 ? 占位,提前解析优化直接进行字符替换
安全性防止 SQL 注入存在 SQL 注入风险
引号处理自动拼接字符串引号不会自动拼接引号
性能高,编译一次后缓存执行计划较低,每次需重新解析

5. 多表关联查询进阶

MyBatis 不分单表或多表,核心在于通过 映射关系 把联表 SQL 的运行结果关联到实体类。

@Select("SELECT ta.id, ta.title, tb.username FROM articleinfo ta LEFT JOIN user_info tb ON ta.uid = tb.id WHERE ta.id = #{id}")ArticleInfoqueryUserByUid(Integer id);

6. 企业级规范与优化建议

6.1 数据库命名规范

  1. 蛇形命名:表名和字段名使用小写字母,单词间以下划线分割(如 user_info)。
  2. 开启驼峰转换:在 yml 中配置 map-underscore-to-camel-case: true,实现 abc_xyzabcXyz 的自动映射。

6.2 Druid 连接池配置

引入阿里巴巴开源的 Druid 连接池以获得更强大的监控功能:

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version></dependency>

7. 总结

MyBatis 通过简单的配置和灵活的 SQL 映射极大提升了 Java 开发效率。在实际开发中,应根据业务复杂度灵活选择注解或 XML 模式,并始终优先使用 #{} 以规避安全风险。


读者互动区

投票:你在开发中更倾向于使用哪种 MyBatis 模式?

  • A. 纯注解开发,简单快捷
  • B. 全 XML 映射,逻辑解耦
  • C. 混合使用,视复杂度而定

Read more

IDEA 中的 AI 编程插件怎么选?Copilot / 灵码 / TRAE 实际使用对比

IDEA 中的 AI 编程插件怎么选?Copilot / 灵码 / TRAE 实际使用对比

# 【不吹不黑】Java 开发者真实体验:IDEA 三大 AI 编程插件深度对比(Copilot / TRAE / 灵码) > 本文是一篇**技术交流与使用体验记录**,仅用于分享 Java 开发过程中使用 AI 插件的真实感受与效率提升方式,不涉及任何商业推广或广告行为。 *** ## 一、写在前面:为什么要写这篇文章 过去一年,大模型能力的跃迁,直接改变了开发者的工作方式。**AI 已经不再是“写 Demo 的玩具”,而是逐渐演变为 IDE 中的“第二大脑”** 。 本文的目的非常明确: *   记录一名 **Java 后端开发者** 在真实项目中使用 AI 插件的体验 *   对比不同插件在 **补全、对话、Agent 工作流** 等方面的差异 *   帮助开发者根据自身场景选择合适的工具,而不是盲目跟风 本文所有结论,

By Ne0inhk

01 - 大模型推理框架选型入门:Ollama、llama.cpp与vLLM全景对比

01 - 大模型推理框架选型入门:Ollama、llama.cpp与vLLM全景对比 本文是《大模型推理框架深度解析》系列的第一篇,适合刚接触LLM部署的开发者阅读。 写在前面 随着大语言模型(LLM)的广泛应用,如何将模型高效地部署到生产环境成为每个AI工程师必须面对的问题。目前市面上主流的推理框架有Ollama、llama.cpp和vLLM,但它们的技术定位、适用场景差异巨大。 很多开发者在选型时容易陷入误区: * 用Ollama部署高并发API服务,结果吞吐量上不去 * 用vLLM跑边缘设备,发现资源占用过高 * 混淆llama.cpp和vLLM的定位,不知道何时该用哪个 本文将从架构分层视角出发,帮你建立清晰的选型认知。 一、三大框架的技术定位 1.1 三层架构视角 如果把LLM推理技术栈比作一座大厦,三个框架分别位于不同的楼层: ┌─────────────────────────────────────────────────────────────┐ │ 应用层(第3层) │ │ ┌─────────────┐ │ │ │ Ollama │

By Ne0inhk

从零搭建AI运维系统,MCP AI Copilot实操全流程详解

第一章:MCP AI Copilot 架构概览 MCP AI Copilot 是一个面向企业级 DevOps 场景的智能辅助系统,旨在通过大模型驱动的方式提升开发、运维与安全响应的自动化水平。其架构设计强调模块化、可扩展性与实时交互能力,核心由感知层、决策引擎、执行总线与反馈闭环四大组件构成。 核心组件构成 * 感知层:负责从 CI/CD 流水线、日志系统、监控平台等数据源采集上下文信息 * 决策引擎:集成大语言模型与规则推理模块,对输入请求进行意图识别与策略生成 * 执行总线:协调调用底层工具链(如 Kubernetes API、Ansible、Terraform)完成具体操作 * 反馈闭环:记录执行结果并用于模型微调,形成持续优化的学习机制 通信协议配置示例 // config.go - MCP AI Copilot 服务间通信配置 type ServiceConfig

By Ne0inhk
基于STM32的普通GPIO模拟串口UART(代码开源)

基于STM32的普通GPIO模拟串口UART(代码开源)

前言:本文为手把手教学的基于 STM32 的普通 GPIO 模拟串口 UART 教程,使用 STM32F103ZET6 作为核心 MCU 进行操作。串口 UART 这项外设可以说是嵌入式工程师日常项目研发过程中百分百可能使用到的外设,但很多情况下 MCU 的硬件 UART 受限亦或是 GPIO 引脚被占用导致无法正常使用硬件 URAT 进行打印调试代码 。软件 UART 在这时就起到了至关重要的作用,作者将在本篇博客中提供本人日常使用且方便移植的软件 UART 代码。希望这篇博文能给读者朋友的工程项目给予些许帮助,Respect(代码开源)! 硬件与软件:STM32F103ZET6、CH340、WCH COMTransmit 项目结果图: 一、串口 UART 概述 1.1 什么是串口 UART(Universal Asynchronous

By Ne0inhk