核心步骤
- 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 构建查询
querywrapper<user> wrapper = new querywrapper<>(); wrapper.like("name", "张") // 模糊查询 name 包含"张" .gt("age", 20) // age > 20 .orderbydesc("create_time"); // 按创建时间倒序 list<user> users = usermapper.selectuserlist(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, "王") // 使用实体类方法引用 .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自定义sql的详细步骤的详细内容,更多关于mybatis-plus wrapper自定义sql的资料请关注代码网其它相关文章!
发表评论