Mybatis的XxxMapper.xml中模糊查询条件如何拼接

本文详细介绍了在MyBatis中实现模糊查询的两种方法,包括使用concat构造模糊查询条件和绑定模糊查询条件的方式,通过具体示例展示了如何在mapper接口和XML文件中实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里举一MySQL中模糊查询例子:

select count(*) from `movie` where gids like concat('%',1,'%');

上面指令用于查询movie表中gids字段带有1的行数

在Mybatis中如何拼接这种模糊查询字符串呢?

首先看下mapper接口中定义的方法:

    /**
     * 根据模糊条件查询电影数量
     * @param gids 模糊搜索条件
     * @return
     */
    long getCountByGenre(@Param("gids")String gids);

那么再看下MovieMapper.xml中关于该条查询语句的模糊查询:

方式①

    <select id="getCountByGenre" resultType="long">
        <!--使用concat构造模糊查询条件-->
        select count(*) from `movie` where gids like concat('%',#{gids},'%');
    </select>

方式②

    <select id="getCountByGenre" resultType="long">
        <!--绑定模糊查询条件-->
        <bind name="vague_gids" value="'%'+gids+'%'"/>
        select count(*) from `movie` where gids like #{vague_gids};
    </select>

 

<think>好的,我现在需要帮助用户了解如何在MyBatis中编写SQL语句。首先,我应该根据用户提供的三个引用来整理信息,并确保回答符合他们的要求。 首先,用户提到的引用[1]提到MyBatis-Plus提供了CRUD方法和自定义SQL,这可能涉及到基本的SQL编写以及扩展方法。引用[2]给出了一个具体示例,可能需要包含配置文件和Mapper的示例代码。引用[3]特别强调了多表查询的处理,说明MyBatis不关心单表还是多表,只要结果映射正确。 接下来,我需要确保回答结构清晰,分步骤说明方法,并提供示例。可能需要包括XML配置、注解方式、动态SQL、多表查询以及MyBatis-Plus的使用。每个部分都需要结合引用中的内容,比如引用[3]中的多表查询部分,需要强调结果映射和属性对应。 另外,用户要求生成相关问题,我需要考虑用户可能进一步想知道的内容,比如动态SQL的具体标签、如何防止SQL注入、结果映射的细节等。还要注意使用正确的中文表达,避免技术术语错误,并检查LaTeX格式是否正确应用,虽然用户的问题中没有数学公式,但按照系统指令,如果有数学内容需要正确使用格式。 还需要检查是否遗漏了用户提到的任何关键点,比如MyBatis-Plus的增强功能,或者多表查询中的属性对应问题。同时,示例代码要准确,比如在XML中编写SQL,或者使用@Select注解,这些都需要正确展示。 最后,确保在回答末尾添加相关问题,这些问题应该与MyBatis编写SQL相关,涵盖优化、动态SQL、多表查询、结果集处理等方面,帮助用户深入理解。</think>### MyBatis 编写 SQL 的方法和示例 #### 1. **XML 映射文件编写 SQL** MyBatis 的核心是通过 XML 文件或注解定义 SQL 语句。XML 文件通常用于复杂 SQL,支持动态 SQL 和结果映射。 **示例**: ```xml <!-- UserMapper.xml --> <select id="selectUserById" resultType="User"> SELECT id, name, email FROM user WHERE id = #{id} </select> ``` 此示例通过 `#{id}` 占位符实现参数绑定,`resultType` 指定返回的实体类[^2]。 --- #### 2. **注解方式编写 SQL** 对于简单 SQL,可直接在 Mapper 接口中使用注解(如 `@Select`、`@Update`)。 **示例**: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{keyword}, '%')") List<User> searchUsersByName(String keyword); } ``` 此方法通过注解实现模糊查询,`#{keyword}` 自动转义防止 SQL 注入。 --- #### 3. **动态 SQL 编写** MyBatis 提供 `<if>`、`<choose>`、`<foreach>` 等标签处理动态条件。 **示例(多条件查询)**: ```xml <select id="findUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="email != null"> AND email = #{email} </if> </where> </select> ``` `<where>` 标签自动去除多余的 `AND` 或 `OR`,避免语法错误[^1]。 --- #### 4. **多表关联查询** 通过联表 SQL 和结果映射实现,需确保实体类包含关联字段。 **示例(用户与订单联查)**: ```xml <select id="getUserWithOrders" resultMap="UserOrderMap"> SELECT u.*, o.order_id, o.amount FROM user u LEFT JOIN orders o ON u.id = o.user_id </select> <resultMap id="UserOrderMap" type="User"> <id property="id" column="id"/> <collection property="orders" ofType="Order"> <result property="orderId" column="order_id"/> <result property="amount" column="amount"/> </collection> </resultMap> ``` 此处通过 `<resultMap>` 定义嵌套集合映射,关联用户和订单数据[^3]。 --- #### 5. **结合 MyBatis-Plus 简化 SQL** MyBatis-Plus 提供通用 Mapper 方法,减少基础 SQL 编写。 **示例(条件构造器)**: ```java // 查询 name 包含 "Tom" 且年龄大于 18 的用户 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(User::getName, "Tom").gt(User::getAge, 18); List<User> users = userMapper.selectList(queryWrapper); ``` 通过条件构造器生成 SQL,避免手写复杂条件。 --- ### 关键注意事项 - **防 SQL 注入**:始终使用 `#{}` 占位符(预编译),而非字符串拼接 `${}`。 - **结果映射**:多表查询时需定义 `<resultMap>` 确保字段与属性匹配[^3]。 - **日志调试**:启用 MyBatis SQL 日志(配置 `logging.level.xxxMapper=DEBUG`)可查看实际执行的 SQL。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值