MyBatisAPI · Redis详解

MyBatis 与 MyBatis-Plus 高频 API 速查

适合单体项目 / SSM / Spring Boot 后端开发快速查阅。


1. 总览

代码块TEXT · 30 行收起展开
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

代码块JAVA · 6 行收起展开
@Mapper
public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User selectById(Long id);
}

用途:

  • 简单单表查询
  • SQL 很短、逻辑不复杂

2.2 @Insert

代码块JAVA · 2 行收起展开
@Insert("insert into user(username, age) values(#{username}, #{age})")
int insert(User user);

返回值:

  • 一般是影响行数

2.3 @Update

代码块JAVA · 2 行收起展开
@Update("update user set username = #{username}, age = #{age} where id = #{id}")
int updateById(User user);

2.4 @Delete

代码块JAVA · 2 行收起展开
@Delete("delete from user where id = #{id}")
int deleteById(Long id);

2.5 @Param

多个参数时很常用。

代码块JAVA · 3 行收起展开
@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 接口

代码块JAVA · 4 行收起展开
public interface UserMapper {
    List<User> selectByCondition(@Param("name") String name,
                                 @Param("minAge") Integer minAge);
}

XML

代码块XML · 11 行收起展开
<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 &gt;= #{minAge}
        </if>
    </where>
</select>

适用场景:

  • 条件查询
  • 多条件动态拼接
  • SQL 逻辑稍复杂的单表查询

2.7 <if>

代码块XML · 3 行收起展开
<if test="status != null">
    and status = #{status}
</if>

作用:

  • 条件满足才拼接 SQL

2.8 <where>

代码块XML · 8 行收起展开
<where>
    <if test="name != null">
        and username = #{name}
    </if>
    <if test="age != null">
        and age = #{age}
    </if>
</where>

作用:

  • 自动处理多余的 and
  • 自动补 where

2.9 <set>

代码块XML · 9 行收起展开
<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>

批量查询

代码块XML · 6 行收起展开
<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

代码块JAVA · 1 行收起展开
List<User> selectByIds(@Param("ids") List<Long> ids);

高频场景:

  • in 查询
  • 批量删除
  • 批量插入拼值列表

2.11 resultType

代码块XML · 3 行收起展开
<select id="selectById" resultType="com.demo.entity.User">
    select * from user where id = #{id}
</select>

作用:

  • 将查询结果直接映射为对象类型

2.12 resultMap

当数据库字段名和 Java 属性名不一致时很有用。

实体类

代码块JAVA · 5 行收起展开
public class User {
    private Long id;
    private String userName;
    private LocalDateTime createTime;
}

XML

代码块XML · 9 行收起展开
<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

代码块JAVA · 16 行收起展开
@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

代码块XML · 37 行收起展开
<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 &gt;= #{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>

代码块JAVA · 2 行收起展开
public interface UserMapper extends BaseMapper<User> {
}

继承后即可直接使用通用 CRUD。


3.2 insert

代码块JAVA · 5 行收起展开
User user = new User();
user.setUsername("Gilbert");
user.setAge(20);

userMapper.insert(user);

3.3 deleteById

代码块JAVA · 1 行收起展开
userMapper.deleteById(1L);

3.4 deleteBatchIds

代码块JAVA · 1 行收起展开
userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L));

3.5 updateById

代码块JAVA · 6 行收起展开
User user = new User();
user.setId(1L);
user.setUsername("Arwen");
user.setAge(21);

userMapper.updateById(user);

特点:

  • 根据主键更新

3.6 selectById

代码块JAVA · 1 行收起展开
User user = userMapper.selectById(1L);

3.7 selectBatchIds

代码块JAVA · 1 行收起展开
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));

3.8 selectList

代码块JAVA · 4 行收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1).orderByDesc("create_time");

List<User> list = userMapper.selectList(wrapper);

3.9 selectOne

代码块JAVA · 4 行收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username", "Gilbert");

User user = userMapper.selectOne(wrapper);

注意:

  • 结果必须只有一条,否则可能报错

3.10 selectCount

代码块JAVA · 4 行收起展开
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1);

Long count = userMapper.selectCount(wrapper);

3.11 selectPage

代码块JAVA · 9 行收起展开
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

代码块JAVA · 7 行收起展开
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

更推荐,字段更安全。

代码块JAVA · 7 行收起展开
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")
inin 查询in("id", ids)
between区间between("age", 18, 30)
isNull判空isNull("email")
isNotNull非空isNotNull("phone")
orderByAsc升序orderByAsc("sort")
orderByDesc降序orderByDesc("create_time")
lastSQL 尾拼接last("limit 1")

4.4 条件成立才拼接

代码块JAVA · 8 行收起展开
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

代码块JAVA · 4 行收起展开
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("status", 0).set("status", 1);

userMapper.update(null, wrapper);

对应 SQL:

代码块SQL · 1 行收起展开
update user set status = 1 where status = 0

5.2 LambdaUpdateWrapper

代码块JAVA · 5 行收起展开
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getStatus, 0)
       .set(User::getStatus, 1);

userMapper.update(null, wrapper);

5.3 实体 + 条件更新

代码块JAVA · 7 行收起展开
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 接口

代码块JAVA · 2 行收起展开
public interface UserService extends IService<User> {
}

实现类

代码块JAVA · 4 行收起展开
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {
}

6.2 save

代码块JAVA · 5 行收起展开
User user = new User();
user.setUsername("Gilbert");
user.setAge(20);

userService.save(user);

6.3 saveBatch

代码块JAVA · 1 行收起展开
userService.saveBatch(Arrays.asList(user1, user2, user3));

6.4 getById

代码块JAVA · 1 行收起展开
User user = userService.getById(1L);

6.5 list

查全部

代码块JAVA · 1 行收起展开
List<User> users = userService.list();

带条件

代码块JAVA · 4 行收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1);

List<User> users = userService.list(wrapper);

6.6 getOne

代码块JAVA · 4 行收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, "Gilbert");

User user = userService.getOne(wrapper);

6.7 page

代码块JAVA · 6 行收起展开
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

代码块JAVA · 5 行收起展开
User user = new User();
user.setId(1L);
user.setAge(22);

userService.updateById(user);

6.9 update

代码块JAVA · 5 行收起展开
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getId, 1L)
       .set(User::getAge, 23);

userService.update(wrapper);

6.10 removeById

代码块JAVA · 1 行收起展开
userService.removeById(1L);

6.11 remove

代码块JAVA · 4 行收起展开
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 0);

userService.remove(wrapper);

7. 链式调用 API

7.1 query()

代码块JAVA · 4 行收起展开
List<User> users = userService.query()
        .eq("status", 1)
        .orderByDesc("create_time")
        .list();

7.2 lambdaQuery()

推荐。

代码块JAVA · 5 行收起展开
List<User> users = userService.lambdaQuery()
        .eq(User::getStatus, 1)
        .like(User::getUsername, "Gil")
        .orderByDesc(User::getCreateTime)
        .list();

7.3 one()

代码块JAVA · 3 行收起展开
User user = userService.lambdaQuery()
        .eq(User::getId, 1L)
        .one();

7.4 count()

代码块JAVA · 3 行收起展开
long count = userService.lambdaQuery()
        .eq(User::getStatus, 1)
        .count();

7.5 lambdaUpdate()

代码块JAVA · 4 行收起展开
userService.lambdaUpdate()
        .eq(User::getId, 1L)
        .set(User::getUsername, "Arwen")
        .update();

8. 实体类常见注解

8.1 @TableName

代码块JAVA · 3 行收起展开
@TableName("tb_user")
public class User {
}

8.2 @TableId

代码块JAVA · 2 行收起展开
@TableId(type = IdType.AUTO)
private Long id;

8.3 @TableField

代码块JAVA · 2 行收起展开
@TableField("create_time")
private LocalDateTime createTime;

8.4 @TableField(exist = false)

代码块JAVA · 2 行收起展开
@TableField(exist = false)
private String extraInfo;

作用:

  • 该属性不是数据库字段

9. 实战模板对照

9.1 按 id 查询

MyBatis

代码块JAVA · 2 行收起展开
@Select("select * from user where id = #{id}")
User selectById(Long id);

MyBatis-Plus

代码块JAVA · 1 行收起展开
User user = userMapper.selectById(id);

9.2 条件查询列表

MyBatis XML

代码块XML · 8 行收起展开
<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

代码块JAVA · 3 行收起展开
List<User> users = userService.lambdaQuery()
        .like(name != null && !name.isEmpty(), User::getUsername, name)
        .list();

9.3 分页查询

MyBatis

代码块XML · 5 行收起展开
<select id="selectPage" resultType="User">
    select * from user
    order by create_time desc
    limit #{offset}, #{size}
</select>

MyBatis-Plus

代码块JAVA · 5 行收起展开
Page<User> page = new Page<>(current, size);
Page<User> result = userService.page(
        page,
        new LambdaQueryWrapper<User>().orderByDesc(User::getCreateTime)
);

9.4 按条件更新

MyBatis

代码块XML · 3 行收起展开
<update id="updateStatusById">
    update user set status = #{status} where id = #{id}
</update>

MyBatis-Plus

代码块JAVA · 4 行收起展开
userService.lambdaUpdate()
        .eq(User::getId, id)
        .set(User::getStatus, status)
        .update();

9.5 批量查询

MyBatis

代码块XML · 6 行收起展开
<select id="selectByIds" resultType="User">
    select * from user where id in
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

MyBatis-Plus

代码块JAVA · 1 行收起展开
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 必会

  • selectById
  • selectList
  • selectPage
  • insert
  • updateById
  • deleteById
  • LambdaQueryWrapper
  • LambdaUpdateWrapper
  • lambdaQuery()
  • lambdaUpdate()
  • save
  • getById
  • list
  • page

12. 面试 / 笔记版超短总结

代码块TEXT · 12 行收起展开
MyBatis:
- 核心是自己写 SQL
- 简单场景可用注解
- 复杂场景常用 XML + 动态 SQL
- 高频标签:if / where / set / foreach

MyBatis-Plus:
- 在 MyBatis 基础上增强 CRUD
- BaseMapper 提供通用增删改查
- Wrapper 负责拼条件
- IService / ServiceImpl 再封装常用业务操作
- 推荐优先使用 LambdaQueryWrapper / lambdaQuery(),更安全

13. 一句话记忆

代码块TEXT · 2 行收起展开
简单单表 CRUD 优先 MyBatis-Plus;
复杂多表 SQL 回到 MyBatis XML。