开发者

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)其它相关文章!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜