当前位置: 代码网 > it编程>编程语言>Java > MyBatis-Plus中使用Wrapper自定义SQL的详细步骤

MyBatis-Plus中使用Wrapper自定义SQL的详细步骤

2025年07月11日 Java 我要评论
核心步骤mapper 接口定义方法 使用 @param("ew") 注解声明 wrapper 参数,在 sql 中通过 ${ew.customsqlsegment} 引用条件。xm

核心步骤

  • 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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com