使用注解生成sql語句


注解介紹:
java SE5內置了三種,定義在java.lang中的注解:
@Override,表示當前的方法定義將覆蓋超類中的方法。
@Deprecated,如果程序員使用了注解為它的元素,那么編譯器會發出警告信息。
@SuppressWarnings,關閉不當的編譯器警告信息。


元注解
@Target 用來定義你的注解應用於什么地方,例如是一個方法或者一個域。
		CONSTRUCTOR :構造器的聲明
		FIELD : 域聲明
		METHOD :方法聲明
		PACKAGE : 包生明
		TYPE : 類、接口或enmu聲明
@Retention 用來定義該注解在哪一個級別可用,在源代碼中(SOURCE),類文件中(CLASS)或者運行時(RUNTIME)
@Documented 將此注解包含在javadoc中
@Inherited 允許子類繼承父類中的注解

注解元素可用的類型,所有的基本類型:int,float,boolean等、String、Class、enum、Annotation

定義一個注解Test:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test(){
  String value();
}

 

// 下面使用注解來生成sql語句
1、先定義2個注解類,Table,Column
2、定義一個JavaBean類
3、編寫注解實現類

注解類:Table
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}

注解類:Column
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

javaBean類
@Table(value = "USER")
public class UserBean {

    @Column(value = "id")
    private int id;

    @Column(value = "userId")
    private String userId;

    @Column(value = "userName")
    private String userName;

    @Column(value = "email")
    private String email;

    @Column(value = "mobile")
    private String mobile;

    @Column(value = "phone")
    private String phone;

    public int getId() {
        return id;
    }

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}



4、注解測試類
public class MainTest {

    public static void main(String[] args) {
        UserBean userBean = new UserBean();
        userBean.setId(10);
        userBean.setEmail("123@qq.com");
        beanSql(userBean);

    }

    public static String beanSql(Object user){
        StringBuffer sql = new StringBuffer();

        Class c = user.getClass();
        boolean flag = c.isAnnotationPresent(Table.class);  // 判斷該類是否包含Table的注解,返回true/false
        if(!flag){
            return null;
        }
        Table table = (Table) c.getAnnotation(Table.class); // 獲取到注解對象
        String tableName = table.value(); // 獲取到注解對象的值
        sql.append("select * from ").append(tableName).append(" where 1=1");
        // 獲取該類中字段的注解
        //Field[] fields = c.getFields();
        Field[] fields = c.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            boolean fieldFalg = fields[i].isAnnotationPresent(Column.class);
            if(!fieldFalg){
                continue;
            }
            Column column = fields[i].getAnnotation(Column.class);
            String fieldName = column.value();  // 字段的名稱
            Object fieldValue = null ;  // 字段的值
            // 字段的值獲取,使用反射
            try {
                // 獲取方法名如:getId()
                String methodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1).toString();
                // 通過反射invoke獲取到值
                Method method = c.getMethod(methodName);
                fieldValue = method.invoke(user,null);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

            if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)){
                continue;
            }
            if(fieldValue instanceof String){
                sql.append(" and ").append(fields[i].getName()).append("='").append(fieldValue).append("'");
            }else if(fieldValue instanceof Integer){
                sql.append(" and ").append(fields[i].getName()).append("=").append(fieldValue);
            }
        }
        System.out.println(sql.toString());

        return sql.toString();
    }

}

生成sql如下:
select * from USER where 1=1 and id=10 and email='123@qq.com';

  

方法說明:
getAnnotation(Table.class):檢查對象是否帶有@Table注解
getFields() : 獲得某個類的所有的公共(public)的字段,包括父類。
getDeclaredFields() :獲得某個類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段
isAnnotationPresent(Table.class): 指定注釋類型的注釋存在於此元素上

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM