一、 MyBatis-Plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
- mp的简单使用
现有一张 User 表,其表结构如下:
其对应的数据库 Schema 脚本如下:
DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) );
其对应的数据库 Data 脚本如下:
DELETE FROM user; INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
- 初始化工程
创建一个空的 Spring Boot 工程(工程将以 H2 作为默认数据库进行演示)
提示
可以使用 Spring Initializer (opens new window)快速初始化一个 Spring Boot 工程
#添加依赖
引入 Spring Boot Starter 父工程:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5+ 版本</version> <relativePath/> </parent>
引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、h2 依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> </dependencies>
- 配置
在 application.yml 配置文件中添加 H2 数据库的相关配置:
# DataSource Config spring: datasource: driver-class-name: org.h2.Driver schema: classpath:db/schema-h2.sql username: root password: test sql: init: schema-locations: classpath:db/schema-h2.sql data-locations: classpath:db/data-h2.sql
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:
@SpringBootApplication @MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
#编码
编写实体类 User.java(此处使用了 Lombok (opens new window)简化代码)
@Data public class User { private Long id; private String name; private Integer age; private String email; }
编写 Mapper 包下的 UserMapper接口
public interface UserMapper extends BaseMapper<User> { }
- 开始使用
添加测试类,进行功能测试:
@SpringBootTest public class SampleTest { @Autowired private UserMapper userMapper; @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); } }
提示
UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper,所以不填写就是无任何条件
控制台输出:
User(id=1, name=Jone, age=18, email=test1@baomidou.com) User(id=2, name=Jack, age=20, email=test2@baomidou.com) User(id=3, name=Tom, age=28, email=test3@baomidou.com) User(id=4, name=Sandy, age=21, email=test4@baomidou.com) User(id=5, name=Billie, age=24, email=test5@baomidou.com)
提示
完整的代码示例请移步:Spring Boot 快速启动示例 (opens new window)| Spring MVC 快速启动示例(opens new window)
- 小结
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。
但 MyBatis-Plus 的强大远不止这些功能,JAVA开发爱好者在使用mybatis-plus的时候,经常使用的是QueryWrapper,QueryWrapper继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取,下面总结了几种不同的用法:
二、MP–>QueryWrapper 5种更新语句不同写法:
/** * 第一种,常用写法 */ public void updateUser1(){ //方式一: User user = new User(); user.setAge(29); user.setEmail("111111111111.com"); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("name","Tom"); update(user,queryWrapper); } /** * 第二种 UpdateWrapper */ public void updateUser2(){ update(null,new UpdateWrapper<User>().set("age",29) .set("email","22222222222222.com").eq("name","Tom")); } /** * 第三种实体类+LambdaUpdateWrapper */ public void updateUser3(){ User user = new User(); user.setAge(29); user.setEmail("3333333.com"); update(user,new LambdaUpdateWrapper<User>( ).eq(User::getName,"Tom")); } /** * 第四种 LambdaUpdateWrapper */ public void updateUser4(){ update(null,new LambdaUpdateWrapper<User>().set(User::getAge,29) .set(User::getEmail,"4444444.com").eq(User::getName,"Tom")); } /** * 第五种:Wrappers */ public void updateUser5(){ update(null,Wrappers.<User>update().lambda() .set(User::getAge,29) .set(User::getEmail,"555555555.com") .eq(User::getName,"Tom")); } /** * 第五种:实体类+Wrappers */ public void updateUser6(){ User user = new User(); user.setAge(29); user.setEmail("6666666.com"); update(user,Wrappers.<User>update().lambda() .eq(User::getName,"Tom")); }
三、三种查询语句不同写法:
/** * 第一种查询 * @return */ public List<User> selectListUser(){ List<User> list = baseMapper.selectList( Wrappers.<User>lambdaQuery() .eq(User::getName, "Tom")); return list; } /** * 第二种查询 * @return */ public IPage<Map<String, Object>> listPageUser(){ Page<Map<String, Object>> mapPage = baseMapper.selectMapsPage( new Page<>(1, 5), Wrappers.<User>query() .orderByAsc("id")); return mapPage; } /** * 第三种查询 * @return */ public List<User> listUser(){ LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>() .lambda(); List<User> users = baseMapper.selectList(lambdaQueryWrapper); return users; }
通过上面代码的演示,我们对使用MP的条件构造器进行数据库的delete和insert操作有了更深一步的理解。