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 根据条件修改QueryWrapper2.3.3 根据条件修改UpdateWrapper2.4 查询操作2.4.1 根据 id 查询2.4.2 根据 id 批量查询2.4.3 根据 Map 条件查询2.4.4 查询所有数据1 环境搭建1.1 创建工程并引入依赖创建 SpringBoot 工程在pom.xml中引入以下依赖parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.2/versionrelativePath//parentpropertiesjava.version1.8/java.version/propertiesdependencies!-- SpringBoot Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- SpringBoot 核心 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependency!-- SpringBoot 测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!-- MyBatis-Plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency!-- Lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- MySQL 驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build1.2 编写启动类SpringBootApplicationMapperScan(basePackagescom.xq.mapper)publicclassApp{publicstaticvoidmain(String[]args){SpringApplication.run(App.class,args);}}MapperScan用于指定 Mapper 接口所在的包路径启动时会自动扫描并注册到 Spring 容器中。1.3 编写实体类与 Mapper 接口实体类 UserDataNoArgsConstructorAllArgsConstructorpublicclassUser{privateLongid;privateStringname;privateIntegerage;privateStringemail;}Mapper 接口publicinterfaceUserMapperextendsBaseMapperUser{}继承BaseMapperUser后即可直接使用 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?characterEncodingutf-8useSSLfalseusername:rootpassword:your_password注意事项驱动类driver-class-nameSpring Boot 2.0内置 JDBC 5 驱动使用com.mysql.jdbc.DriverSpring Boot 2.1 及以上内置 JDBC 8 驱动使用com.mysql.cj.jdbc.Driver使用错误的驱动类不会导致程序报错但会在控制台输出 WARN 信息。连接地址urlMySQL 5.7jdbc:mysql://localhost:3306/mybatis_plus?characterEncodingutf-8useSSLfalseMySQL 8.0jdbc:mysql://localhost:3306/mybatis_plus?serverTimezoneGMT%2B8characterEncodingutf-8useSSLfalseMySQL 8.0 必须指定serverTimezone否则会报错java.sql.SQLException: The server time zone value xxx is unrecognized or represents more1.5 配置日志输出MyBatis-Plus 默认不会在控制台打印 SQL 语句。添加以下配置可以开启日志方便调试时观察实际执行的 SQLmybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl1.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(){UserusernewUser(null,张三,23,zhangsanqq.com);// 执行SQL: INSERT INTO user (id, name, age, email) VALUES (?, ?, ?, ?)intresultuserMapper.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?intresultuserMapper.deleteById(1778676561893969922L);System.out.println(受影响行数result);}2.2.2 根据 id 批量删除deleteBatchIds()传入 id 集合批量删除多条记录。TestpublicvoidtestDeleteBatchIds(){// 执行SQL: DELETE FROM user WHERE id IN (?, ?, ?)ListLongidListArrays.asList(1L,2L,3L);intresultuserMapper.deleteBatchIds(idList);System.out.println(受影响行数result);}2.2.3 根据 Map 条件删除deleteByMap()将删除条件封装为 MapMap 中的每个键值对会作为 WHERE 子句中的等值条件多个条件之间用 AND 连接。TestpublicvoidtestDeleteByMap(){// 执行SQL: DELETE FROM user WHERE name ? AND age ?MapString,ObjectmapnewHashMap();map.put(age,23);map.put(name,张三);intresultuserMapper.deleteByMap(map);System.out.println(受影响行数result);}2.3 修改操作MyBatis-Plus 提供了 2 种更新方式。2.3.1 根据 id 修改updateById()根据实体对象的 id 字段定位记录将非 null 字段更新到数据库。TestpublicvoidtestUpdateById(){UserusernewUser(4L,admin,22,null);// 执行SQL: UPDATE user SET name?, age? WHERE id?// 注意email 为 null不会出现在 SET 子句中intresultuserMapper.updateById(user);System.out.println(受影响行数result);}2.3.2 根据条件修改QueryWrapperupdate(entity, wrapper)第一个参数是包含更新字段的实体对象第二个参数是条件构造器。TestpublicvoidtestUpdateByWrapper(){UserusernewUser();user.setAge(22);user.setEmail(adminqq.com);// 构造更新条件QueryWrapperUserwrappernewQueryWrapper();wrapper.eq(id,4L);// 执行SQL: UPDATE user SET age?, email? WHERE (id ?)intresultuserMapper.update(user,wrapper);System.out.println(受影响行数result);}2.3.3 根据条件修改UpdateWrapperUpdateWrapper可以同时设置更新条件和更新字段不需要再传入实体对象TestpublicvoidtestUpdateByUpdateWrapper(){UpdateWrapperUserwrappernewUpdateWrapper();wrapper.eq(id,4L).set(age,28).set(email,admin163.com);// 执行SQL: UPDATE user SET age?, email? WHERE (id ?)intresultuserMapper.update(null,wrapper);System.out.println(受影响行数result);}QueryWrapper vs UpdateWrapperQueryWrapper需要配合实体对象使用更新字段由实体的非 null 属性决定。UpdateWrapper通过.set()方法直接指定更新字段不依赖实体对象写法更灵活。2.4 查询操作MyBatis-Plus 提供了多种查询方式。2.4.1 根据 id 查询selectById()根据主键查询单条记录。TestpublicvoidtestSelectById(){// 执行SQL: SELECT id, name, age, email FROM user WHERE id?UseruseruserMapper.selectById(4L);System.out.println(user);}2.4.2 根据 id 批量查询selectBatchIds()传入 id 集合查询多条记录。TestpublicvoidtestSelectBatchIds(){// 执行SQL: SELECT id, name, age, email FROM user WHERE id IN (?, ?)ListLongidListArrays.asList(4L,5L);ListUserlistuserMapper.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 ?MapString,ObjectmapnewHashMap();map.put(age,20);map.put(name,Jack);ListUserlistuserMapper.selectByMap(map);list.forEach(System.out::println);}2.4.4 查询所有数据selectList(null)传入null表示不附加任何条件查询全部记录。TestpublicvoidtestSelectList(){// 执行SQL: SELECT id, name, age, email FROM userListUserlistuserMapper.selectList(null);list.forEach(System.out::println);}本文介绍了 SpringBoot 整合 MyBatis-Plus 的环境搭建流程以及BaseMapper提供的基本 CRUD 操作。下一篇将介绍 MyBatis-Plus 的通用 Service 层封装。