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。
评论
填写昵称与邮箱即可评论,无需登录。