ハイエンドでエレガントな注釈がどのように実現されているか<6>--カスタム永続層フレームワーク-クラスHibernate

6740 ワード

概要
前回はaptを用いて,工場クラスを自動的に生成する例を実現した.この我々は反射方式を用いて持続層フレームワークを実現し,もちろんコアコードにすぎず,Hibernateに類似して直接使用できるビジネスプロジェクトではない.
カスタム注釈シリーズの記事
  • それらのハイエンドで優雅な注釈はどのように実現されたのか<0>--注釈の分類
  • ハイエンドで優雅な注釈がどのように実現されているか<1>--カスタム注釈構文
  • それらのハイエンドで優雅な注釈はどのように実現されたのか<2>--解析注釈
  • ハイエンドで優雅な注釈がどのように実現されているか<3>-継承性@Inherited
  • ハイエンドでエレガントな注釈がどのように実現されるか<4>--Annotaion Processing Toolを使用して注釈
  • を解析する
  • ハイエンドでエレガントな注釈はどのように実現されているのか<5>--Annotaion Processing Toolを使用してカスタム注釈
  • ハイエンドで優雅な注釈がどのように実現されているか<6>--カスタム永続層フレームワーク-クラスHibernate
  • 需要
  • には、ユーザid、ユーザ名、ニックネーム、年齢、性別、メールボックス、携帯電話番号などのフィールド
  • を含むユーザテーブル(user)がある.
  • beanクラスに含まれる情報クエリに基づいてuserテーブルに条件を満たすuser
  • をクエリする.
    エンティティクラスを定義し、userテーブルとマッピング関係を形成する
    定義beanクラスCustomer
    @Table("user")
    public class Customer {
        //id
        @Column("id")
        private int id;
    
        //  
        @Column("user_name")
        private String userName;
    
        //  
        @Column("age")
        private int age;
    
        //  
        @Column("city")
        private String city;
    
        //  
        @Column("email")
        private String email;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    }
    
    
    @Table注釈を定義して、userテーブルとCustomerクラスとの間にマッピング関係を形成する必要があります.@Columnは、userテーブルとCustomerクラスのフィールドとの間にマッピング関係を形成するように定義する必要がある.
    注釈の定義
  • 定義@Table注記
  • @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Table {
        String value();
    }
    
  • 定義@Column注記
  • @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Column {
        String value();
    }
    

    注釈を解析し、対応する論理コードを生成
    最後にsql文を生成する必要があります.
    select * from user where 1=1 and user_name='zhangsan' and age=18 and email in('[email protected],[email protected],[email protected]')
    

    次にqueryメソッドを定義し、注釈を解析し、sql文をパッチで完了します.
     public static String query(Object bean) {
    
            //         sql  ,          sql  
            StringBuilder sb = new StringBuilder();
    
            //     bean    class,     Customer
            Class> beanClass = bean.getClass();
    
            //    class      table   
            boolean present = beanClass.isAnnotationPresent(Table.class);
            if (!present) {
                return "";
            }
    
            //    class  table   
            Table table = beanClass.getAnnotation(Table.class);
    
            //    
            String tableName = table.value();
            sb.append("select * from")
                    .append(" ")
                    .append(tableName)
                    .append(" ")
    
                    //           
                    .append("where 1=1");
    
            //          
            Field[] fields = beanClass.getDeclaredFields();
    
            //      
            for (Field field : fields) {
    
                //        Colomn   
                boolean fieldPresent = field.isAnnotationPresent(Column.class);
    
                //     ,             
                if (!fieldPresent) {
                    continue;
                }
    
                //    Column
                Column column = field.getAnnotation(Column.class);
    
                //   Column    , (user_name)
                String columnName = column.value();
    
                //       ,  useName
                String fieldName = field.getName();
    
                //      get   
                String fieldGetName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
    
    
                Object value = null;
    
                try {
                    //   get  
                    Method method = beanClass.getMethod(fieldGetName);
    
                    //        get  ,        
                    value = method.invoke(bean);
    
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
    
                //     ,      and   
                if (value == null ||((value instanceof Integer)&& (Integer)value==0)) {
                    continue;
                }
    
                //        and   
                sb.append(" ")
                        .append("and").append(" ")
                        .append(columnName)
    
                ;
    
                //       int  
                if (value instanceof Integer) {
                    sb.append("=").append(value);
                } else if (value instanceof String) {
    
                    //      ,  in  
                    if (((String) value).contains(",")) {
                        String[] values = ((String) value).split(",");
    
                        //   in   
                        sb.append(" ").append("in('");
    
                        //      ,      
                        for (String item : values) {
                            sb.append(item).append(",");
                        }
    
                        //        
                        sb.deleteCharAt(sb.length() - 1);
    
                        sb.append("')");
    
                    }
    
                    //        =   ,        
                    else {
    
    
                        sb.append("='").append(value).append("'");
                    }
                }
    
    
            }
    
    
            return sb.toString();
        }
    

    queryメソッドを呼び出し、sql文を取得
        public static void main(String[] args) {
            // new  Customer,   
            Customer customer1 = new Customer();
            customer1.setUserName("zhangsan");
            customer1.setAge(18);
            customer1.setEmail("[email protected],[email protected],[email protected]");
            
            
            //   query   ,   sql    
            String sql1 = Query.query(customer1);
            
            
            //  sql  
            System.out.println(sql1);
        }
    

    まとめ
    完全なコードはgithubにアップロードします.上のコードの断片だけでは読めません.cloneを見てみましょう.