当前位置: 首页 > news >正文

MyBatis-Plus环境搭建和单表的curd操作

目录

  • 1 环境搭建
    • 1.1 创建工程并引入依赖
    • 1.2 编写启动类
    • 1.3 编写实体类与 Mapper 接口
    • 1.4 编写配置文件
    • 1.5 配置日志输出
    • 1.6 测试是否整合成功
  • 2 基本 CRUD 操作
    • 2.1 插入操作
    • 2.2 删除操作
      • 2.2.1 根据 id 删除
      • 2.2.2 根据 id 批量删除
      • 2.2.3 根据 Map 条件删除
    • 2.3 修改操作
      • 2.3.1 根据 id 修改
      • 2.3.2 根据条件修改(QueryWrapper)
      • 2.3.3 根据条件修改(UpdateWrapper)
    • 2.4 查询操作
      • 2.4.1 根据 id 查询
      • 2.4.2 根据 id 批量查询
      • 2.4.3 根据 Map 条件查询
      • 2.4.4 查询所有数据

1 环境搭建

1.1 创建工程并引入依赖

创建 SpringBoot 工程,在pom.xml中引入以下依赖:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/></parent><properties><java.version>1.8</java.version></properties><dependencies><!-- SpringBoot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot 核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- SpringBoot 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- MyBatis-Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

1.2 编写启动类

@SpringBootApplication@MapperScan(basePackages="com.xq.mapper")publicclassApp{publicstaticvoidmain(String[]args){SpringApplication.run(App.class,args);}}

@MapperScan用于指定 Mapper 接口所在的包路径,启动时会自动扫描并注册到 Spring 容器中。

1.3 编写实体类与 Mapper 接口

实体类 User:

@Data@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateLongid;privateStringname;privateIntegerage;privateStringemail;}

Mapper 接口:

publicinterfaceUserMapperextendsBaseMapper<User>{}

继承BaseMapper<User>后,即可直接使用 MyBatis-Plus 内置的 CRUD 方法,无需编写 XML 映射文件。

1.4 编写配置文件

application.yml中配置数据源:

spring:datasource:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=falseusername:rootpassword:your_password

注意事项:

驱动类driver-class-name

  • Spring Boot 2.0(内置 JDBC 5 驱动):使用com.mysql.jdbc.Driver
  • Spring Boot 2.1 及以上(内置 JDBC 8 驱动):使用com.mysql.cj.jdbc.Driver

使用错误的驱动类不会导致程序报错,但会在控制台输出 WARN 信息。

连接地址url

  • MySQL 5.7:jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
  • MySQL 8.0:jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

MySQL 8.0 必须指定serverTimezone,否则会报错:
java.sql.SQLException: The server time zone value 'xxx' is unrecognized or represents more

1.5 配置日志输出

MyBatis-Plus 默认不会在控制台打印 SQL 语句。添加以下配置可以开启日志,方便调试时观察实际执行的 SQL:

mybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl

1.6 测试是否整合成功

@SpringBootTestpublicclassMybatisPlusTest{@AutowiredprivateUserMapperuserMapper;@TestpublicvoidtestSelectList(){// selectList(null) 表示无条件查询所有记录userMapper.selectList(null).forEach(System.out::println);}}

运行测试方法,如果控制台能正常输出数据库中的记录,说明 SpringBoot 整合 MyBatis-Plus 已经成功。


2 基本 CRUD 操作

MyBatis-Plus 在BaseMapper中封装了常用的 CRUD 方法,以下逐一演示。

2.1 插入操作

使用insert()方法插入一条记录:

@TestpublicvoidtestInsert(){Useruser=newUser(null,"张三",23,"zhangsan@qq.com");// 执行SQL: INSERT INTO user (id, name, age, email) VALUES (?, ?, ?, ?)intresult=userMapper.insert(user);System.out.println("受影响行数:"+result);System.out.println("id自动获取:"+user.getId());}

执行后获取到的 id 为类似1778676561893969922的长整型数值。这是因为MyBatis-Plus 默认使用雪花算法(Snowflake)生成主键 id,而非数据库自增。如果需要使用自增策略,可以通过@TableId(type = IdType.AUTO)注解来指定。

2.2 删除操作

MyBatis-Plus 提供了 3 种删除方式。

2.2.1 根据 id 删除

deleteById():根据主键 id 删除单条记录。

@TestpublicvoidtestDeleteById(){// 执行SQL: DELETE FROM user WHERE id=?intresult=userMapper.deleteById(1778676561893969922L);System.out.println("受影响行数:"+result);}
2.2.2 根据 id 批量删除

deleteBatchIds():传入 id 集合,批量删除多条记录。

@TestpublicvoidtestDeleteBatchIds(){// 执行SQL: DELETE FROM user WHERE id IN (?, ?, ?)List<Long>idList=Arrays.asList(1L,2L,3L);intresult=userMapper.deleteBatchIds(idList);System.out.println("受影响行数:"+result);}
2.2.3 根据 Map 条件删除

deleteByMap():将删除条件封装为 Map,Map 中的每个键值对会作为 WHERE 子句中的等值条件,多个条件之间用 AND 连接。

@TestpublicvoidtestDeleteByMap(){// 执行SQL: DELETE FROM user WHERE name = ? AND age = ?Map<String,Object>map=newHashMap<>();map.put("age",23);map.put("name","张三");intresult=userMapper.deleteByMap(map);System.out.println("受影响行数:"+result);}

2.3 修改操作

MyBatis-Plus 提供了 2 种更新方式。

2.3.1 根据 id 修改

updateById():根据实体对象的 id 字段定位记录,将非 null 字段更新到数据库。

@TestpublicvoidtestUpdateById(){Useruser=newUser(4L,"admin",22,null);// 执行SQL: UPDATE user SET name=?, age=? WHERE id=?// 注意:email 为 null,不会出现在 SET 子句中intresult=userMapper.updateById(user);System.out.println("受影响行数:"+result);}
2.3.2 根据条件修改(QueryWrapper)

update(entity, wrapper):第一个参数是包含更新字段的实体对象,第二个参数是条件构造器。

@TestpublicvoidtestUpdateByWrapper(){Useruser=newUser();user.setAge(22);user.setEmail("admin@qq.com");// 构造更新条件QueryWrapper<User>wrapper=newQueryWrapper<>();wrapper.eq("id",4L);// 执行SQL: UPDATE user SET age=?, email=? WHERE (id = ?)intresult=userMapper.update(user,wrapper);System.out.println("受影响行数:"+result);}
2.3.3 根据条件修改(UpdateWrapper)

UpdateWrapper可以同时设置更新条件和更新字段,不需要再传入实体对象:

@TestpublicvoidtestUpdateByUpdateWrapper(){UpdateWrapper<User>wrapper=newUpdateWrapper<>();wrapper.eq("id",4L).set("age",28).set("email","admin@163.com");// 执行SQL: UPDATE user SET age=?, email=? WHERE (id = ?)intresult=userMapper.update(null,wrapper);System.out.println("受影响行数:"+result);}

QueryWrapper vs UpdateWrapper:

  • QueryWrapper:需要配合实体对象使用,更新字段由实体的非 null 属性决定。
  • UpdateWrapper:通过.set()方法直接指定更新字段,不依赖实体对象,写法更灵活。

2.4 查询操作

MyBatis-Plus 提供了多种查询方式。

2.4.1 根据 id 查询

selectById():根据主键查询单条记录。

@TestpublicvoidtestSelectById(){// 执行SQL: SELECT id, name, age, email FROM user WHERE id=?Useruser=userMapper.selectById(4L);System.out.println(user);}
2.4.2 根据 id 批量查询

selectBatchIds():传入 id 集合,查询多条记录。

@TestpublicvoidtestSelectBatchIds(){// 执行SQL: SELECT id, name, age, email FROM user WHERE id IN (?, ?)List<Long>idList=Arrays.asList(4L,5L);List<User>list=userMapper.selectBatchIds(idList);list.forEach(System.out::println);}
2.4.3 根据 Map 条件查询

selectByMap():将查询条件封装为 Map,与deleteByMap()用法一致。

@TestpublicvoidtestSelectByMap(){// 执行SQL: SELECT id, name, age, email FROM user WHERE name = ? AND age = ?Map<String,Object>map=newHashMap<>();map.put("age",20);map.put("name","Jack");List<User>list=userMapper.selectByMap(map);list.forEach(System.out::println);}
2.4.4 查询所有数据

selectList(null):传入null表示不附加任何条件,查询全部记录。

@TestpublicvoidtestSelectList(){// 执行SQL: SELECT id, name, age, email FROM userList<User>list=userMapper.selectList(null);list.forEach(System.out::println);}

本文介绍了 SpringBoot 整合 MyBatis-Plus 的环境搭建流程,以及BaseMapper提供的基本 CRUD 操作。下一篇将介绍 MyBatis-Plus 的通用 Service 层封装

http://www.cnnetsun.cn/news/3026295.html

相关文章:

  • AI 创意工具产品化:从技术 Demo 到可交付产品的三道坎
  • HypoMux | 多网卡带宽并发聚合下载加速工具
  • 隧道代理和普通代理有什么区别?看完秒懂选对不踩坑
  • MyBatis-Plus 通用 Service 与常用注解
  • 【数据库系统原理】第35篇:自主访问控制与强制访问控制:权限传递与安全标记
  • 用Matlab进行无线电信号逆向实战2——立体声 FM 广播的分离与解密 从频谱迷宫到相干解调的避坑指南
  • 数据分析转大模型:从工具接入到项目提效
  • OWTB 3PL 智慧仓储管理系统 - AI员工增强版工种清单
  • 滑动文本控件样例工程以及使用详解
  • 2026年下半年量化工具怎么选,先匹配能力基础
  • Vatee:用框架方式看外汇市场服务体验,更容易形成稳定判断
  • 房产销售做客户介绍总冷场?掌握AI优化项目卖点表达,构建高转化销冠工作流
  • 2026年小策略练习,帮零基础看见量化流程
  • 常用面试题
  • 2026年超耐磨TPU厂家口碑排行情况大揭秘
  • 放大50倍看二手劳力士女款满天星,这组机芯加工公差才是底牌
  • 如何批量删除edge同步到微软账户中的密码
  • 希尔排序算法
  • 二维码签到系统
  • 40岁重新学工具,AI给了我第二次职业选择
  • 视频孪生全域穿透 营区物理空间动态数字映射综合平台
  • JVM篇-JVM主要组成部分
  • 2026打工人必看:这些看似正常的文件,可能是木马的入口
  • 在POSIX线程中正确处理无参数函数
  • 我终于知道,Codex 为什么需要一块无限画布了
  • CSS Flexbox布局的精妙应用
  • 解决django.db.utils.OperationalError: attempt to write a readonly database错误
  • 如何快速上手SDR++:跨平台软件定义无线电的终极解决方案
  • 《多级标签并行筛选》一、Flex弹性布局使用指南
  • 全栈 API 设计与 GraphQL 实践:从 N+1 查询到 DataLoader 优化的工程化方案