MyBatis-Plus中使用Wrapper自定义SQL的详细步骤
目录
- 核心步骤
- 示例一:XML 方式实现自定义 SQL
- 1. Mapper 接口声明
- 2. XML 映射文件(如 UserMapper.xml)
- 3. 使用 Wrapper 构建查询
- 示例二:注解方式实现自定义 SQL
- Mapper 接口直接写 SQL
- 示例三:联表查询 + Wrapper
- 1. Mapper 接口
- 2. XML 映射文件
- 3. 使用 LambdaWrapper(避免硬编码字段名)
- 注意事项
- 总结
核心步骤
- Mapper 接口定义方法 使用
@Param("ew")
注解声明 Wrapper 参数,在 SQL 中通过${ew.customSqlSegment}
引用条件。 - XML 或注解编写 SQL 在 SQL 中嵌入
${ew.customSqlSegment}
,MyBATis-Plus 会自动替换为 Wrapper 生成的 WHERE 语句(包含WHERE
关键字)。 - Wrapper 构建条件 使用
QueryWrapper
/LambdaQueryWrapper
组装条件,注意字段名与 SQL 中的别名一致。
示例一:XML 方式实现自定义 SQL
1. Mapper 接口声明
public interface UserMapper extends BaseMapper<User> { // 使用 @Param("ew") 定义 Wrapper 参数 List<User> selectUserList(@Param("ew") Wrapper<User> wrapper); }
2. XML 映射文件(如 UserMapper.xml)
<select id="selectUserList" resultType="User"> SELECT id, name, age, email FROM user ${ew.customSqlSegment} <!-- 自动注入 WHERE 及条件 --> </select>
3. 使用 Wrapper 构建查询
QueryWraphppper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张android") // 模糊查询 name 包含"张" .gt("age", 20) // age > 20 .orderByDesc("create_time"); // 按创建时间倒序 List<User> users = userMapper.selec编程tUserList(wrapper);
生成的 SQL:
SELECT id, name, age, email FROM user WHERE name LIKE '%张%' AND age > 20 ORDER BY create_time DESC
示例二:注解方式实现自定义 SQL
Mapper 接口直接写 SQL
@Select("SELECT * FROM user ${ew.customSqlSegment}") List<User> selectByWrapper(@Param("ew") Wrapper<User> wrapper);
示例三:联表查询 + Wrapper
1. Mapper 接口
List<UserVO> selectUserWithRole(@Param("ew") Wrapper<User> wrapper);
2. XML 映射文件
<select id="selectUserWithRole" resultType="UserVO"> SELECT u.*, r.role_name FROM user u LEFT JOIN role r ON u.role_id = r.id ${ew.customSqlSegment} <!-- 注入条件 --> </select>
3. 使用 LambdaWrapper(避免硬编码字段名)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.like(User::getName, "王") // 使用实体类方法引用 www.devze.com .eq(User::getStatus, 1) // status = 1 .nested(i -> i.gt(User::getAge, 18).or().isNotNull(User::getEmail)); // 嵌套条件 List<UserVO> list = userMapper.selectUserWithRole(wrapper);
生成的 SQL:
SELECT u.*, r.role_name FROM user u LEFT JOIN role r ON u.role_id = r.id WHERE ( name LIKE '%王%' AND status = 1 AND (age > 18 OR email IS NOT NULL) )
注意事项
- 防止 SQL 注入
${ew.customSqlSegment}
内部使用预编译安全处理,但避免在 SQL 中直接拼接${xxx}
(除 MyBatis-Plus 官方占位符外)。 - 表别名问题 若 SQL 中使用别名(如
u.name
),Wrapper 条件需同步声明别名:
wrapper.like("u.name", "张"); // XML 中表别名为 u
- 空 Wrapper 处理 若 Wrapper 无条件,
${ew.customSqlSegment}
生成空字符串,SQL 仍合法。 - 复杂 SQL 场景 如需分组、聚合函数等,直接在 SQL 中编写,Wrapper 仅负责 WHERE 条件部分。
总结
- 核心占位符:
${ew.customSqlSegment}
注入动态条件。 - 条件构造:通过
QueryWrapper
或LambdaWrapper
构建树状条件(支持and
/or
嵌套)。 - 安全机制:MyBatis-Plus 自动处理参数预编译,防止注入风险。
此方案完美契合 MyBatis-Plus 设计哲学,在保留原生 MyBatis 灵活性的同时,极大简化动态 SQL 编写。
以上就是MyBatis-Plus中使用Wrapper自定义SQLphp的详细步骤的详细内容,更多关于MyBatis-Plus Wrapper自定义SQL的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论