文章目录
1. 引入MyBatis-Plus依赖、MySQL依赖以及配置数据库信息
对于SpringBoot2:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
对于SpringBoot3:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
MySQL的依赖:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
配置文件配置:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: '051215'
driver-class-name: com.mysql.cj.jdbc.Driver
2.创建实体类、创建Mapper接口
实体类的属性与自己数据库表信息对应即可
package org.jwcb.demo.entity;
import lombok.Data;
import java.util.Date;
@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;
}
MyBatis-Plus提供了一个基础的Mapper接口BaseMapper
,已经实现了基础的单表的CRUD
此时我们只需要自定义一个Mapper接口,实现这个BaseMapper
即可实现简单的CRUD
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
3.简单使用
简单的CRUD操作:
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("zhangsan");
userInfo.setPassword("zhangsan");
userInfo.setAge(18);
userInfo.setGender(1);
userInfo.setPhone("15812312312");
userInfoMapper.insert(userInfo);
}
@Test
void deleteById() {
UserInfo userInfo = new UserInfo();
userInfo.setId(-177197054);
userInfoMapper.deleteById(userInfo.getId());
}
@Test
void deleteByMap() {
Map<String, Object> map = new HashMap<>();
map.put("id", 980475906);
map.put("username", "lisi");
userInfoMapper.deleteByMap(map);
}
@Test
void deleteBatchIds() {
userInfoMapper.deleteBatchIds(List.of(917561347,980475906,980475906));
}
@Test
void updateById() {
UserInfo userInfo = new UserInfo();
userInfo.setId(980475907);
userInfo.setPhone("15912332122");
userInfoMapper.updateById(userInfo);
}
@Test
void selectById() {
UserInfo userInfo = userInfoMapper.selectById(980475908);
System.out.println(userInfo);
}
@Test
void selectByBatchIds() {
List<UserInfo> userInfos = userInfoMapper.selectBatchIds(List.of(980475909,980475907,980475908));
System.out.println(userInfos);
}
}
4. 复杂操作
条件构造器
MyBatis-Plus提供了一套强大的条件构造器(Wrapper),用于构造复杂的数据库查询条件.
以下是主要的Wrapper类及其功能:
AbstractWrapper
:是一个抽象基类,提供了所有Wrapper类共有的方法和属性QueryWrapper
:用于构造查询条件,在AbstractWrapper的基础上拓展了select方法,允许查询指定字段UpdateWrapper
:用于构造更新条件,可以在更新数据时指定条件LambdaQueryWrapper
:基于Lambda表达式的查询条件构造器,通过Lambda表达式来引用实体类的属性,从而避免了硬编码字段名LambdaUpdateWrapper
:基于Lambda表达式的更新条件构造器,通过Lambda表达式来引用实体类的属性,从而避免了硬编码字段名
QueryWrapper
QueryWrapper
不只是适用于查询条件,修改,删除,查询都可以使用QueryWrapper
来构建查询条件
@Test
void selectByQueryWrapper() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", "sunqi").eq("phone", "15912332122");
List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);
System.out.println(userInfos);
}
@Test
void updateByQueryWrapper() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("age",30);
UserInfo userInfo = new UserInfo();
userInfo.setDeleteFlag(1);
userInfoMapper.update(userInfo,queryWrapper);
}
lt
: less thanle
:less than or equal toge
:greater than or equal togt
:greater thaneq
:equalne
:not equal
UpdateWrapper
可以实现在不创建实体对象的情况下,直接设置更新字段和条件
@Test
void updateByUpdateWrapper() {
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("delete_flag",0).gt("age",20);
userInfoMapper.update(updateWrapper);
}
LambdaQueryWrapper
Querywrapper
和 UpdateWrapper
存在一个问题,就是字段名是写死的
MyBatis-Plus提供了一种基于Lambda表达式的条件构造器,通过Lambda表达式来引用实体的属性,避免了硬编码字段名
@Test
void selectByLambdaQueryWrapper() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().select(
UserInfo::getId,UserInfo::getUsername, UserInfo::getAge, UserInfo::getPhone,
UserInfo::getDeleteFlag,UserInfo::getCreateTime,UserInfo::getUpdateTime)
.eq(UserInfo::getId, 980475908);
System.out.println((userInfoMapper.selectList(queryWrapper)));
}
自定义SQL
有时候,MyBatis-Plus提供的操作不能满足我们的实际需求,MyBatis-Plus也提供了自定义SQL的功能
可以利用Wrapper构造查询条件,再结合Mapper编写
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Select("select id,username,age from user_info " +
"${ew.customSqlSegment}")
List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> queryWrapper);
参数命名:在自定义sql时,传递Wrapper对象作为参数时,残水名必须为
ew
,或者使用注解@Param(Constants.WRAPPER)
明确指定参数为Wrapper对象(注意:Constants来自com.baomidou.mybatisplus.core.toolkit.Constants包
使用${ew.customSqlSegment}
:在SQL语句里面,使用${ew.customSqlSegment}
来引用Wrapper对象产生的SQL片段