【Java反射&注解】通过反射和注解的方式根据Entity实体对象自动生成Sql语句

首先我们定义好两个接口注解:
这个注解是用于定义在实体对象中用的
package homework4.exp3;

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

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Retention(RUNTIME)
@Target(FIELD)
public @interface Column {

    //是否为主键
    boolean isPK() default false;
    //对应的数据库的字段名,默认为空
    String label() default "";

}
这个注解是用于定义到Entity实体对象用的
package homework4.exp3;

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

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Retention(RUNTIME)
@Target(TYPE)
public @interface Entity {

    //表名
    String tableName();
    //备注的标识
    String label();

}

定义Entity对象,并且使用上面的两个接口的注解
package homework4.exp3;

@Entity(tableName = "teacher",label = "教师")
public class Teacher {

    @Column(isPK = true,label = "id")
    private String id;

    @Column(label = "name")
    private String name;

    @Column(label = "school")
    private String school;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}

具体实现CRUD的Sql语句自动生成代码如下 划重点↓↓↓↓↓
package homework4.exp3;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class generateSQL {

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        generateSQL generateSQL= new generateSQL();
        teacher.setId("1");
        teacher.setSchool("zhku");
        teacher.setName("Adams");
        String str1 = generateSQL.selectSQL(teacher.getClass());
        System.out.println("输出的SELECT的sql:" + str1);
        String str2 = generateSQL.deleteSQL(teacher.getClass(), teacher);
        System.out.println("输出的DELETE的sq2:" + str2);
        String str3 = generateSQL.insertSQL(teacher.getClass(), teacher);
        System.out.println("输出的INSERT的sq3:" + str3);
        String str4 = generateSQL.updateSQL(teacher.getClass(), teacher);
        System.out.println("输出的UPDATE的sq4:" + str4);

    }

    //生成select的sql语句,
    public  String selectSQL(Class<?> clazz) {
        StringBuilder str = new StringBuilder();
        String tableName = getTableName(clazz);
        str.append("select * from ").append(tableName);
        String resultStr = str.toString();
        return resultStr;
    }

    //生成delete的sql语句
    public String deleteSQL(Class<?> clazz, Object object) {
        StringBuilder str = new StringBuilder();
        String tableName = getTableName(clazz);
        str.append("delete from ").append(tableName).append(" where ");
        Field[] fields = clazz.getDeclaredFields();
        String pk = "";
        for (int i = 0; i < fields.length; i++) {
            Column column = fields[i].getAnnotation(Column.class);
            if (column.isPK()) {
                pk = column.label();
                break;
            }
        }
        try {
            str.append(pk).append(" = ").append(getValue(pk, object));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String resultStr = str.toString();
        return resultStr;
    }

    //生成insert的sql语句
    public String insertSQL(Class<?> clazz, Object object) {
        StringBuilder str = new StringBuilder();
        String tableName = getTableName(clazz);
        str.append("insert into ").append(tableName).append(" (");
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length - 1; i++) {
            Column column = fields[i].getAnnotation(Column.class);
            str.append(column.label()).append(" , ");
        }
        Column columns = fields[fields.length - 1].getAnnotation(Column.class);
        str.append(columns.label()).append(") values(");
        try {
            for (int i = 0; i < fields.length - 1; i++) {
                Column column = fields[i].getAnnotation(Column.class);
                str.append(getValue(column.label(), object)).append(" , ");
            }
            str.append(getValue(columns.label(),object)).append(")");
        } catch (Exception e) {
            e.printStackTrace();
        }

        String resultStr = str.toString();
        return resultStr;
    }

    //生成update的sql语句
    public String updateSQL(Class<?> clazz, Object object) {
        StringBuilder str = new StringBuilder();
        String tableName = getTableName(clazz);
        str.append("update ").append(tableName).append(" set ");
        Field[] fields = clazz.getDeclaredFields();
        String pk = "";
        try {
            for (int i = 0; i < fields.length - 1; i++) {
                Column column = fields[i].getAnnotation(Column.class);
                if (column.isPK()) {
                    pk = column.label();
                } else {

                    str.append(column.label()).append(" = ").append(getValue(column.label(), object)).append(",");

                }
            }
            Column columns = fields[fields.length - 1].getAnnotation(Column.class);
            str.append(columns.label()).append(" = ").append(getValue(columns.label(), object)).append(" ");
            str.append(" where ").append(pk).append(" = ").append(getValue(pk, object));
        } catch (Exception e) {
            e.printStackTrace();
        }
        String resultStr = str.toString();
        return resultStr;
    }

    //获取表的名称
    private String getTableName(Class<?> clazz) {
        //判断是否为Table注释类型是方法返回true,否则返回false
        if (clazz.isAnnotationPresent(Entity.class)) {
            //获取注解信息
            Entity table = clazz.getAnnotation(Entity.class);
            if (!"".equals(table.tableName())) {
                return table.tableName();
            }
        }
        return null;
    }

    //通过对象的值,来获取实际的值
    private <T> String getValue(String columnName, Object object) throws Exception {
        //获取相应字段的getXXX方法
        String getMethod = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
        Method method = object.getClass().getMethod("get" + getMethod);
        return method.invoke(object).toString();
    }
}
最后运行结果:

在这里插入图片描述

本文参考自: Java通过反射注解生成对应的sql语句

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值