摘要:如果一種聲明使用進(jìn)行注解,這種類型的注解被作為被標(biāo)注的程序成員的公共。如果元注解沒(méi)有出現(xiàn),那么定義的注解可以應(yīng)用于程序的任何元素。指明該注解類型被自動(dòng)繼承。指明了該被保留的時(shí)間長(zhǎng)短。
GitHub
Github地址:AnnoDao
注解的老話題首先我們要介紹一下注解是什么,有什么用?
java JDK中的幾個(gè)注解就可以幫助到我們?nèi)ダ斫?/p>
</>復(fù)制代碼
@Override:重寫(xiě)注解
@Deprecated: 使其無(wú)效
@SuppressWarnings: 忽略警告
通過(guò)以上幾種我們可以大致了解了注解的作用,方便開(kāi)發(fā),提高逼格,如果你能自定義注解來(lái)實(shí)現(xiàn)功能那就是又強(qiáng)又牛皮呀!
相關(guān)介紹注解是Annotation,是由元注解定義出來(lái)的,元注解有以下幾種
@Documented —— 指明擁有這個(gè)注解的元素可以被javadoc此類的工具文檔化。這種類型應(yīng)該用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進(jìn)行注解,這種類型的注解被作為被標(biāo)注的程序成員的公共API。
@Target——指明該類型的注解可以注解的程序元素的范圍。該元注解的取值可以為TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解沒(méi)有出現(xiàn),那么定義的注解可以應(yīng)用于程序的任何元素。
@Inherited——指明該注解類型被自動(dòng)繼承。如果用戶在當(dāng)前類中查詢這個(gè)元注解類型并且當(dāng)前類的聲明中不包含這個(gè)元注解類型,那么也將自動(dòng)查詢當(dāng)前類的父類是否存在Inherited元注解,這個(gè)動(dòng)作將被重復(fù)執(zhí)行知道這個(gè)標(biāo)注類型被找到,或者是查詢到頂層的父類。
@Retention——指明了該Annotation被保留的時(shí)間長(zhǎng)短。RetentionPolicy取值為SOURCE,CLASS,RUNTIME。
代碼演練需求:
1、方便的對(duì)每個(gè)字段或字段組合條件進(jìn)行檢索,并打印出sql
分別定義兩個(gè)注解類
</>復(fù)制代碼
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
這時(shí)直接使用即可
</>復(fù)制代碼
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("filter")
class Filter {
@Column("id")
private int id;
@Column("user_name")
private String username;
@Column("pass_word")
private String password;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
}
主要在注解的反射處理,你需要按照自己的要求去處理業(yè)務(wù)
</>復(fù)制代碼
public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10);
Filter f2 = new Filter();
f2.setUsername("小龍");
Filter f3 = new Filter();
f3.setEmail("123123123@qq.com,llll@qq.com");
String q1 = query(f1);
String q2 = query(f2);
String q3 = query(f3);
System.out.println(q1);
System.out.println(q2);
System.out.println(q3);
}
private static String query(Object filter){
StringBuilder sb = new StringBuilder();
//1、獲取到class
Class c = filter.getClass();
//2、獲取table的名字
boolean isexist = c.isAnnotationPresent(Table.class);
if (!isexist){
return null;
}
Table table = (Table) c.getAnnotation(Table.class);
String tableName = table.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
//3、便利所有字段
Field[] fields = c.getDeclaredFields();
for (Field field:fields){
//4、處理每個(gè)字段對(duì)應(yīng)的sql
//4.1、拿到字段名
boolean fExist = field.isAnnotationPresent(Column.class);
if (!fExist){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
//4.2、拿到字段值
String fieldName = field.getName();
String getMethodName = "get"+fieldName.substring(0,1).toUpperCase()+
fieldName.substring(1);
Object fieldValue = null;
try {
Method getMehtod = c.getMethod(getMethodName);
fieldValue = getMehtod.invoke(filter);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//4.3、拼裝sql
if (fieldValue==null || (fieldValue instanceof Integer && (Integer)fieldValue==0)){
continue;
}
sb.append(" and ").append(fieldName);
if (fieldValue instanceof String){
if (((String)fieldValue).contains(",")){
String[] values = ((String)fieldValue).split(",");
sb.append(" in( ");
for (String value:values){
sb.append(""").append(value).append(""").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}else{
sb.append(" = ").append(""").append(fieldValue).append(""");
}
}else if (fieldValue instanceof Integer){
sb.append(" = ").append(fieldValue);
}
}
return sb.toString();
}
效果
</>復(fù)制代碼
select * from filter where 1=1 and id = 10
select * from filter where 1=1 and username = "小龍"
select * from filter where 1=1 and email in( "123123123@qq.com","llll@qq.com")
如果本文對(duì)你有所幫助,歡迎關(guān)注本人技術(shù)公眾號(hào),或者點(diǎn)贊,謝謝。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77110.html
摘要:引言在用的時(shí)候發(fā)現(xiàn)能自動(dòng)生成,同時(shí)帶有一些注解,這引起了我的好奇。注解來(lái)源于之類的其他語(yǔ)言。關(guān)閉不當(dāng)?shù)木幾g器警告。允許子類繼承父類中的注解。五通過(guò)注解反射生成語(yǔ)句接下來(lái),我用一個(gè)例子來(lái)解釋注解的作用。 引言 在用hibernate的時(shí)候發(fā)現(xiàn)idea能自動(dòng)生成JavaBean,同時(shí)帶有一些注解,這引起了我的好奇。當(dāng)在學(xué)習(xí)Android的時(shí)候,我發(fā)現(xiàn)XUtils這個(gè)工具包中的DBUtils...
摘要:注解是棄用不再使用的意思。是處理源碼級(jí)別的注解,它會(huì)生成新的字節(jié)碼或其它文件。這個(gè)該怎么實(shí)現(xiàn)呢我們需要在啟動(dòng)之后文件轉(zhuǎn)為字節(jié)碼文件之前,就需要生成對(duì)應(yīng)的和方法,因?yàn)樗辉诰幾g期有效。我們?cè)趩?dòng)后,會(huì)根據(jù)注解,來(lái)創(chuàng)建相應(yīng)的數(shù)據(jù)表。 導(dǎo)讀 模擬hibernate的注解,創(chuàng)建數(shù)據(jù)表的源碼地址:https://gitee.com/zbone/myanno 注解釋義 java開(kāi)發(fā)人員對(duì)注解,應(yīng)該...
摘要:最終能和面試官聊的開(kāi)心愉快投緣的叫面霸。能夠與很好的集成提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫(kù)的字段關(guān)系映射提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組件維護(hù)。使用可以有效的防止注入,提高系統(tǒng)安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面試,難還是不難?取決于面試者的底蘊(yùn)(氣場(chǎng)+技能)、心態(tài)和認(rèn)知及溝通技巧。...
摘要:元注解元注解用于注解其他注解的。該注解表明子類是有繼承了父類的注解。在注解中,需要使用四種元注解來(lái)聲明注解的作用范圍生命周期繼承,是否生成文檔等。另外在注解中也可以有自己的成員變量,如果一個(gè)注解沒(méi)有成員變量則稱為標(biāo)記注解。 在使用SpringBoot作為Web敏捷開(kāi)發(fā)的框架之后,SpringBoot除了自動(dòng)裝配配置的便捷之外,在很多時(shí)候需要基于注解來(lái)開(kāi)發(fā)。注解不僅增加了代碼的可讀性,還...
摘要:既然行不通,或許可以考慮使用注解來(lái)自定義一個(gè)實(shí)現(xiàn)。仍舊提供給了使用者原始的使用方式利用來(lái)構(gòu)造并執(zhí)行。就像一樣,使用者也可以自定義來(lái)執(zhí)行,試試看,同樣沒(méi)有問(wèn)題,再多的數(shù)據(jù)也可以被保存到數(shù)據(jù)庫(kù)中批量保存的效果達(dá)到了。 更多精彩博文,歡迎訪問(wèn)我的個(gè)人博客 說(shuō)明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所說(shuō)JPA皆指spring-boot-starte...
閱讀 2932·2023-04-26 01:01
閱讀 3700·2021-11-23 09:51
閱讀 2527·2021-11-22 14:44
閱讀 3621·2021-09-23 11:57
閱讀 2845·2021-09-22 14:58
閱讀 5887·2021-09-10 11:25
閱讀 2114·2019-08-30 13:11
閱讀 1603·2019-08-30 12:59