mybatis中@Param注解中遇到的问题——一定要注意import哪个包

在IDEA中使用MyBatis进行数据库查询时,如果查询参数超过一个,会出现异常。问题根源在于导入了错误的@Param包。正确解决方案是导入org.apache.ibatis.annotations.Param,而不是com.sun.proxy.$Proxy的包。错误的包导致编译时未识别注解,系统通过参数位置反射,而arg0, arg1是自动反射的结果。" 76013824,5143223,深入理解KVM虚拟化技术,"['虚拟化技术', 'Linux内核', 'QEMU', 'KVM管理', '存储虚拟化', '网络虚拟化']

在使用IDEA开发的mybatis查询数据库时,遇到了很奇怪的问题,当查询参数只有一个时,可以正常查到结果,但是如果查询参数有两个,则会抛异常。

mapper.java内容如下

mapper.xml查询如下

 查询findByPhoneA时,系统异常如下: 

 从网上找了一下,有人说把参数名改成arg0,arg1就可以,实际运行了一下,确实可行,但是这不是解决问题的办法。后来请教了一个高手,他说有可能是导包的问题,回过头查看Mapper.java文件,发现问题确实出在这里。

因为开发环境用的是IDEA,在导包时,他默认第一个导入的包如下图,当时没有查看就回车继续了。更换成第二个包,以后上述问题解决。也就是要导入。

import org.apache.ibatis.annotations.Param;

 原因分析:因为导入了错误的包,所以在编译时没有识别注解,系统自动反射了参数的个数,这也就是为啥arg0,arg1可以正常运行。

### 使用方法 `@Select` 注解MyBatis 中用于将 SQL 查询语句直接绑定到接口方法上,适用于简单的查询操作。其基本用法是直接在接口方法上使用 `@Select` 注解,并在注解中指定 SQL 查询语句。 例如: ```java @Select("SELECT * FROM users WHERE id = #{id}") User selectById(int id); ``` ### 动态 SQL 的使用 如果需要在 `@Select` 注解中使用动态 SQL,例如根据条件筛选数据,可以通过 `<script>` 标签裹 SQL 语句,并结合 `<if>` 等标签实现条件判断。在动态 SQL 中需要注意特殊字符的转义处理,如 `<`、`>` 和 `&` 等。 例如: ```java @Select({ "<script>", "SELECT t.* FROM track_name t", "<where>", "<if test='username != null and username != \"\"'>", "AND t.username = #{username}", "</if>", "<if test='gmtCreateTime != null and gmtCreateTime != \"\"'>", "AND t.gmtCreateTime > #{gmtCreateTime}", "</if>", "</where>", "</script>" }) IPage<TrackName> queryCondition(Page<TrackName> page, @Param("username") String username, @Param("gmtCreateTime") String gmtCreateTime); ``` ### 注意事项 - **动态 SQL 需要使用 `<script>` 标签裹**,否则无法正确解析动态内容 [^4]。 - **特殊字符的转义处理** 是必须的,例如 `<` 应该转义为 `<`,`>` 应该转义为 `>`,而 `&` 则应该转义为 `&` [^4]。 - **`@SelectKey` 注解的使用限制**:`@SelectKey` 注解需要与 `@Insert`、`@InsertProvider`、`@Update` 或 `@UpdateProvider` 注解一起使用,单独使用则视为无效 [^2]。 - **`@SelectKey` 注解会覆盖 `@Options` 注解设置的生成主键规则**,这意味着如果指定了 `@SelectKey` 注解,则 MyBatis 会忽略掉由 `@Options` 注解所设置的生成主键 [^1]。 ### 示例代码 以下是一个完整的示例,展示了如何在 MyBatis 中使用 `@Select` 注解进行查询操作: ```java import org.apache.ibatis.annotations.Select; public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectById(int id); } ``` 对于含动态 SQL 的查询,可以参考以下示例: ```java import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public interface TrackNameMapper { @Select({ "<script>", "SELECT t.* FROM track_name t", "<where>", "<if test='username != null and username != \"\"'>", "AND t.username = #{username}", "</if>", "<if test='gmtCreateTime != null and gmtCreateTime != \"\"'>", "AND t.gmtCreateTime > #{gmtCreateTime}", "</if>", "</where>", "</script>" }) IPage<TrackName> queryCondition(Page<TrackName> page, @Param("username") String username, @Param("gmtCreateTime") String gmtCreateTime); } ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值