mybatis为什么要写JAVA,为什么Mybatis需要@Param

在一次正常的发布后,线上出现了这么一条错误信息:

caad575672ca

image.png

这是mybatis参数绑定的时候找不到参数了,可是在开发环境明明是正常的呀,查询了相关资料后发现这种情况需要使用@Param指定参数的别名。

默认情况下,Mybatis会读取方法上的参数名称,但是当代码经过编译后,参数名称往往会丢失。比如:

caad575672ca

image.png

java会把参数名编译成var1、var2...之类的名称,所有在开发环境能正常运行的代码,编译后在线上运行就会出问题了。

caad575672ca

image.png

下面列举几种情况必须使用@Param指定参数别名的情况

1. 方法有多个参数的,如:

int insert(@Param("staffName") String staffName, @Param("age") String age);

INSERT INTO user(staff_name, age)value(#{staffName}, #{age})

2. xml中使用了$,如:

List select(@Param("order") String order);

select * from user ORDER BY ${order} desc

(使用

math?formula=%E5%BE%88%E5%AE%B9%E6%98%93%E5%BC%95%E8%B5%B7SQL%E6%B3%A8%E5%85%A5%EF%BC%8C%E5%9B%A0%E6%AD%A4%E5%9C%A8%E5%AE%9E%E9%99%85%E7%94%9F%E4%BA%A7%E4%B8%AD%E5%B0%BD%E5%8F%AF%E8%83%BD%E9%81%BF%E5%85%8D%E4%BD%BF%E7%94%A8)

3. 使用动态SQL,如:

List select(@Param("id") String id);

select * from user

and staff_name = #{id}

所以,这也就解释了为什么有些接口能够正常运行,那就是方法只有一个参数的时候,但是为了风格的统一,建议还是对每一个参数都加上@Param

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一款优秀的持久层框架,它对JDBC的操作数据库的过程进行了封装,使得开发者只需要关注SQL语句本身,而不需要花费精力去处理例如注册驱动、创建连接、创建Statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。在MyBatis中,@Param注解用于给SQL语句中的参数命名,可以在SQL语句中直接引用该参数名,而不是使用默认的参数名。使用@Param注解可以避免因为参数名不同而导致的错误,同时也可以使得SQL语句更加清晰易懂。 举个例子,假设我们有一个查询用户信息的方法: ``` public User getUserById(int id, String name); ``` 如果我们使用MyBatis进行SQL映射,可以这样: ``` <select id="getUserById" resultType="User"> select * from user where id = #{id} and name = #{name} </select> ``` 其中#{id}和#{name}就是使用@Param注解指定的参数名。在Java代码中,我们需要这样调用该方法: ``` User user = getUserById(1, "Tom"); ``` 这里的参数名与SQL语句中的参数名是一致的,因此MyBatis可以正确地将参数传递给SQL语句执行。如果我们不使用@Param注解,则需要这样: ``` <select id="getUserById" resultType="User"> select * from user where id = #{arg0} and name = #{arg1} </select> ``` 这里的#{arg0}和#{arg1}是MyBatis默认的参数名,与Java代码中的参数名不一致,因此需要手动设置参数: ``` User user = getUserById(1, "Tom"); ``` 使用@Param注解可以避免这种手动设置参数的过程,使得代码更加简洁易懂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值