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

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 驱动(注意使用自己合适的版本):

xml 复制代码
<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>


AI写代码xml
1234567891011

2.2 开启 SQL 执行日志

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

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


AI写代码yaml
1234

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

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

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

less 复制代码
@Mapper
public interface UserInfoMapper {
    // 根据 ID 查询用户
    @Select("select * from user_info where id = #{id}")
    UserInfo queryById(Integer id);

    // 插入并返回自增主键 ID
    @Insert("insert into user_info (username, password) values (#{username}, #{password})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    Integer insert(UserInfo userInfo);
}


AI写代码java
运行
123456789101112

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

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

ini 复制代码
<mapper namespace="com.example.demo.mapper.UserInfoXMlMapper">
    <resultMap id="BaseMap" type="com.example.demo.model.UserInfo">
        <id column="id" property="id"></id>
        <result column="delete_flag" property="deleteFlag"></result>
    </resultMap>

    <select id="queryAllUser" resultMap="BaseMap">
        select * from user_info
    </select>
</mapper>


AI写代码xml
1234567891011

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

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

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

5. 多表关联查询进阶

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

ini 复制代码
@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}")
ArticleInfo queryUserByUid(Integer id);


AI写代码java
运行
123

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

6.1 数据库命名规范

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

6.2 Druid 连接池配置

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

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.21</version>
</dependency>


AI写代码xml
123456

7. 总结

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

相关推荐
Java编程爱好者2 小时前
从 Spring Boot 到 Tomcat:很多人其实分不清“框架”和“服务器”
后端
Apifox2 小时前
Apifox 2 月更新|MCP Client 调试体验优化、测试套件持续升级、支持公用测试数据、测试报告优化
前端·后端·测试
神奇小汤圆2 小时前
SpringBoot实现微信登录,SoEasy!
后端
逍遥德2 小时前
Maven教程.02-基础-pom.xml 使用标签大全
java·后端·maven·软件构建
神奇小汤圆3 小时前
为什么Java里面,Service层不直接返回Result对象?
后端
Charlie_lll3 小时前
Redis脑裂问题处理——基于min-replicas-to-write配置
redis·后端
得物技术3 小时前
Sentinel Java客户端限流原理解析|得物技术
java·后端·架构
NGINX开源社区4 小时前
使用 Microsoft Entra ID 配置 NGINX Plus 以实现 SAML SSO
后端·python·flask
cipher4 小时前
crawl4ai:AI时代的数据采集利器——从入门到实战
后端·爬虫·python