跳到正文
hello world

MyBatis相关笔记,方便以后直接Copy

1. @Select 编写 SQL

public interface UserMapper extends BaseMapper<UserEntity> {

    @Select("SELECT * FROM sys_user WHERE username = #{username}")
    UserEntity selectByUsername(String username);
}

2. 参数建议使用 @Param

@Select("SELECT * FROM sys_user WHERE username = #{username}")
UserEntity selectByUsername(@Param("username") String username);

3. 参数是实体对象

Mapper:

int insertCustom(UserEntity user);

XML:

<insert id="insertCustom">
    INSERT INTO sys_user(username, status)
    VALUES (#{username}, #{status})
</insert>

单个实体参数,不需要写 #{user.username}


4. 实体参数加 @Param

Mapper:

int insertCustom(@Param("user") UserEntity user);

XML:

<insert id="insertCustom">
    INSERT INTO sys_user(username, status)
    VALUES (#{user.username}, #{user.status})
</insert>

因为参数命名为 user,所以需要:

user.username
user.status

5. #{} 与 ${}

#{}

  • 参数占位
  • 自动处理参数类型
  • 字符串无需自己加引号
  • 可以防止 SQL 注入
  • 日常开发推荐使用

${}

  • 字符串直接拼接
  • 存在 SQL 注入风险
  • 谨慎使用

6. 动态 SQL

6.1 <if> + <where>

<select id="selectByCondition"
        resultType="org.example.entity.UserEntity">
    SELECT *
    FROM sys_user

    <where>
        <if test="username != null and username != ''">
            username = #{username}
        </if>

        <if test="status != null">
            AND status = #{status}
        </if>
    </where>
</select>

<where> 作用:

  • 自动添加 WHERE
  • 自动去掉开头多余的 AND

6.2 <set>

<update id="updateUser">
    UPDATE sys_user

    <set>
        <if test="username != null and username != ''">
            username = #{username},
        </if>

        <if test="status != null">
            status = #{status},
        </if>

        <if test="age != null">
            age = #{age},
        </if>
    </set>

    WHERE id = #{id}
</update>

作用:

  • 自动添加 SET
  • 自动删除最后多余的逗号

注意:

如果所有字段都为空,可能生成:

UPDATE sys_user
WHERE id = ?

属于错误 SQL。

业务层应提前判断:

if (user.getUsername() == null
        && user.getStatus() == null
        && user.getAge() == null) {
    throw new IllegalArgumentException("没有需要更新的字段");
}

6.3 更新必须有 WHERE

必须保证:

WHERE id = #{id}

否则可能出现:

UPDATE sys_user
SET status = 0

导致全表更新。

动态更新时重点检查:

  • SET 后是否有字段
  • WHERE 条件是否可靠

6.4 <foreach>

<select id="selectByIds"
        resultType="com.example.entity.UserEntity">
    SELECT id, username, status
    FROM sys_user
    WHERE id IN

    <foreach collection="ids"
             item="id"
             open="("
             separator=","
             close=")">
        #{id}
    </foreach>
</select>

常用于:

  • IN 查询
  • 批量操作

6.5 <choose>

<choose>
    <when test="条件1">
    </when>

    <when test="条件2">
    </when>

    <otherwise>
    </otherwise>
</choose>

等价于:

if (条件1) {

} else if (条件2) {

} else {

}

7. resultMap

复杂查询时可手动指定字段映射:

<resultMap id="userResultMap"
           type="com.example.entity.UserEntity">

    <id column="id" property="id"/>

    <result column="user_name" property="userName"/>

    <result column="user_status" property="status"/>

    <result column="create_time" property="createTime"/>

</resultMap>

8. Generator

package top.xiaolizhi.blog;

import java.net.URI;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;

public class Generator {


    public static void main(String[] args) {
        FastAutoGenerator.create(
                        "jdbc:mysql://127.0.0.1:3306/blog?useSSL=false&serverTimezone=Asia/Shanghai",
                        "root",
                        "root"
                )
                // 全局配置
                .globalConfig(builder -> builder
                        .author("succos")
                        // .outputDir(System.getProperty("user.dir") + "/src/main/java")
                        .outputDir("C:\\Users\\Administrator\\Desktop\\spring-study\\src\\main\\java")
                )

                // 包配置
                .packageConfig(builder -> builder
                        .parent("top.xiaolizhi.blog")
                        .mapper("mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
                        .entity("pojo.entity")
                )

                // 策略
                .strategyConfig(builder -> builder
                        .addInclude("tag") // 表名

                        .entityBuilder()
                        .enableLombok()
                        .enableFileOverride()
                        .formatFileName("%sEntity")

                        .mapperBuilder()
                        .enableFileOverride()

                        .serviceBuilder()
                        .enableFileOverride()

                        .controllerBuilder()
                        .enableRestStyle()
                        .enableFileOverride()
                )

                .execute();
    }
}

9. Mapper 分页

Mapper:

IPage<UserVO> selectUserPage(
        IPage<UserVO> page,
        @Param("username") String username
);

第一个参数:

IPage<UserVO> page

用于接收分页信息。

MyBatis-Plus 会自动生成分页 SQL:

SELECT COUNT(*) ...

查询总数。

SELECT ...
LIMIT ...

查询当前页数据。

XML 中无需再写 LIMIT

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读