国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

自定義注解實(shí)例實(shí)現(xiàn)SQL語(yǔ)句生成

lsxiao / 2108人閱讀

摘要:如果一種聲明使用進(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ù)制代碼

  1. @Override:重寫(xiě)注解
  2. @Deprecated: 使其無(wú)效
  3. @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ù)制代碼

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Table {
  4. String value();
  5. }
  6. @Target({ElementType.FIELD})
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface Column {
  9. String value();
  10. }

這時(shí)直接使用即可

</>復(fù)制代碼

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @Table("filter")
  5. class Filter {
  6. @Column("id")
  7. private int id;
  8. @Column("user_name")
  9. private String username;
  10. @Column("pass_word")
  11. private String password;
  12. @Column("age")
  13. private int age;
  14. @Column("city")
  15. private String city;
  16. @Column("email")
  17. private String email;
  18. @Column("mobile")
  19. private String mobile;
  20. }

主要在注解的反射處理,你需要按照自己的要求去處理業(yè)務(wù)

</>復(fù)制代碼

  1. public static void main(String[] args) {
  2. Filter f1 = new Filter();
  3. f1.setId(10);
  4. Filter f2 = new Filter();
  5. f2.setUsername("小龍");
  6. Filter f3 = new Filter();
  7. f3.setEmail("123123123@qq.com,llll@qq.com");
  8. String q1 = query(f1);
  9. String q2 = query(f2);
  10. String q3 = query(f3);
  11. System.out.println(q1);
  12. System.out.println(q2);
  13. System.out.println(q3);
  14. }
  15. private static String query(Object filter){
  16. StringBuilder sb = new StringBuilder();
  17. //1、獲取到class
  18. Class c = filter.getClass();
  19. //2、獲取table的名字
  20. boolean isexist = c.isAnnotationPresent(Table.class);
  21. if (!isexist){
  22. return null;
  23. }
  24. Table table = (Table) c.getAnnotation(Table.class);
  25. String tableName = table.value();
  26. sb.append("select * from ").append(tableName).append(" where 1=1");
  27. //3、便利所有字段
  28. Field[] fields = c.getDeclaredFields();
  29. for (Field field:fields){
  30. //4、處理每個(gè)字段對(duì)應(yīng)的sql
  31. //4.1、拿到字段名
  32. boolean fExist = field.isAnnotationPresent(Column.class);
  33. if (!fExist){
  34. continue;
  35. }
  36. Column column = field.getAnnotation(Column.class);
  37. String columnName = column.value();
  38. //4.2、拿到字段值
  39. String fieldName = field.getName();
  40. String getMethodName = "get"+fieldName.substring(0,1).toUpperCase()+
  41. fieldName.substring(1);
  42. Object fieldValue = null;
  43. try {
  44. Method getMehtod = c.getMethod(getMethodName);
  45. fieldValue = getMehtod.invoke(filter);
  46. } catch (NoSuchMethodException e) {
  47. e.printStackTrace();
  48. } catch (IllegalAccessException e) {
  49. e.printStackTrace();
  50. } catch (InvocationTargetException e) {
  51. e.printStackTrace();
  52. }
  53. //4.3、拼裝sql
  54. if (fieldValue==null || (fieldValue instanceof Integer && (Integer)fieldValue==0)){
  55. continue;
  56. }
  57. sb.append(" and ").append(fieldName);
  58. if (fieldValue instanceof String){
  59. if (((String)fieldValue).contains(",")){
  60. String[] values = ((String)fieldValue).split(",");
  61. sb.append(" in( ");
  62. for (String value:values){
  63. sb.append(""").append(value).append(""").append(",");
  64. }
  65. sb.deleteCharAt(sb.length()-1);
  66. sb.append(")");
  67. }else{
  68. sb.append(" = ").append(""").append(fieldValue).append(""");
  69. }
  70. }else if (fieldValue instanceof Integer){
  71. sb.append(" = ").append(fieldValue);
  72. }
  73. }
  74. return sb.toString();
  75. }
效果

</>復(fù)制代碼

  1. select * from filter where 1=1 and id = 10
  2. select * from filter where 1=1 and username = "小龍"
  3. 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

相關(guān)文章

  • Java 注解入門 動(dòng)生成SQL語(yǔ)句

    摘要:引言在用的時(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...

    J4ck_Chan 評(píng)論0 收藏0
  • 注解的奇妙之旅

    摘要:注解是棄用不再使用的意思。是處理源碼級(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)該...

    Markxu 評(píng)論0 收藏0
  • 面試官都會(huì)問(wèn)的Mybatis面試題,你會(huì)這樣回答嗎?

    摘要:最終能和面試官聊的開(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)知及溝通技巧。...

    seanHai 評(píng)論0 收藏0
  • Java注解詳解

    摘要:元注解元注解用于注解其他注解的。該注解表明子類是有繼承了父類的注解。在注解中,需要使用四種元注解來(lái)聲明注解的作用范圍生命周期繼承,是否生成文檔等。另外在注解中也可以有自己的成員變量,如果一個(gè)注解沒(méi)有成員變量則稱為標(biāo)記注解。 在使用SpringBoot作為Web敏捷開(kāi)發(fā)的框架之后,SpringBoot除了自動(dòng)裝配配置的便捷之外,在很多時(shí)候需要基于注解來(lái)開(kāi)發(fā)。注解不僅增加了代碼的可讀性,還...

    funnyZhang 評(píng)論0 收藏0
  • 使用SpringBoot-JPA進(jìn)行定義的保存及批量保存

    摘要:既然行不通,或許可以考慮使用注解來(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...

    boredream 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<