カスタム注釈を使用して、エンティティークラスの属性を指定するクエリー操作DEMOを実現

6894 ワード

カスタム注釈を使用する機会はありませんでしたが、今日は、エンティティクラスの属性に注釈を付けるための属性注釈を定義し、指定したデータベースから対応する結果セットを取得するための処理クラスを定義しました.主にカスタム注釈の機能構想を実現したいため,コードでは非注釈に関する様々な状況の処理はほとんど考慮されていない.
注記クラスMyField.java
package com.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)  //      
@Retention(RetentionPolicy.RUNTIME)  //        
public @interface MyField {
    //                 ,        
    String columnName() default "";
}
クエリー操作を実行するツールクラスQueryUtil.java
package com.test;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class QueryUtil {
    /**
     *                
     *
     * @param clazz
     * @param 
     * @return
     */
    public static  List selectAll(Class clazz) {
        //  sql
        StringBuilder sql = new StringBuilder("select ");
        //              
        Field[] fields = clazz.getDeclaredFields();
        //            map,             
        Map fieldColumnMap = new HashMap();
        //      
        for (Field field : fields) {
            //            MyField     
            if (field.isAnnotationPresent(MyField.class)) {
                //              
                MyField myField = field.getAnnotation(MyField.class);
                //                ,        
                String columnName = "";
                if (!"".equals(myField.columnName())) {
                    columnName = myField.columnName();
                } else {
                    columnName = field.getName();
                }
                sql.append(columnName + ", ");
                //                        map
                fieldColumnMap.put(field, columnName);
            }
        }
        //    sql
        sql.replace(sql.lastIndexOf(","), sql.length() - 1, " from ");
        sql.append(clazz.getSimpleName().toLowerCase());
        //   jdbc  
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List list = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
            ps = conn.prepareStatement(sql.toString());
            rs = ps.executeQuery();
            list = new ArrayList();
            //     
            while (rs.next()) {
                T t = clazz.newInstance();
                //       map,        ,           set  ,       
                for (Map.Entry entry : fieldColumnMap.entrySet()) {
                    Object columnResult = rs.getObject(entry.getValue());
                    Field field = entry.getKey();
                    String fieldName = field.getName();
                    String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    clazz.getDeclaredMethod(methodName, field.getType()).invoke(t, columnResult);
                }
                //    ,       list
                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

}
クエリ対象オブジェクトBook.java
package com.test;

/**
 *      , id      @MyField  ,  nameaaa                    , author    
 */
public class Book {
    @MyField
    private Integer id;
    @MyField(columnName = "name")
    private String nameaaa;

    private String author;

    public Book() {
    }

    public Integer getId() {

        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }


    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", nameaaa='" + nameaaa + '\'' +
                ", author='" + author + '\'' +
                '}';
    }

    public String getNameaaa() {
        return nameaaa;
    }

    public void setNameaaa(String nameaaa) {
        this.nameaaa = nameaaa;
    }
}
テストクラスTest.java
package com.test;

import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        List books = QueryUtil.selectAll(Book.class);
        System.out.println(books);
    }
}
実行結果:
[Book{id=1, nameaaa='   1', author='null'}, Book{id=2, nameaaa='   2', author='null'}, Book{id=3, nameaaa='   3', author='null'}, Book{id=4, nameaaa='   4', author='null'}, Book{id=5, nameaaa='   ', author='null'}, Book{id=7, nameaaa='   ', author='null'}, Book{id=8, nameaaa='   ', author='null'}, Book{id=9, nameaaa='   ', author='null'}, Book{id=10, nameaaa='   ', author='null'}, Book{id=11, nameaaa='   ', author='null'}, Book{id=12, nameaaa='   ', author='null'}, Book{id=15, nameaaa='   ', author='null'}, Book{id=16, nameaaa='   ', author='null'}, Book{id=17, nameaaa='   ', author='null'}, Book{id=18, nameaaa='   ', author='null'}, Book{id=19, nameaaa='   ', author='null'}, Book{id=20, nameaaa='   ', author='null'}, Book{id=21, nameaaa='   ', author='null'}, Book{id=22, nameaaa='   ', author='null'}, Book{id=23, nameaaa='   ', author='null'}, Book{id=24, nameaaa='   ', author='null'}, Book{id=25, nameaaa='   ', author='null'}, Book{id=26, nameaaa='   ', author='null'}]

Process finished with exit code 0
 
エンティティクラスではidにデフォルトの@MyField注釈を設定し、nameaaにパラメータ付き注釈を設定して属性名が列名と異なることを示すために使用し、authorは注釈を設定していないため、idとnameは結果を検出し、authorはデータベースに値があるがnullを返し、クエリの結果は予想に合っていることがわかります.
この考え方によれば,添削改ざんを実現するにはツールクラスに対応する方法を追加し,対応するパラメータを受信し,様々な可能性のある状況の処理措置を完備すればよい.