MyBatis-plus的介绍
MyBatis-plus是MyBatis的增强工具,在MyBatis的基础上做出加强,只要MyBatis有的功能MyBatis-plus都有。

MyBatis-plus的上手
添加依赖
在我们创建项目的时候,我们需要添加MyBatis-plus和mysql的依赖
MyBatis-plus的依赖
java
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
Mysql的依赖
ruby
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
配置数据库
java
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
首先我们创建UserInfo类
实体类中的属性和表中的字段要一一对应。
java
@Data
@TableName("user_info")
public class UserInfo {
@TableId("id" )
private Integer id;
@TableField("username")
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接口
java
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
MyBatis-plus提供一个基础的BaseMapper接口,已经实现了单表的增删改查,我们自己的Mapper接口只需要继承这个BaseMapper接口,就可以实现单表的增删改查了
CRUD
我们来简单的测试一下MyBatis-plus的CRUD
java
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void select() {
userInfoMapper.selectById(1);
}
@Test
void update() {
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setAge(12);
userInfo.setPassword("5556666");
userInfoMapper.updateById(userInfo);
}
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setId(27);
userInfo.setAge(3);
userInfo.setPassword("3");
userInfo.setUsername("123333");
userInfoMapper.insert(userInfo);
}
@Test
void delete() {
userInfoMapper.deleteById(8);
}
@TableName
修改实体类名UserInfo为Userinfo
我们可以用@TableName来标识实体类对应的表
java
@Data
@TableName("user_info")
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;
}
@TableField
修改属性名deleteFlag为deleteflag
java
@TableField("delete_flag")
private Integer deleteflag;
@TableId
修改属性名id为userId
我们可以通过@TableId来指定对应的主键
java
@TableId("id")
private Integer userId;
条件构造器
QueryWrapper
⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段,QueryWrapper并不只用于查询语句,无论是修改,删除,查询都可以使用QueryWrapper来构造条件
Select
sql
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username
"%min%"
java
void selectByCondition() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
.select("username", "password", "id", "age")
.eq("age", 18)
.like("username", "min");
List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);
userInfos.forEach(x -> System.out.println(x));
}
Update
sql
UPDATE user_info SET delete_flag=? WHERE age < 20
java
@Test
void updateByCondition() {
UserInfo userInfo = new UserInfo();
userInfo.setDeleteFlag(1);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
.lt("age", 20);
userInfoMapper.update(userInfo, queryWrapper);
}
Delete
sql
DELETE FROM user_info WHERE age = 18
java
@Test
void deleteByCondition(){
QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>()
.eq("age",18);
userInfoMapper.delete(queryWrapper);
}
UpdateWrapper
对于更新,我们也可以直接使⽤UpdateWrapper,在不创建实体对象的情况下,直接设置更新字段和条件
sql
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
java
@Test
void updateByCondition2(){
UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
.set("delete_flag",0)
.set("age",5)
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
sql
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
java
@Test
void updateByCondition3(){
UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>()
.setSql("age=age+10")
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
LambdaQueryWrapper
QueryWrapper和UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发⽣变更,可能会 因为测试不到位酿成事故。
MyBatis-Plus 给我们提供了⼀种基于Lambda表达式的条件构造器,它通过Lambda表达式来引⽤实体类的属性,从⽽避免了硬编码字段名,也提⾼了代码的可读性和可维护性。
java
@Test
void selectByLambdaCondition() {
QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>();
queryWrapper.lambda()
.select(UserInfo::getUsername,UserInfo::getPassword)
.eq(UserInfo::getAge,18);
userInfoMapper.selectList(queryWrapper);
}
LambdaUpdateWrapper
java
@Test
void updateByLambdaCondition(){
UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>();
updateWrapper.lambda()
.set(UserInfo::getUsername,"123")
.set(UserInfo::getAge,12)
.in(UserInfo::getId,List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
⾃定义SQL
在实际的开发中,MyBatis-plus提供的操作不能满足我们的实际需求,MyBatis-plus也提供了自定义SQL的功能,我们可以用Wrapper构造查询条件,结合Mapper编写SQL
sql
select id,username,password,age FROM user_info WHERE username = "admin"
java
@Select("select * from user_info ${ew.customSqlSegment}")
List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
java
@Test
void testQueryUserByCustom(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
.eq("username","admin");
userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);
}
注:
参数命名:在⾃定义SQL时,传递Wrapper对象作为参数时,参数名必须为 ew 或者使⽤注解 ${ew.customSqlSegment},明确指定参数为Wrapper对象
使用 {ew.customSqlSegment} :在SQL语句中,使⽤ {ew.customSqlSegment}来引⽤Wrapper对象⽣成的SQL⽚段.
不⽀持基于entity的where语句:⾃定义SQL时,Wrapper对象不会基于实体类⾃动⽣成 where⼦句,你需要⼿动编写完整的SQL语句
MyBatis-plus也支持xml的方式
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.blame.mybatisplus.mapper.UserInfoMapper">
<select id="queryUserByCustom2" resultType="com.blame.mybatisplus.model.UserInfo">
select id,username,password,age FROM user_info ${ew.customSqlSegment}
</select>
</mapper>
java
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
java
@Test
void testQueryUserByCustom2(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
.eq("username","admin");
userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);
}
如果需要查看更多关于MyBatis-plus 的资料,点击
简介 | MyBatis-Plushttps://baomidou.com/introduce/
希望能对大家有所帮助!!!!!
