成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

lsxiao / 2107人閱讀

摘要:如果一種聲明使用進行注解,這種類型的注解被作為被標注的程序成員的公共。如果元注解沒有出現(xiàn),那么定義的注解可以應(yīng)用于程序的任何元素。指明該注解類型被自動繼承。指明了該被保留的時間長短。

GitHub

Github地址:AnnoDao

注解的老話題

首先我們要介紹一下注解是什么,有什么用?

java JDK中的幾個注解就可以幫助到我們?nèi)ダ斫?/p>

@Override:重寫注解
@Deprecated: 使其無效
@SuppressWarnings: 忽略警告

通過以上幾種我們可以大致了解了注解的作用,方便開發(fā),提高逼格,如果你能自定義注解來實現(xiàn)功能那就是又強又牛皮呀!

相關(guān)介紹

注解是Annotation,是由元注解定義出來的,元注解有以下幾種

@Documented —— 指明擁有這個注解的元素可以被javadoc此類的工具文檔化。這種類型應(yīng)該用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進行注解,這種類型的注解被作為被標注的程序成員的公共API。

@Target——指明該類型的注解可以注解的程序元素的范圍。該元注解的取值可以為TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解沒有出現(xiàn),那么定義的注解可以應(yīng)用于程序的任何元素。

@Inherited——指明該注解類型被自動繼承。如果用戶在當前類中查詢這個元注解類型并且當前類的聲明中不包含這個元注解類型,那么也將自動查詢當前類的父類是否存在Inherited元注解,這個動作將被重復執(zhí)行知道這個標注類型被找到,或者是查詢到頂層的父類。

@Retention——指明了該Annotation被保留的時間長短。RetentionPolicy取值為SOURCE,CLASS,RUNTIME。

代碼演練

需求:

1、方便的對每個字段或字段組合條件進行檢索,并打印出sql

分別定義兩個注解類

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {

    String value();

}

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {

    String value();

}

這時直接使用即可

@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ù)

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("[email protected],[email protected]");

        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、處理每個字段對應(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();
    }
效果
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( "[email protected]","[email protected]")

如果本文對你有所幫助,歡迎關(guān)注本人技術(shù)公眾號,或者點贊,謝謝。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77110.html

相關(guān)文章

  • Java 注解入門 生成SQL語句

    摘要:引言在用的時候發(fā)現(xiàn)能自動生成,同時帶有一些注解,這引起了我的好奇。注解來源于之類的其他語言。關(guān)閉不當?shù)木幾g器警告。允許子類繼承父類中的注解。五通過注解反射生成語句接下來,我用一個例子來解釋注解的作用。 引言 在用hibernate的時候發(fā)現(xiàn)idea能自動生成JavaBean,同時帶有一些注解,這引起了我的好奇。當在學習Android的時候,我發(fā)現(xiàn)XUtils這個工具包中的DBUtils...

    J4ck_Chan 評論0 收藏0
  • 注解的奇妙之旅

    摘要:注解是棄用不再使用的意思。是處理源碼級別的注解,它會生成新的字節(jié)碼或其它文件。這個該怎么實現(xiàn)呢我們需要在啟動之后文件轉(zhuǎn)為字節(jié)碼文件之前,就需要生成對應(yīng)的和方法,因為它只在編譯期有效。我們在啟動后,會根據(jù)注解,來創(chuàng)建相應(yīng)的數(shù)據(jù)表。 導讀 模擬hibernate的注解,創(chuàng)建數(shù)據(jù)表的源碼地址:https://gitee.com/zbone/myanno 注解釋義 java開發(fā)人員對注解,應(yīng)該...

    Markxu 評論0 收藏0
  • 面試官都會問的Mybatis面試題,你會這樣回答嗎?

    摘要:最終能和面試官聊的開心愉快投緣的叫面霸。能夠與很好的集成提供映射標簽,支持對象與數(shù)據(jù)庫的字段關(guān)系映射提供對象關(guān)系映射標簽,支持對象關(guān)系組件維護。使用可以有效的防止注入,提高系統(tǒng)安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面試,難還是不難?取決于面試者的底蘊(氣場+技能)、心態(tài)和認知及溝通技巧。...

    seanHai 評論0 收藏0
  • Java注解詳解

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

    funnyZhang 評論0 收藏0
  • 使用SpringBoot-JPA進行定義的保存及批量保存

    摘要:既然行不通,或許可以考慮使用注解來自定義一個實現(xiàn)。仍舊提供給了使用者原始的使用方式利用來構(gòu)造并執(zhí)行。就像一樣,使用者也可以自定義來執(zhí)行,試試看,同樣沒有問題,再多的數(shù)據(jù)也可以被保存到數(shù)據(jù)庫中批量保存的效果達到了。 更多精彩博文,歡迎訪問我的個人博客 說明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所說JPA皆指spring-boot-starte...

    boredream 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<