MyBaits - 注解

本文深入解读Java内置注解如@Override、@Deprecated和@SuppressWarning,介绍元注解如@Retention、@Target和@Documented的作用。自定义注解如何标记、传值,并以实例说明MyBatis和Results注解在CRUD操作中的实践。

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

  1. 类、方法、变量、参数、包都可标注注解

  2. 注解核心作用:打标记、传递值

Java内置注解

@Override:标注方法上,表示重写方法

@Deprecated:标注在方法上,表示过时方法

@SuppressWarning("all"):标注在方法上,all表示所有忽略警告

元注解

标注在自定义的注解上的注解

@Retention

表示自定义注解在哪个期间有效

值:

RetentionPolicy.SOURCE:源代码期间有效,不被编译进class文件

RetentionPolicy.CLASS:编译期间有效,会被编译进class文件,但不会被加载JVM内存中

RetentionPolicy.RUNTIME:在整个运行期间有效(常用)

@Target

表示自定义注解可被标注在哪些位置

值:

ElementType.Type:表示可标注在类或者接口上

ElementType.METHOD:表示可以标注在方法上

ElementType.FIELD:表示可以标注在属性上

ElementType.PARAMETER:表示可标注在形参上

ElementType.CONSTRUCTOR:表示可以标注在构造方法上

@Documented

表示自定义注解是否被收录进文档中

@Inherited

表示自定义注解是否能够被继承

自定义注解

标记

生成

// 通过元注解指定可以标注在哪些位置以及在哪个期间有效
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
// @interface表示自定义注解,NeedLogin自定义注解名
public @interface NeedLogin {
}

使用

public class Tet {
    @Login
    public void getGoods(){
        System.out.println("需要登录");
    }
    public void getMain(){
        System.out.println("不需要登录");
    }
}

运行

// 获取方法类
Class<Test> testClass = Test.class;
// 获取所有方法
Method[] methods = testClass.getDeclaredMethods();
for (Method method : methods) {
    // 如果是封装方法类,打破封装
    method.setAccessible(true);
    // 判断方法是否有注解
    if(method.isAnnotationPresent(Login.class)){
        System.out.println("你留下");
    }else{
        System.out.println("你走吧");
    }
}

传值

如果只有一个参数,建议将参数名取为value,这样可直接给值

定义

// 标注在属性上
@Target(ElementType.FIELD)
// 整个运行期间有效
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckAge {
    int value() default 18;
    int val() default 20;
    String [] test() default {"a"};
}

使用

// 不给参数名时,给value上
@CheckAge(test= {"A","B"}) 
private int age;

取值:

// 反射获取属性
Class clazz = student.getClass();
Field declaredField = clazz.getDeclaredField("age");
// 打破封装
declaredField.setAccessible(true);
//获取属性对象的注解
CheckAge annotation = declaredField.getAnnotation(CheckAge.class);
//获取注解中的值
int val1 = annotation.value();
int val2 = annotation.val();
String[] test = annotation.test();

MyBaits注解

CRUD

@Select:查询

@Delete:删除

@Update:更新

@Insert:插入

// 商品DAO层接口
public interface Goods {
    //根据ID查询商品
    @Select("SELECT * FROM goods WHERE id=#{id}")
    Products getGoodsId(@Param("id")int id);
    //根据ID删除商品
    @Delete("DELETE FROM goods WHERE id = #{id}")
    int delGoodsId(@Param("id")int id);
    //添加商品
    @Insert("INSERT INTO goods VALUES (DEFAULT,#{goods.name},#{pro.price})")
    int addPro(@Param("goods")Goods goods);
    //更新商品根据ID更新
    @Update("UPDATE goods SET name=#{goods.name},price=#{pro.price} WHERE id=#{goods.id}")
    int updateGoods(@Param("goods")Goods goods);
}

Results注解

@Results作用相当于resultMap

值:

id:给results映射命名

value:result数组(对应参数)

@Result:相当于xml的id(主键)、result(字段)标签

@Results(id = "stu", value = {
    // id:主键
    @Result(column = "s_id", property = "sId", id = true),
    @Result(column = "s_name", property = "sName")
})

@ResultMap 引用定义好的结果集映射

@ResultMap("stu")  //引用一个已经定义好结果集映射

注意:可在接口对应的XML文件定义结果集映射

<resultMap type="Student" id="stu">
    <id column="s_id" property="sId"/>
    <result column="s_name" property="sName"/>
    <association property="course" javaType="course" autoMapping="true">
        <id column="c_id" property="cId"/>
        <result column="s_id" property="sId"/>
        <result column="c_name" property="cName"/>
    </association>
</resultMap>

一对一(多)

@Select("select * from student")
@Results({
    @Result(column = "s_id", property = "sId", id = true),
    @Result(column = "s_name", property = "sName"),
    // 一对一:@one,一对多:@Many
    // select:调用的接口方法
    // fetchType:是否开启延迟加载 - FetchType.LAZY:开启、FetchType.EAGER:关闭
    @Result(property = "teacher", column = "t_id", javaType = Teacher.class, one = @One(select = "selTeacher", fetchType = FetchType.LAZY))
})
List<Student> selStu();
// 被调用的接口方法
@Select("select * from teacher where t_id = #{tid}")
List<Teacher> selTeacher(@Param("tid") Integer tid);

动态SQL

// 动态SQL使用<script>标签包裹
@Select("<script>"+
        "SELECT * FROM student WHERE s_id IN"+
        // 双引号:\"(转义)
        "<foreach collection=\"list\" item=\"i\" open=\"(\" separator=\",\" close=\")\">\r\n"+
        "#{i}"+
        "</foreach>"+
        "</script>")
List<Student> selStu(@Param("list")List list);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值