mybatis的@Param注解在Controller层的也可以传递参数

本文记录了解决一个MyBatis参数绑定异常的过程,该异常表现为无法找到指定参数名。通过添加@Param注解并正确命名参数解决了问题,同时介绍了如何在Controller层处理请求参数编码问题。

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

今天又解决了一个bug。

可能单纯就是乱码导致的。但是其中遇到几个问题。

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [userName, param1] org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:76) org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:421) com.sun.proxy.$Proxy17.selectOne(Unknown Source) org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166) org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:69) org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)

............

解决办法:

Mapper.java中原来是:

    public void delete(String specName);

修改为:

    public void delete(@Param("specName") String specName);

@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 

public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id); 
给入参 String name 命名为aaaa,然后sql语句....where  s_name= #{aaaa} 中就可以根据aaaa得到参数值了


Controller的代码

    @RequiresRoles("admin")
    @RequestMapping("delete")
    public String delete(Model model,HttpServletRequest request) throws UnsupportedEncodingException{
    String specName=request.getParameter("specName");
    byte[] bs=specName.getBytes("ISO8859-1");
    specName=new String(bs,"UTF-8");
    model.addAttribute("sepcName",specName);
        specBiz.delete(specName);
        return "redirect:/spec.do/spec.view";
    }




然后有个问题就是数据库的数据,因为id是自增的,删除数据后,中间的就被删除,再次添加是直接往后顺着自增,前面就有空出的索引值

### MyBatis Plus 中 `@Param` 注解与 `QueryWrapper` 结合使用的查询示例 在 MyBatis Plus 中,为了实现更加灵活和安全的查询操作,可以结合使用 `@Param` 注解以及 `QueryWrapper` 工具类。这不仅能够提高代码可读性和维护性,还能有效防止SQL注入攻击。 #### 定义实体类 假设有一个简单的账户表对应的Java Bean: ```java public class Account { private Integer id; private String name; private String num; // Getters and Setters... } ``` #### 创建 Mapper 接口并应用 `@Param` 注解 通过创建一个接口继承自 BaseMapper 来映射数据库的操作,在此过程中可以通过 `@Param` 明确指定传入参数的名字以便于后续构建复杂的查询逻辑。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; public interface AccountMapper extends BaseMapper<Account> { List<Account> selectAccountsByConditions(@Param("name") String name, @Param("num") String num); } ``` #### 构建动态查询条件——利用 `QueryWrapper` 当需要根据不同的业务需求组合多个字段作为过滤条件时,推荐采用 `QueryWrapper` 类来进行封装处理。这种方式允许开发者按照实际场景自由增删修改查询项而无需频繁调整底 SQL 语句。 ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import java.util.List; // Service Layer or Controller Logic List<Account> getFilteredAccounts(String name, String num){ QueryWrapper<Account> queryWrapper = new QueryWrapper<>(); if(name != null && !"".equals(name.trim())){ queryWrapper.eq("name", name); } if(num != null && !"0".equals(num)){ queryWrapper.eq("num", num); } return accountMapper.selectList(queryWrapper); } ``` 上述例子展示了如何基于给定的名字(`name`)和编号(`num`)两个属性值来筛选符合条件的数据记录[^1]。值得注意的是,这里并没有直接书写任何原生SQL片段而是借助了框架提供的高级API完成同样的功能[^2]。 对于更复杂的情况比如模糊匹配、范围查找等,则可以在相应的地方调用其他的方法如`.like()` 或 `.between()` 等进一步完善查询表达式[^3]。 此外,当传递单个对象而非散列参数时,可以直接将整个 JavaBean 实体传入到 `QueryWrapper` 中去自动解析其非空成员变量参与最终形成的WHERE子句[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值