MyBatis传入多个参数,通过多个变量接收多个参数(Springboot+mybatis Plus+mysql)

本文详细介绍了在MyBatis框架中如何实现多参数的传递与接收,通过具体实例展示了service层、serviceImpl层、Dao层及XML配置文件的编写方法,为开发者提供了实用的代码示例。

MyBatis传入多个参数,通过多个变量接收多个参数
1.目录结构如图
在这里插入图片描述
2.service层的编写

public interface NiotCollectorService extends IService<NiotCollectorEntity> {
    NiotCollectorEntity findByCollectorNumAndItemType(String collectorNum, String itemType);
}

serviceImpl

@Service
public class NiotCollectorServiceimpl extends ServiceImpl<NiotCollectorDao, NiotCollectorEntity> implements NiotCollectorService {

    @Autowired
    private NiotCollectorDao niotCollectorDao;

    @Override
    public NiotCollectorEntity findByCollectorNumAndItemType(String collectorNum, String itemType) {
       NiotCollectorEntity collectorEntity = niotCollectorDao.findByCollectorNumAndItemType(collectorNum,itemType);
        return collectorEntity;
    }
}

3.Dao层的编写

@Mapper
public interface NiotCollectorDao extends BaseMapper<NiotCollectorEntity> {
    NiotCollectorEntity findByCollectorNumAndItemType(String collectorNum, String itemType);
}

4.XML文件的编写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.northmeter.app.niotcollector.dao.NiotCollectorDao">
	<select id="findByCollectorNumAndItemType" parameterType="String"
			resultType="com.northmeter.app.niotcollector.entity.NiotCollectorEntity">
		select * from niot_collector where collector_num = #{arg0} and item_type = #{arg1}
	</select>
</mapper>
<think>首先,用户的问题是:“解决Spring Boot + MyBatis查询参数传百分号导致结果显示全部数据的问题”。他们提供了引用内容,我需要基于这些引用来回答。 从引用[1]中,关键点是:MyBatis的Mapper定义,以及如何处理分页查询等。 引用[2]讨论了用户遇到的问题,包括SQL错误和查询问题,特别是提到了模糊查询和类型查询的问题。用户提到在模糊查询中,使用了全局变量导致问题,后来改用session变量解决了。 引用[3]直接相关:它说“如果字段类型为String且包含%, 将使用like 进行查询”,这仅对select和delete有效。insert和update不受影响。这暗示了当查询参数包含%时,MyBatis可能会自动使用like查询。 引用[4]提到了QueryWrapper和分页查询,但用户的问题是关于查询参数传百分号的问题。 用户的问题:当查询参数中包含百分号时,结果显示全部数据。这很可能是因为百分号在SQL中用于模糊查询(like操作符),所以如果参数包含%,它可能被解释为模糊匹配,导致返回所有匹配的数据。 例如,如果用户在搜索中输入“%”,它可能被解释为匹配任何字符,从而返回所有记录。 从引用[3]中:“在调用Mapper方法时传入相应的实体, 如果字段类型为String且包含%, 将使用like 进行查询”。这明确说明当实体字段包含%时,MyBatis会使用like查询。所以,如果用户传入一个包含%的字符串,MyBatis可能会自动构建一个like查询,其中%被视为通配符。 为了解决问题,我需要提供方法来避免这种行为,或者正确地处理百分号。 可能的解决方案: 1. 在传入参数前,转义百分号。例如,在参数中,将%替换为\%,这样它在SQL中被视为字面百分号。 2. 在MyBatis的XML映射文件中,使用显式的绑定或函数来处理特殊字符。例如,使用ESCAPE子句在like查询中。 3. 修改查询逻辑,使其仅在需要模糊查询时使用like操作符;否则,使用等于操作符。 从引用[2]中,用户提到在模糊查询中遇到问题,并使用session变量解决了变量保存问题。但这里的问题是参数包含%导致错误行为。 结构回答: - 根据系统指令,使用中文回答。 - 结构清晰:解释问题、分析原因、提供解决方案。 - 生成相关问题(在末尾)。 - 在回答中引用段落末尾添加引用标识,如[^1]。 步骤: 1. **引言解释问题**:简述当查询参数中包含百分号时,可能会导致MyBatis错误地使用like查询,从而返回所有数据。 2. **分析原因**:引用[3]指出MyBatis动态查询时,会根据实体字段是否包含%自动使用like查询。这可能导致意外行为。 3. **提供解决方案**: - 方法1:在业务层处理参数,转义百分号。例如,使用Java字符串替换%为\%。 - 方法2:在MyBatis映射文件中,自定义SQL,使用ESCAPE来处理like查询,如LIKE #{param} ESCAPE '\'。 - 方法3:考虑是否需要模糊查询;如果不是,强制使用等于操作符。 - 从引用[4],提到了QueryWrapper,如果需要,可以使用MyBatis Plus的Wrapper来构建查询。 4. **代码示例**:提供简单的代码片段显示如何转义参数或修改SQL。 5. **生成相关问题**:在末尾添加相关问题。 确保回答真实可靠,基于提供的引用。 最终回答结构: - 问题描述 - 原因分析 - 解决方案 - 代码示例 - 相关问题 添加引用:在相关地方添加[^1]、[^2]等。 相关问题例子: 1. 如何在MyBatis中安全地进行模糊查询? 2. 如何处理SQL注入风险? 3. MyBatis的其他常见问题解决方法? </think>### 解决Spring Boot + MyBatis查询参数传百分号导致结果显示全部数据的问题 当在Spring Boot + MyBatis应用中传递查询参数包含百分号(%)时,可能会出现查询结果返回全部数据的问题。这是因为MyBatis在某些场景下会自动将包含%的参数解释为模糊查询(like操作符),导致SQL查询变为匹配任意字符的通配符模式。下面我将逐步分析原因并提供解决方案,确保查询行为符合预期。 #### 问题原因分析 根据引用[3],MyBatis的动态查询机制在调用Mapper方法时,如果传入的实体字段为字符串类型且包含百分号(%),MyBatis会自动将该查询转换为like操作符的模糊查询[^3]。例如: - 如果参数为`"%"`,生成的SQL可能类似 `WHERE column LIKE '%'`,这会匹配所有非空,返回表中所有数据。 - 这种行为仅对select和delete操作有效(insert和update不受影响),如果不加以控制,可能导致数据泄漏或性能问题[^3]。 此外,引用[2]中提到在模糊查询中处理全局变量时,变量保存问题可能导致查询逻辑错误,但核心问题在于SQL解析机制[^2]。 #### 解决方法 针对此问题,以下是三种常用解决方案(按推荐顺序排列)。所有方法都基于在业务层或SQL层转义或显式处理百分号,确保其被当作普通字符而非通配符。 ##### 解决方案1: 在业务层转义百分号(推荐) 在调用Mapper方法前,在Service层对查询参数进行预处理,将百分号转义为字面字符。使用Java的字符串替换即可实现。 - **步骤**: 1. 在Service中,将参数中的%替换为\%,以防止MyBatis自动触发like查询。 2. 确保Mapper接口接收转义后的参数。 - **代码示例**: ```java // UserService.java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> searchUsers(String keyword) { // 转义百分号:将"%"替换为"\%",使其在SQL中视为普通字符 String escapedKeyword = keyword.replace("%", "\\%"); return userMapper.findByKeyword(escapedKeyword); } } // UserMapper.java @Mapper public interface UserMapper { // 在XML中定义SQL,使用等于操作符而非like List<User> findByKeyword(String keyword); } <!-- UserMapper.xml --> <select id="findByKeyword" resultType="User"> SELECT * FROM users WHERE username = #{keyword} <!-- 使用等于操作符,避免自动like --> </select> ``` - **优点**:简单高效,不需要修改SQL逻辑;适用于参数明确为精确查询的场景[^3]。 ##### 解决方案2: 在MyBatis SQL映射中使用ESCAPE子句 如果模糊查询是必要的(如部分匹配需求),在MyBatis的XML映射文件中显式使用LIKE和ESCAPE子句,指定转义字符。 - **步骤**: 1. 在XML中,添加ESCAPE '\'来处理%,确保%不被误解为通配符。 2. 在参数中保留%,但通过SQL语法控制行为。 - **代码示例**: ```xml <!-- UserMapper.xml --> <select id="findByKeyword" resultType="User"> SELECT * FROM users WHERE username LIKE #{keyword} ESCAPE '\' <!-- 使用ESCAPE转义% --> </select> ``` - **使用场景示例**: - 参数传入`"50\%"`(业务层需转义为`"50\\%"`),SQL解析为 `LIKE '50\%' ESCAPE '\'`,这会精确匹配字符串结尾为%的文本。 - **优点**:灵活支持模糊查询;避免自动转换问题[^3]。 ##### 解决方案3: 使用MyBatis Plus的QueryWrapper构建查询(可选) 如果项目集成了MyBatis Plus(如引用[4]中的QueryWrapper),可以显式指定查询操作符,避免动态行为。 - **步骤**: 1. 在Service中使用QueryWrapper定义查询条件。 2. 使用`eq`方法强制等于操作符,而不是like。 - **代码示例**: ```java // UserService.java public List<User> searchUsers(String keyword) { QueryWrapper<User> wrapper = new QueryWrapper<>(); // 使用eq方法确保精确匹配,转义参数 wrapper.eq("username", keyword.replace("%", "\\%")); return userMapper.selectList(wrapper); } ``` - **优点**:利用MyBatis Plus的高级特性,代码更简洁;适合复杂查询场景[^4]。 #### 注意事项 - **SQL注入风险**:始终对用户输入进行校验和转义。方法1中的字符串替换可以防止%导致的误解析,但还需配合其他安全措施(如MyBatis参数绑定)来防范注入攻击。 - **性能影响**:如果参数经常包含%,方法2的ESCAPE子句可能增加少量开销;方法1在业务层处理更轻量。 - **兼容性**:以上方法适用于Spring Boot 2.x/3.x和MyBatis 3.x版本。确保数据库驱动支持ESCAPE语法(如MySQL、PostgreSQL均兼容)。 通过以上方法,可以有效解决查询参数传百分号导致结果显示全部数据的问题。核心思路是控制MyBatis的动态查询行为,使%被当作字面字符而非通配符。 #### 相关问题 1. 如何在MyBatis中安全地实现模糊查询?(提示:结合ESCAPE子句和参数校验避免通配符误用) 2. MyBatis的事务管理如何处理?(提示:使用Spring的@Transactional注解管理事务[^1]) 3. 如何优化MyBatis的批量查询性能?(提示:使用分页插件如PageHelper,或设置连接池参数[^1][^4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值