• MyBaits - 注解


    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

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

    自定义注解

    标记

    生成

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

    使用

    1. public class Tet {
    2.    @Login
    3.    public void getGoods(){
    4.        System.out.println("需要登录");
    5.   }
    6.    public void getMain(){
    7.        System.out.println("不需要登录");
    8.   }
    9. }

    运行

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

    传值

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

    定义

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

    使用

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

    取值:

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

    MyBaits注解

    CRUD

    @Select:查询

    @Delete:删除

    @Update:更新

    @Insert:插入

    1. // 商品DAO层接口
    2. public interface Goods {
    3. //根据ID查询商品
    4. @Select("SELECT * FROM goods WHERE id=#{id}")
    5. Products getGoodsId(@Param("id")int id);
    6. //根据ID删除商品
    7. @Delete("DELETE FROM goods WHERE id = #{id}")
    8. int delGoodsId(@Param("id")int id);
    9. //添加商品
    10. @Insert("INSERT INTO goods VALUES (DEFAULT,#{goods.name},#{pro.price})")
    11. int addPro(@Param("goods")Goods goods);
    12. //更新商品根据ID更新
    13. @Update("UPDATE goods SET name=#{goods.name},price=#{pro.price} WHERE id=#{goods.id}")
    14. int updateGoods(@Param("goods")Goods goods);
    15. }

    Results注解

    @Results作用相当于resultMap

    值:

    id:给results映射命名

    value:result数组(对应参数)

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

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

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

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

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

    1. <resultMap type="Student" id="stu">
    2.    <id column="s_id" property="sId"/>
    3.    <result column="s_name" property="sName"/>
    4.    <association property="course" javaType="course" autoMapping="true">
    5.        <id column="c_id" property="cId"/>
    6.        <result column="s_id" property="sId"/>
    7.        <result column="c_name" property="cName"/>
    8.    </association>
    9. </resultMap>

    一对一(多)

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

    动态SQL

    1. // 动态SQL使用<script>标签包裹
    2. @Select("<script>"+
    3.        "SELECT * FROM student WHERE s_id IN"+
    4.        // 双引号:\"(转义)
    5.        "<foreach collection=\"list\" item=\"i\" open=\"(\" separator=\",\" close=\")\">\r\n"+
    6.        "#{i}"+
    7.        "</foreach>"+
    8.        "</script>")
    9. List<Student> selStu(@Param("list")List list);
  • 相关阅读:
    【小白专属02】SpringBoot集成MybatisPlus
    MyBatis友人帐之缓存
    webpack总结16--webpack入门学习
    Idea快捷键
    多线程开发中,多用消息传递,少用锁
    抖音怎么录屏?这个方法,亲测好用
    Java基础知识【String、StringBuffer、StringBuilder、==与equal()的区别】
    命令执行漏洞复现攻击:识别威胁并加强安全
    音视频开发15 FFmpeg FLV封装格式分析
    【自学笔记】网络安全——黑客技术
  • 原文地址:https://blog.csdn.net/Xstruggle/article/details/125483721