🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄
🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄
🦁 定义
@Param注解的作用是指定方法参数在SQL语句中的名称,从而帮助MyBatis正确处理SQL语句中的占位符,生成正确的SQL语句
🦁 台面使用
在使用MyBatis进行SQL映射时,@Param注解的底层原理主要是基于Java的反射机制实现的。
-
MyBatis解析Mapper接口方法,并获取方法参数类型。
-
遍历方法参数,如果参数上带有@Param注解,则解析该注解,并将注解中的value作为参数名称。
-
将每个参数名称及对应的参数值,以一个Map的形式传递给SQL语句中的参数占位符。
-
MyBatis使用OGNL表达式来从Map中获取对应参数的值,并将其填充到SQL语句中,最终生成完整的SQL语句。
eg:
public User findUserById(@Param("id") Long id, @Param("username") String username);
在上面的方法中,@Param注解中的value值分别为”id”和”username”,表示方法中的第一个参数为”id”,第二个参数为”username”。MyBatis会根据这些参数名和值,动态生成SQL语句,并将处理后的SQL语句传递给数据库执行。
🦁 底层原理分析
@Param注解的源码其实并不长,具体如下:
package org.apache.ibatis.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* The annotation that specify the parameter name.
*
* <p>
* <b>How to use:</b>
*
* <pre>
* public interface UserMapper {
* @Select("SELECT id, name FROM users WHERE name = #{name}")
* User selectById(@Param("name") String value);
* }
* </pre>
*
* @author Clinton Begin
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Param {
/**
* Returns the parameter name.
*
* @return the parameter name
*/
String value();
}
其中public @interface Param是一个注解,在使用MyBatis进行SQL映射时,用于指定参数名称。该注解只用于方法参数上,表示该参数在SQL语句中对应的名称。
从定义中可以看出,@Param注解具有以下特点:
-
@Param注解是一个元注解,即它可以用于注解其他注解。(@Documented限定)
-
@Param注解的保留策略是RUNTIME,即注解在运行时可见。
-
@Param注解只能用于方法参数上,用于指定参数在SQL语句中的名称。
我们来分析一下第3点:
众所周知,在Java中,注解可以用于不同的程序元素(即目标元素),例如类、方法、字段、参数等。为什么@Param就只能用于方法参数上呢?
@Target注解用于指定注解的目标元素类型,以限制注解的使用范围
。而@Param头顶上标注着@Target(ElementType.PARAMETER) ,此注解就如上所说限定了@Param注解只能用于方法参数上,不能用于其他目标元素,但是这也提高了代码的可读性和可维护性。
🦁 尾声
🐇 🐇 😄 🐇 🐇 今天的分享到此结束,咱们下期见!!! 🐇 🐇 😄 🐇 🐇
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/143129.html