利用反射和注解动态拼接 select 的 SQL 语句

思路:

思路:

  1. 定义Table及Column注解,用于失血模型与表之间的绑定
  2. 定义好失血模型,并利用Table和Column注解完成与表之间的绑定
  3. 利用反射获取表名,并完成SQL语句:select * from 表名;
    • 提示:表名为失血模型类上的Table注解的属性值
  4. 利用反射获取到被Column注解修饰了的所有属性的值,如果值为该属性类型的默认值,
    则该属性不作为SQL查询条件,否则,则取出该属性对应的列名,完成SQL语句:select *
    from 表名 where 列名=”属性值”and ……;

Table 注解:

package com.woniuxy.sqlpractice;

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

@Target(ElementType.TYPE)  // 作用于表
@Retention(RetentionPolicy.RUNTIME)  // 运行时用反射
public @interface Table {
    // 表名
    String tableName();
}

Column 注解:

package com.woniuxy.sqlpractice;

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 Column {
    // 键名
    String key();
}

失血模型:

package com.woniuxy.sqlpractice;

// 失血模型,用于接收数据库数据
@Table(tableName = "UserPo")
public class UserPO {
    @Column(key = "id")
    private Integer id;
    @Column(key = "userName")
    private String userName;
    @Column(key = "userPass")
    private String userPass;
    
    
    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 String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }
}

绑定

package com.woniuxy.sqlpractice;

import java.lang.reflect.Field;

public class SQLPractice {

    public static void main(String[] args) {
        UserPO po = new UserPO();
        po.setId(11);
        po.setUserName("null");
        System.out.println(SQLSelect(po, UserPO.class));
    }

    public static String SQLSelect(Object obj, Class<UserPO> cl) {
        int i = 0;
        String result = "SELECT * FROM ";
//      System.out.println("1:"+cl.isAnnotationPresent(Table.class));
        // 通过注解获取表名
        if (cl.isAnnotationPresent(Table.class)) {
            Table table = (Table) cl.getAnnotation(Table.class);
            result += table.tableName();
        }

        // 遍历表中所有属性
        Field[] fields = cl.getDeclaredFields();
//      System.out.println(fields.length > 0);
        for (Field field : fields) {
            // 判断属性上面是否有 Column 的注解
//          System.out.println("2:"+field.isAnnotationPresent(Column.class));
            if (field.isAnnotationPresent(Column.class)) {
                // 设置突破访问
                field.setAccessible(true);
                try {
                    if (field.get(obj) != null) {
                        if (i == 0) {
                            result += " WHILE ";
                            i++;
                        } else {
                            result += " AND ";
                        }
                        String value = field.get(obj) + "";
                        // 获取注解值
                        String key = field.getAnnotation(Column.class).key();
                        result += "`" + key + "`" + "=" + value;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        return result;
    }
}

结果

《利用反射和注解动态拼接 select 的 SQL 语句》 结果.png

    原文作者:tingshuo123
    原文地址: https://www.jianshu.com/p/db01d63aa2ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞