破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

2025-08-01 20:50

本文主要是介绍破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数...

一、什么是 MyBatis

通过 MyBatis中文网站我们了解到 “MyBatis 是一款优秀的持久层框架 ” ,用于简化JDBC的开发,而此处 “ 持久层 ” :指的是持久化操作的层,通常指数据访问层(Dao),用来操作数据库

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

换句话说,MyBatis 是更简单的完成程序与数据库交互的框架,即更简单方便地操作和读取数据库工具

二、 MyBatis 入门

2.1、创建项目

创建 Spring Boot 项目,并导入 MyBatis 启动依赖和 mysql 驱动包

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

创建用户表,并创建对对应的实体类 UserInfo

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

数据库规范:全部小写,单词之间用下划线分割( _ )

Java规范:  属性使用小驼峰来表示

注意:我们创建表和实体类中,要把数据库字段和Java属性一一对应起来 

2.2、配置数据库连接字符串

在 application.yml 配置文件中配置如下:

2.3、入门操作

MyBatis 采用 “ 接口+XML/注解 ” 的方式实现数据访问层,实现了接口与实现的分离,其核心机制为:在运行时为接口生成动态代理对象,即自动创建它的实现类,能够轻松创建mock实现进行单元测试

MyBatis 在运行编程时通过 ​​动态代理(Dynamic Proxy)​​ 机制自动生成了接口的实现类

我们接下来查询所有用户

@Mapper
public interface UserInfoMapper {
    @Select("SELECT * from user_info")
    List<UserInfo> selectAll();
}

@Mapper注解标识该接口为 MyBatis 的 Mapper 接口

• 运行时框架会自动生成接口代理对象,并交由 Spring IOC 容器管理

@Select 注解:用于标记查询方法,定义对应 SQL 查询语句

2.4、单元测试

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

测试类已在 src/test 目录下自动生成,可直接用于测试

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
   private UserInfoMapper userInfoMapper;
    @Test
    void selectAll() {
        List<UserInfo> userInfos = userInfoMapper.selectAll();
        System.ou编程t.println(userInfos);
    }
}

在该测试类上添加了 @SpringBootTest 注解后,运行时将自动加载 Spring 运行环境方法加上@Test 注解后,该方法即可单独运行;通过@Autowired 注解注入待测试的类后,即可开始进行测试

运行结果:成功查询了所有用户的信息

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

三、MyBatis基础操作(增删改查)

3.1、配置日志

在MyBatis中我们可以借助日志,查看SQL语句的执行,传递的参数以及执行的结果,在application.yml 配置文件中配置(properties文件配置查阅前篇)

mybatis:
  configuration: # 配置打印 MyBatis⽇志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

配置后可以看到

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

3.2、参数传递

查询 ID 为 3 的用户

@Mapper
public interface UserInfoMapper {
    @Select("select username,password,age,gender,phone from user_info where id = #{id}")
    UserInfo selectById(Integer id);
}

当 Mapper 接口方法的形参仅有一个普通类型参数时,# {...} 中的属性名称可以任意指定,但是如果形参有多个普通类型的参数时,属性名称必须对应(见3.3例中代码)

生成测试用例:#{id}

@Test
    void selectById() {
        UserInfo userInfo = userInfoMapper.selectById(3);
        System.out.println(userInfo);
    }

查询结果: 

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

可通过@Param 注解设置参数别名。若使用 @Param 设置别名,#{...} 中的属性名必须与 @Param 指定的别名保持一致

    @Select("select username,password,age,gender,phone from user_info where id = #{userID}")
    UserInfo selectById(@Param("userID") Integer id);

⚠️注意:

    @Select("SELECT * from user_info")
    List<UserInfo> selectAll();
    @Select("select username,password,age,gender,phone from user_info where id = #{userID}")
    UserInfo selectById(@Param("userID") Integer id);
    @Select("select username,password,age,gender,phone from user_info where age = #{age}")
    List<UserInfo> selectAllByAge(Integer age);

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

3.3、增(Insert)

目标SQL语句:

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

插入另一条数据,并将SQL中的常量替换成动态的参数:

@Insert("insert into user_info (username, password, age, gender, phone) values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
    Integer insert(UserInfo userInfo);
 @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("楚子航");
        userInfo.setPassword("123456");
        userInfo.setGender(1);
        userInfo.setAge(19);
        userInfo.setPhone("122222222222");
        int result=userInfoMapper.insert(userInfo);
        System.out.println("影响的行数"+result);
    }

在 MyBatis 中,insert() 方法返回的结果和在MySQL中返回的结果是一样的,都是返回影响的行数,观察测试结果:

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

返回主键

我们想在插入之后,拿到刚刚插入的数据ID 

@Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into user_info (username, password, age, gender, phone) values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
    Integer insert(UserInfo userInfo);
    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("路鸣泽");
        userInfo.setPassword("123456");
        userInfo.setGender(1);
        userInfo.setAge(16);
        userInfo.setPhone("11111111111");
        int result=userInfoMapper.insert(userInfo);
        System.out.println("影响的行数"+result+" id:"+userInfo.getId());
    }

useGeneratedKeys:启用后,MyBatis 将调用 JDBC 的 getGeneratedKeys 方法来获取数据库自动生成的主键(如 MySQL 和 SQL Server 中的自增字段),默认值为 false
keyProperty:指定用于标识对象的唯一属性,MyBatis 会通过 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素为其赋值

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

注意:

设置 useGeneratedKeys=true 后,方法返回值仍是受影响的行数,自增 ID 会被自动赋给 keyProperty 指定的属性

3.4、删(delete)

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南将上述

SQL中的常量替换为动态参数

@Delete("delete from user_info where id = #{id}")
    void deleteById(Integer id);
 @Test
    void deleteById() {
        userInfoMapper.deleteById(9);
    }

观察运行结果发现Id为 9 的数据已被删除

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

3.5、改(update)

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

将上述SQL中的常量替换为动态参数

    @Update("update user_info set username = #{username} where id = #{id}")
    void updateById(UserInfo userInfo);
    @Test
    void updateById() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(5);
        userInfo.setUsername("喜羊羊");
        userInfoMapper.updateById(userInfo);
    }

观察运行结果发现Id为 5 的数据名称已经更改为喜羊羊了

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

3.6、查(select)

我们再次查询所有信息

 @Select("select id,username,password,age,gender,phone,delete_flag,create_time,update_time from user_info")
    List<UserInfo> selectById();
    @Test
    www.chinasem.cnvoid selectById() {
        List<UserInfo> userInfoList = userInfoMapper.selectById();
        System.out.println(userInfoList);
    }

从运行结果可以看出,SQL语句中查询了 delete_flag、create_time 和 update_time 字段,但这些字段并未被赋值

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

为什么呢? 这时我们会想到是不是 Java 属性和数据库字段对应的名称不一致造成的原因呢?

    @Select("select id,username,password,age,gender,phone," +
            "delete_flag as deleteflag,create_time as createtime,update_time as updatetime " +
            "from user_info")
    List<UserInfo> selectById();

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

运行结果:

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

MyBatis在自动映射查询结果时,会按以下步骤处理:

  1. 获取查询结果返回的列名
  2. 在目标Java类中查找名称匹配的属性(不区分大小写)
  3. 当列名与属性名匹配时(例如数据库列"ID"对应Java属性"id"),自动将列值映射到对应属性

解决方法

3.6.1、起别名

如上猜测,将数据库字段名称通过起别名的方法与Java属性名称保持一致,另外我们从下方代码可见SQL语句可以用 + 连接 

    @Select("select id,username,password,age,gender,phone," +
            "delete_flag as deleteflag,create_time as createtime,update_time as updatetime " +
            "from user_info")
    List<UserInfo> selectById();

3.6.2、结果映射

@Results 注解用于建立数据库字段与 Java 对象属性之间的映射关系,它包含一个由 @Result 元素组成的数组,其中每个元素通过 column 指定数据库列名,property 指定对应的 Java 属性名,从而实现二者之间的映射关联

    @Results({
            @Result(column = "delete_flag",property = "deleteFlag"),
       aPoIA     @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    @Select("select id,username,password,age,gender,phone,delete_flag,create_time,update_time from user_info")
    List<UserInfo> selectResult();

现在的问题是:我们上述代码实现了众多增删改查方法,每个方法进行结果映射都需要字段复制操作,如果其他方法涉及不同的数据库字段,来回修改会非常不便。在Aokey看来,这并不比使用别名便利

针对这种情况,我们可以通过 Id 属性为 Results 定义别名,然后使用 @ResultMap 注解来复用其他已经定义的 ResultMap 配置

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

3.6.3、 配置驼峰自动转换

在 application.yml 配置文件中配置如下:

mybatis:
  configuration: 
    map-underscore-to-camel-case: true #配置驼峰⾃动转换
    @Select("select id,username,password,age,gender,phone,delete_flag,cjsreate_time,update_time from user_info where age = #{age}")
    List<UserInfo> selectAllByAge(Integer age);

查询结果:

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

到此这篇关于破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南的文章就介绍到这了,更多相关mybatis springboot使用内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155553

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav