MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper
要指定对应的泛型
public interface UserMapper extends BaseMapper<User>
实体类中,类名驼峰转下划线作为表名、名为id
的字段作为主键、变量名驼峰转为下划线作为表的字段名
@TableName
:用于指定表名@TableId
:用于指定表中的主键字段信息@TableField
:用于指定表中的普通字段信息(变量名与数据库字段名不一致;变量名以is开头,并且是布尔类型;变量名与数据库关键字冲突的)当实体类中类名和字段名不一致时可以使用上面的注解进行指定。使用时需要使用双引号,单引号好像会有问题
具体用法见官方文档:注解
mybatis-plus 支持各种复杂的where
条件,可以满足日常开发的所有需求,这里需要使用条件构造器。
更新李四的年龄为20
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// 查询用户
public List<User> selectUser() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 标签好像要用双引号
updateWrapper.set("age", 20);
// 条件
updateWrapper.eq("name", "李四");
// 更新
int count = userMapper.update(null, updateWrapper);
// 查询更新后的数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "李四");
List<User> userList = userMapper.selectList(queryWrapper);
return userList;
}
}
查询年龄大于20的男生的名称、年龄
// 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 查询年龄大于20并且性别为男的用户的姓名、年龄
queryWrapper
.select("name", "age")
.gt("age", 20)
.eq("sex", 1);
// 返回结果
return userMapper.selectList(queryWrapper);
男生的年龄都加1
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 条件
updateWrapper.eq("sex", 1)
.setSql("age = age+1");
// 更新
userMapper.update(null, updateWrapper);
// 查询更新后的数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex", 1);
List<User> userList = userMapper.selectList(queryWrapper);
return userList;
或者
public List<User> selectUser() {
// 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex", 1);
// 查询数据
List<User> userList = userMapper.selectList(queryWrapper);
for (User user : userList) {
// 更新年龄
user.setAge(user.getAge() + 1);
userMapper.update(user, queryWrapper);
}
return userList;
}
查询id为1、2、3的用户
// 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<Integer> ids = List.of(1, 2, 3);
queryWrapper.in("id", ids);
// 查询数据
List<User> userList = userMapper.selectList(queryWrapper);
return userList;
上面的操作需要指定字段名称,有时候可能会写错。这里可以使用 Lambda表达式来进行操作
查询年龄大于20的男生的名称、年龄
public List<User> selectUser() {
// 查询条件
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.select(User::getName, User::getAge)
.gt(User::getAge, 20);
// 查询数据
List<User> userList = userMapper.selectList(queryWrapper);
return userList;
}
我们可以利用mybatis-plus
的wrapper
来构建复杂的where
条件,然后自己定义sql
语句剩下的部分。
基本步骤
Wrapper
构建where
条件// 1、构建条件
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getId, 10);
// 调用自定义方法
userMapper.updateAgeById(queryWrapper, 1);
mapper
方法参数中使用Param
注解声明wrapper
变量名称,必须是ew
void updateAgeById(@Param("ew") LambdaQueryWrapper<User> wrapper , @Param("age") int age);
sql
,并且使用wrapper
条件 <!--
相当于 update user set age = age + #{age} where id = #{id}
只不过where条件是通过wrapper生成的
-->
<update id="updateAgeById">
update user
set age = age + #{age} ${ew.customSqlSegment}
</update>
这里要注意,后面的条件是用的${}
,${}
获取解析后的值,#{}
是占位符