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

Claude Sonnet 4.6:大语言模型架构演进与前沿性能评估

Claude Sonnet 4.6:大语言模型架构演进与前沿性能评估

由于官网对中国的限制,国内无法使用官网,但是使用AIGCBAR镜像站可以注册使用Claude 4.6,且比使用官网要划算,无法律风险。 1 引言:大语言模型发展的新纪元 人工智能领域正在经历一场深刻的变革,大语言模型(Large Language Model, LLM)作为这场变革的核心驱动力,正在以前所未有的速度演进。从2022年ChatGPT的横空出世,到2025-2026年各大厂商推出的新一代模型,我们见证了人工智能从"能用"到"好用"再到"专业级"的跨越式发展。Anthropic公司于2026年2月发布的Claude Sonnet 4.6,作为Claude系列的最新成员,不仅代表了当前大语言模型技术的前沿水平,更在效率与性能的平衡上树立了新的标杆。 大语言模型的发展历程可以追溯到2017年Google提出的Transformer架构,该架构通过自注意力机制(Self-Attention Mechanism)彻底改变了自然语言处理的范式。Transformer的核心创新在于其并行化处理能力和长距离依赖建模能力,这为后续大规模预训练模型的诞生奠定了理论基础。从GPT系列的

By Ne0inhk
告别复杂 SQL 性能瓶颈!金仓智能下推技术的实战解析

告别复杂 SQL 性能瓶颈!金仓智能下推技术的实战解析

你是否遇到过这样的场景:一个看似逻辑清晰的复杂SQL,在测试环境小数据量下运行飞快,一到生产环境海量数据场景就直接“卡死”;查看执行计划后发现,子查询无差别扫描全量数据,生成了远超预期的巨大中间结果集,后续的JOIN、聚合、排序操作全部陷入性能泥潭,CPU跑满、内存溢出、IO居高不下成为常态? 如果你正被此类复杂SQL的性能问题困扰,那么金仓数据库(KingbaseES)的「基于代价的连接条件下推」技术,将成为破解这一难题的关键方案。它并非简单的规则化优化,而是融合语义安全判定与智能代价评估的现代化查询优化能力,更是应对企业级复杂业务查询的“性能终结者”,让开发者和DBA彻底告别SQL性能调优的焦虑。 一、为什么你的复杂SQL会“爆内存”? 在金融、政务、零售、制造等企业级复杂业务系统中,为了保证业务逻辑的可读性和可维护性,开发人员通常会采用子查询/CTE封装复杂计算+外层JOIN过滤的SQL编写模式,将去重、聚合、窗口计算等操作封装在子查询中,外层仅做关联和最终的条件过滤。这种写法在业务层面无可厚非,却在执行层面埋下了严重的性能隐患。 1.1 典型复杂SQL的“性能陷阱”

By Ne0inhk

Clawdbot部署实操:解决‘gateway token missing’授权问题的完整步骤

Clawdbot部署实操:解决‘gateway token missing’授权问题的完整步骤 1. Clawdbot是什么:一个开箱即用的AI代理网关平台 Clawdbot 是一个统一的 AI 代理网关与管理平台,它的核心目标很实在——让开发者不用反复折腾模型对接、权限配置和会话管理,就能快速把自主AI代理跑起来、管起来、用起来。 它不是另一个大模型推理框架,而是一个“中间层操作系统”:一边连着本地或远程的AI模型(比如你熟悉的 qwen3:32b),另一边面向终端用户,提供聊天界面、会话追踪、模型路由、插件扩展等一整套能力。你可以把它理解成AI世界的“路由器+控制台+仪表盘”三合一工具。 特别适合这些场景: * 你想在内网或私有GPU上部署多个模型,但不想每个都单独写API服务; * 你需要给非技术人员(比如产品、运营)提供一个能直接对话的界面,而不是让他们敲curl命令; * 你正在做AI Agent原型验证,需要快速切换模型、调试提示词、查看token消耗; * 你希望所有AI调用都有统一日志、

By Ne0inhk
SpringBoot之统一异常处理

SpringBoot之统一异常处理

目录 统一异常处理 代码示例  运行结果  问题 结合源码了解问题源头  优点 统一异常处理 统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的, @ControllerAdvice 表⽰控制器通知类, @ExceptionHandler 是异常处理器,两个结合表 ⽰当出现异常的时候执⾏某个通知,也就是执⾏某个方法事件。 代码示例  ExceptionAdvice  接⼝返回为数据时, 需要加 @ResponseBody 注解!!! import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler;

By Ne0inhk