从名字就能看出来,Mybatis - plus是Mybatis的增强版,在Mybatis的基础上只做增强,为简化开发,提高效率。

Maven添加依赖,注意Spring Boot和Mybatis-plus对应版本。

还需要配置数据库相关信息
spring:
application:
name: mybatis-plus-demo
datasource:
url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration: #配置日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: "classpath*:/mapper/**.xml"创建实体类UserInfo:
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;
}实现Mapper接口类: 注意:Myatis-plus提供了一个基础的BaseMapper接口,已经实现了单表的CRUD,我们只需要继承这个BaseMapper即可。

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}接下来可以在src目录下的test类进行测试(直接去测试类写CRUD,就可以直接运行):
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("admin");
userInfo.setPassword("admin");
userInfo.setAge(12);
userInfoMapper.insert(userInfo);
}
}

我们可以看到,继承的BaseMapper类中是泛型,UserInfo接口继承后就是数据库相对应的实体类。MyBatis-Plus会根据这个实体类来推断表的信息。
默认情况下: 1. 表名:实体类的 驼峰表示 转化为 蛇形表示 为表名 2. 字段:根据实体类的属性名 转化为蛇形表示作为字段名
但是有的时候并不是遵循这种规则:
修改实体类名,假如我们把类名不按照默认情况命名,就会出现报错:表示数据库不存在.所以需要@TableName 来表示实体类对应的表。

修改属性名deleteFlag为deleteflag,重新测试;

日志中发现据属性名转换后的字段名为:deleteflag。

通过@TableId注解来指定对应主键。
注意: 如果属性名和字段名不⼀致,需要在@TableId 指明对应的字段名 属性名和字段⼀致的情况下,直接加@TableId 注解就可以.
MyBatis-Plus 提供了⼀套强⼤的条件构造器(Wrapper),⽤于构建复杂的数据库查询条件.* Wrapper类允许开发者以链式调⽤的⽅式构造查询条件,⽆需编写繁琐的SQL语句,从⽽提⾼开发效率并减少SQL注⼊的⻛险***

更加详细的内容,推荐大家去官网查看条件构造器 AbstractWrapper 提供了所有Wrapper类共有的方法和属性,所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
⽤于构造查询条件,但是不局限于查询语句,修改等都可以使用QueryWrapper
mapper接口:
@Select("SELECT id,username,password,age FROM user_info WHERE age = 18 AND username \n" +"\"%min%\"")
List<UserInfo> QueryWrapper();测试

注意:一般情况Mybatis-plus会根据@TableField生成别名,但是当指定了QueryWrapper的select属性后就仅仅是属性而没有别名了。
解决办法: 1. 实体类属性名和字段名保持一致 2. 自定义SQL 3. 使用LambdaQueryWrapper实现
对于更新,我们也可以直接使⽤UpdateWrapper,在不创建实体对象的情况下,直接设置更新字段和条件
mapper接口:
@Update("UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)")
List<UserInfo> updateByUpdateWrapper();
介绍一些方法的缩写:
QueryWrapper和UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发⽣变更,测试可能会出现问题
MyBatis-Plus 给我们提供了⼀种基于Lambda表达式的条件构造器,它通过Lambda表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。
@Test
void LambdaQueryWrapper(){
QueryWrapper<UserInfo> userInfoQueryWrapper=new QueryWrapper<UserInfo>();
userInfoQueryWrapper.lambda()
.select(UserInfo::getId,UserInfo::getUsername,UserInfo::getPassword,UserInfo::getAge)
.eq(UserInfo::getAge,1);
userInfoMapper.selectList(userInfoQueryWrapper).forEach(System.out::println);
}
@Test
void LambdaUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();
updateWrapper.lambda()
.set(UserInfo::getDeleteflag,0)
.set(UserInfo::getAge,5)
.in(UserInfo::getId, List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
自定义意味着我们不用BaseMapper类的方法。
如果MyBatis-Plus提供的操作不能满⾜我们的实际需求,MyBatis-Plus也提供了⾃定义SQL的功能,我们可以利⽤Wrapper构造查询条件,再结合Mapper编写SQL(Mybatis-plus版本不得低于3.0.7)

mapper接口:
@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")
List<UserInfo> selectUserInfoByCondition(@Param(Constants.WRAPPER) QueryWrapper<UserInfo> queryWrapper);测试:
@Test
void selectUserInfoByCondition() {
QueryWrapper<UserInfo> queryWrapper= new QueryWrapper<>();
//where age < 20
queryWrapper.lt("age",20);
//@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")
//@Select("select id,username,password,age from user_info where age < 20")
userInfoMapper.selectUserInfoByCondition(queryWrapper).forEach(System.out::println);
}
避免了SQL注入的风险。