闭关修炼(九)注解
之前寫(xiě)了一篇有關(guān)于注解的,放一起好了
https://blog.csdn.net/qq_19841133/article/details/108918652
文章目錄
- 自定義注解
- 什么是注解
- 注解的好處
- 注解分類(lèi)
- 如何自定義注解?
- 例子
- 乞丐版ORM框架映射
- 什么是ORM
- 實(shí)現(xiàn)思路
- 實(shí)現(xiàn)
- 乞丐版JPA和Junit實(shí)現(xiàn)
自定義注解
什么是注解
1.5新增技術(shù)。
目的是簡(jiǎn)化代碼。
在springboot中幾乎是面向注解開(kāi)發(fā)了。
注解的好處
閱讀性高,簡(jiǎn)化代碼,提高開(kāi)發(fā)效率
注解分類(lèi)
內(nèi)置注解,jdk自帶的注解,如@Override重寫(xiě)注解(重寫(xiě)的注解的作用是標(biāo)識(shí)是否正確,必須是重寫(xiě)的方法才能進(jìn)行注解,不然會(huì)報(bào)錯(cuò),起到一個(gè)驗(yàn)證的作用。),內(nèi)置注解還有@Overload,@Deprecated(標(biāo)識(shí)過(guò)時(shí)),@SuppressWarnings(標(biāo)識(shí)編譯去除警告)
自定義注解,框架中使用的較多
第三方框架中的注解
如何自定義注解?
java基礎(chǔ)知識(shí)點(diǎn)
interface前加@,@interface標(biāo)識(shí)類(lèi)它是一個(gè)注解類(lèi),本質(zhì)上是一個(gè)接口。
元注解
@Target 標(biāo)識(shí)這個(gè)接口能使用的地方,如接口類(lèi),屬性,方法等
@Retention 注解的保留策略,保留策略有三種SOURCE/ClASS/RUNTIME,要想被反射讀取,保留策略只能用RUNTIME,即運(yùn)行時(shí)仍可讀取
例子
寫(xiě)自定義注解一定要注意,先寫(xiě)Target和Retention,養(yǎng)成規(guī)范的好習(xí)慣
// METHOD方法上使用,TYPE類(lèi)和接口上使用,FIELD屬性上使用 @Target({ElementType.METHOD, ElementType.TYPE,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @interface TestAnnotation{int beanId() default 0;String className() default "";String[] array(); }public class Test1 {@TestAnnotation(beanId = 1, className = "ch9.Test1",array = {"78999"})public void add(){} }乞丐版ORM框架映射
什么是ORM
對(duì)象關(guān)系映射。如MySQL數(shù)據(jù)庫(kù)中有一個(gè)屬性名為student_id,映射到j(luò)ava中可能就是studentId
實(shí)現(xiàn)思路
使用java反射機(jī)制獲取每個(gè)屬性上的注解的value值,再拼接成sql語(yǔ)句
實(shí)現(xiàn)
乞丐版select語(yǔ)句ORM實(shí)現(xiàn)
package ch9;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field;/*** 表的關(guān)聯(lián)注解** @author uuz* @date 2021/01/09*/ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface Table {String value(); }/*** 字段映射** @author uuz* @date 2021/01/09*/ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @interface Property {String name();int length() default 0;}@Data @AllArgsConstructor @NoArgsConstructor @Table("mysql_student") class Student {/*** 學(xué)生的名字*/@Property(name = "name")private String studentName;/*** 學(xué)生的年齡*/@Property(name = "age")private String studentAge;/*** 學(xué)生證*/@Property(name = "id")private String studentId; }/*** test2** @author uuz* @date 2021/01/09*/ public class Test2 {/*** select sql語(yǔ)句構(gòu)造* @param classReferencePath 類(lèi)的參考路徑* @return {@link StringBuilder}* @throws ClassNotFoundException 類(lèi)沒(méi)有發(fā)現(xiàn)異常*/public static StringBuilder selectORM(String classReferencePath) throws ClassNotFoundException {// 通過(guò)反射獲取Student類(lèi)字節(jié)碼Class<?> forName = Class.forName(classReferencePath);// 獲取類(lèi)上的注解Table tableAnnotations= forName.getDeclaredAnnotation(Table.class);// sql字符串StringBuilder sql = new StringBuilder();sql.append("select ");// 獲取類(lèi)所有屬性Field[] declaredFields = forName.getDeclaredFields();for (int i = 0; i < declaredFields.length; i++) {Field f = declaredFields[i];// 獲取類(lèi)屬性上的注解Property property = f.getDeclaredAnnotation(Property.class);sql.append(property.name());if (i < declaredFields.length - 1) {sql.append(",");}}String table = tableAnnotations.value();sql.append(" from ").append(table);return sql;}public static void main(String[] args) throws ClassNotFoundException {StringBuilder selectSql = selectORM("ch9.Student");System.out.println(selectSql);} }執(zhí)行結(jié)果
乞丐版JPA和Junit實(shí)現(xiàn)
在之前寫(xiě)的博客:
https://blog.csdn.net/qq_19841133/article/details/108918652
總結(jié)
- 上一篇: 数说济南商史
- 下一篇: 闭关修炼(十八)maven