MyBatisAPI · Redis详解
MyBatis 与 MyBatis-Plus 高频 API 速查
适合单体项目 / SSM / Spring Boot 后端开发快速查阅。
1. 总览
代码块收起展开
MyBatis
├─ 注解 SQL:@Select / @Insert / @Update / @Delete
├─ 多参数传递:@Param
├─ 结果映射:resultType / resultMap
├─ 动态 SQL:<if> <where> <set> <foreach>
└─ 复杂查询:XML 自定义 SQL
MyBatis-Plus
├─ BaseMapper<T>
│ ├─ insert
│ ├─ deleteById / deleteBatchIds
│ ├─ updateById
│ ├─ selectById / selectBatchIds
│ ├─ selectList / selectOne / selectCount
│ └─ selectPage
├─ Wrapper
│ ├─ QueryWrapper
│ ├─ LambdaQueryWrapper
│ ├─ UpdateWrapper
│ └─ LambdaUpdateWrapper
├─ IService / ServiceImpl
│ ├─ save / saveBatch
│ ├─ getById / list / page
│ ├─ updateById / update
│ └─ removeById / remove
└─ 链式调用
├─ query()
├─ lambdaQuery()
├─ update()
└─ lambdaUpdate()2. MyBatis 高频 API
2.1 @Select
代码块收起展开
@Mapper
public interface UserMapper {
@Select("select * from user where id = #{id}")
User selectById(Long id);
}用途:
- 简单单表查询
- SQL 很短、逻辑不复杂
2.2 @Insert
代码块收起展开
@Insert("insert into user(username, age) values(#{username}, #{age})")
int insert(User user);返回值:
- 一般是影响行数
2.3 @Update
代码块收起展开
@Update("update user set username = #{username}, age = #{age} where id = #{id}")
int updateById(User user);2.4 @Delete
代码块收起展开
@Delete("delete from user where id = #{id}")
int deleteById(Long id);2.5 @Param
多个参数时很常用。
代码块收起展开
@Select("select * from user where username = #{name} and age = #{age}")
User selectByNameAndAge(@Param("name") String username,
@Param("age") Integer age);作用:
- 给 SQL 中的参数显式命名
- 避免多个参数时取值混乱
2.6 XML 自定义 SQL
Mapper 接口
代码块收起展开
public interface UserMapper {
List<User> selectByCondition(@Param("name") String name,
@Param("minAge") Integer minAge);
}XML
代码块收起展开
<select id="selectByCondition" resultType="com.demo.entity.User">
select * from user
<where>
<if test="name != null and name != ''">
and username like concat('%', #{name}, '%')
</if>
<if test="minAge != null">
and age >= #{minAge}
</if>
</where>
</select>适用场景:
- 条件查询
- 多条件动态拼接
- SQL 逻辑稍复杂的单表查询
2.7 <if>
代码块收起展开
<if test="status != null">
and status = #{status}
</if>作用:
- 条件满足才拼接 SQL
2.8 <where>
代码块收起展开
<where>
<if test="name != null">
and username = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</where>作用:
- 自动处理多余的
and - 自动补
where
2.9 <set>
代码块收起展开
<update id="updateSelective">
update user
<set>
<if test="username != null">username = #{username},</if>
<if test="age != null">age = #{age},</if>
<if test="email != null">email = #{email},</if>
</set>
where id = #{id}
</update>作用:
- 动态更新非空字段
2.10 <foreach>
批量查询
代码块收起展开
<select id="selectByIds" resultType="com.demo.entity.User">
select * from user where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>Mapper
代码块收起展开
List<User> selectByIds(@Param("ids") List<Long> ids);高频场景:
in查询- 批量删除
- 批量插入拼值列表
2.11 resultType
代码块收起展开
<select id="selectById" resultType="com.demo.entity.User">
select * from user where id = #{id}
</select>作用:
- 将查询结果直接映射为对象类型
2.12 resultMap
当数据库字段名和 Java 属性名不一致时很有用。
实体类
代码块收起展开
public class User {
private Long id;
private String userName;
private LocalDateTime createTime;
}XML
代码块收起展开
<resultMap id="userMap" type="com.demo.entity.User">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="createTime" column="create_time"/>
</resultMap>
<select id="selectById" resultMap="userMap">
select id, user_name, create_time from user where id = #{id}
</select>2.13 MyBatis 常用模板
Mapper
代码块收起展开
@Mapper
public interface UserMapper {
User selectById(Long id);
List<User> selectByCondition(@Param("name") String name,
@Param("minAge") Integer minAge);
int insert(User user);
int updateSelective(User user);
int deleteById(Long id);
List<User> selectByIds(@Param("ids") List<Long> ids);
}XML
代码块收起展开
<mapper namespace="com.demo.mapper.UserMapper">
<select id="selectById" resultType="com.demo.entity.User">
select * from user where id = #{id}
</select>
<select id="selectByCondition" resultType="com.demo.entity.User">
select * from user
<where>
<if test="name != null and name != ''">
and username like concat('%', #{name}, '%')
</if>
<if test="minAge != null">
and age >= #{minAge}
</if>
</where>
</select>
<insert id="insert">
insert into user(username, age)
values(#{username}, #{age})
</insert>
<update id="updateSelective">
update user
<set>
<if test="username != null">username = #{username},</if>
<if test="age != null">age = #{age},</if>
</set>
where id = #{id}
</update>
<delete id="deleteById">
delete from user where id = #{id}
</delete>
</mapper>3. MyBatis-Plus 高频 API
3.1 BaseMapper<T>
代码块收起展开
public interface UserMapper extends BaseMapper<User> {
}继承后即可直接使用通用 CRUD。
3.2 insert
代码块收起展开
User user = new User();
user.setUsername("Gilbert");
user.setAge(20);
userMapper.insert(user);3.3 deleteById
代码块收起展开
userMapper.deleteById(1L);3.4 deleteBatchIds
代码块收起展开
userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L));3.5 updateById
代码块收起展开
User user = new User();
user.setId(1L);
user.setUsername("Arwen");
user.setAge(21);
userMapper.updateById(user);特点:
- 根据主键更新
3.6 selectById
代码块收起展开
User user = userMapper.selectById(1L);3.7 selectBatchIds
代码块收起展开
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));3.8 selectList
代码块收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1).orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);3.9 selectOne
代码块收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username", "Gilbert");
User user = userMapper.selectOne(wrapper);注意:
- 结果必须只有一条,否则可能报错
3.10 selectCount
代码块收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1);
Long count = userMapper.selectCount(wrapper);3.11 selectPage
代码块收起展开
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("username", "G").orderByDesc("create_time");
Page<User> result = userMapper.selectPage(page, wrapper);
System.out.println(result.getRecords()); // 当前页数据
System.out.println(result.getTotal()); // 总条数4. Wrapper 条件构造器
4.1 QueryWrapper
代码块收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1)
.like("username", "Gil")
.ge("age", 18)
.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);4.2 LambdaQueryWrapper
更推荐,字段更安全。
代码块收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1)
.like(User::getUsername, "Gil")
.ge(User::getAge, 18)
.orderByDesc(User::getCreateTime);
List<User> list = userMapper.selectList(wrapper);优势:
- 避免字符串字段名写错
- 字段重构时更安全
4.3 常用条件 API 表
| API | 含义 | 示例 |
|---|---|---|
eq | 等于 | eq("status", 1) |
ne | 不等于 | ne("status", 0) |
gt | 大于 | gt("age", 18) |
ge | 大于等于 | ge("age", 18) |
lt | 小于 | lt("age", 60) |
le | 小于等于 | le("age", 60) |
like | 模糊匹配 | like("username", "Gil") |
likeLeft | 左模糊 | likeLeft("username", "bert") |
likeRight | 右模糊 | likeRight("username", "Gil") |
in | in 查询 | in("id", ids) |
between | 区间 | between("age", 18, 30) |
isNull | 判空 | isNull("email") |
isNotNull | 非空 | isNotNull("phone") |
orderByAsc | 升序 | orderByAsc("sort") |
orderByDesc | 降序 | orderByDesc("create_time") |
last | SQL 尾拼接 | last("limit 1") |
4.4 条件成立才拼接
代码块收起展开
String name = "Gil";
Integer minAge = null;
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(name != null && !name.isEmpty(), User::getUsername, name)
.ge(minAge != null, User::getAge, minAge);
List<User> users = userMapper.selectList(wrapper);作用:
- 适合搜索条件可选场景
5. 更新构造器
5.1 UpdateWrapper
代码块收起展开
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("status", 0).set("status", 1);
userMapper.update(null, wrapper);对应 SQL:
代码块收起展开
update user set status = 1 where status = 05.2 LambdaUpdateWrapper
代码块收起展开
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getStatus, 0)
.set(User::getStatus, 1);
userMapper.update(null, wrapper);5.3 实体 + 条件更新
代码块收起展开
User user = new User();
user.setUsername("NewName");
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getId, 1L);
userMapper.update(user, wrapper);6. MyBatis-Plus Service 层高频 API
6.1 定义方式
Service 接口
代码块收起展开
public interface UserService extends IService<User> {
}实现类
代码块收起展开
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
}6.2 save
代码块收起展开
User user = new User();
user.setUsername("Gilbert");
user.setAge(20);
userService.save(user);6.3 saveBatch
代码块收起展开
userService.saveBatch(Arrays.asList(user1, user2, user3));6.4 getById
代码块收起展开
User user = userService.getById(1L);6.5 list
查全部
代码块收起展开
List<User> users = userService.list();带条件
代码块收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1);
List<User> users = userService.list(wrapper);6.6 getOne
代码块收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, "Gilbert");
User user = userService.getOne(wrapper);6.7 page
代码块收起展开
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getUsername, "G");
Page<User> result = userService.page(page, wrapper);6.8 updateById
代码块收起展开
User user = new User();
user.setId(1L);
user.setAge(22);
userService.updateById(user);6.9 update
代码块收起展开
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getId, 1L)
.set(User::getAge, 23);
userService.update(wrapper);6.10 removeById
代码块收起展开
userService.removeById(1L);6.11 remove
代码块收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 0);
userService.remove(wrapper);7. 链式调用 API
7.1 query()
代码块收起展开
List<User> users = userService.query()
.eq("status", 1)
.orderByDesc("create_time")
.list();7.2 lambdaQuery()
推荐。
代码块收起展开
List<User> users = userService.lambdaQuery()
.eq(User::getStatus, 1)
.like(User::getUsername, "Gil")
.orderByDesc(User::getCreateTime)
.list();7.3 one()
代码块收起展开
User user = userService.lambdaQuery()
.eq(User::getId, 1L)
.one();7.4 count()
代码块收起展开
long count = userService.lambdaQuery()
.eq(User::getStatus, 1)
.count();7.5 lambdaUpdate()
代码块收起展开
userService.lambdaUpdate()
.eq(User::getId, 1L)
.set(User::getUsername, "Arwen")
.update();8. 实体类常见注解
8.1 @TableName
代码块收起展开
@TableName("tb_user")
public class User {
}8.2 @TableId
代码块收起展开
@TableId(type = IdType.AUTO)
private Long id;8.3 @TableField
代码块收起展开
@TableField("create_time")
private LocalDateTime createTime;8.4 @TableField(exist = false)
代码块收起展开
@TableField(exist = false)
private String extraInfo;作用:
- 该属性不是数据库字段
9. 实战模板对照
9.1 按 id 查询
MyBatis
代码块收起展开
@Select("select * from user where id = #{id}")
User selectById(Long id);MyBatis-Plus
代码块收起展开
User user = userMapper.selectById(id);9.2 条件查询列表
MyBatis XML
代码块收起展开
<select id="selectByCondition" resultType="User">
select * from user
<where>
<if test="name != null and name != ''">
and username like concat('%', #{name}, '%')
</if>
</where>
</select>MyBatis-Plus
代码块收起展开
List<User> users = userService.lambdaQuery()
.like(name != null && !name.isEmpty(), User::getUsername, name)
.list();9.3 分页查询
MyBatis
代码块收起展开
<select id="selectPage" resultType="User">
select * from user
order by create_time desc
limit #{offset}, #{size}
</select>MyBatis-Plus
代码块收起展开
Page<User> page = new Page<>(current, size);
Page<User> result = userService.page(
page,
new LambdaQueryWrapper<User>().orderByDesc(User::getCreateTime)
);9.4 按条件更新
MyBatis
代码块收起展开
<update id="updateStatusById">
update user set status = #{status} where id = #{id}
</update>MyBatis-Plus
代码块收起展开
userService.lambdaUpdate()
.eq(User::getId, id)
.set(User::getStatus, status)
.update();9.5 批量查询
MyBatis
代码块收起展开
<select id="selectByIds" resultType="User">
select * from user where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>MyBatis-Plus
代码块收起展开
List<User> users = userMapper.selectBatchIds(ids);10. 如何选择 MyBatis 与 MyBatis-Plus
适合 MyBatis-Plus 的场景
- 单表 CRUD
- 常规分页
- 后台管理接口
- 快速开发
- 业务条件查询不算太复杂
适合 MyBatis 的场景
- 多表复杂关联
- 报表 SQL
- 复杂动态 SQL
- 需要精细控制 SQL 性能
11. 高频核心清单
MyBatis 必会
@Select@Param<if><where><set><foreach>resultMap
MyBatis-Plus 必会
selectByIdselectListselectPageinsertupdateByIddeleteByIdLambdaQueryWrapperLambdaUpdateWrapperlambdaQuery()lambdaUpdate()savegetByIdlistpage
12. 面试 / 笔记版超短总结
代码块收起展开
MyBatis:
- 核心是自己写 SQL
- 简单场景可用注解
- 复杂场景常用 XML + 动态 SQL
- 高频标签:if / where / set / foreach
MyBatis-Plus:
- 在 MyBatis 基础上增强 CRUD
- BaseMapper 提供通用增删改查
- Wrapper 负责拼条件
- IService / ServiceImpl 再封装常用业务操作
- 推荐优先使用 LambdaQueryWrapper / lambdaQuery(),更安全13. 一句话记忆
代码块收起展开
简单单表 CRUD 优先 MyBatis-Plus;
复杂多表 SQL 回到 MyBatis XML。