解析java注解之项目实现

本文介绍了一种基于Java的ORM框架实现方式,通过自定义@Table和@Column注解来映射实体类与数据库表的关系,并提供了示例代码展示如何通过反射机制生成SQL查询语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件路径:

Column的注解

package testQuery;

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 value();
}

Table的注解

package testQuery;

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 value();

}

Filter的model

@Table("user")
public class Filter {

    @Column("id")
    private int id;
    @Column("userName")
    private String userName;
    @Column("nickName")
    private String nickName;
    @Column("age")
    private int age;
    @Column("city")
    private String city;
    @Column("mobile")
    private String mobile;
    @Column("email")
    private String email;
            *****set****get*****

Filter2的model

@Table("department")
public class Filter2 {

    @Column("id")
    private int id;
    @Column("name")
    private String name;
    @Column("leader")
    private String leader;
    @Column("amount")
    private int amount;

      *****set****get*****
测试testQuery
package testQuery;

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

public class Test {
    public static void main(String[] args) {

        Filter filter1 = new Filter();
        filter1.setId(10);//查询id为10的用户

        Filter filter2 = new Filter();
        filter2.setUserName("lucy");//查询用户名为lucy的用户
        filter2.setAge(18);

        Filter filter3 = new Filter();
        filter3.setEmail("liu@sina.com");//查询邮箱为其中任意一个的用户

        String sql1 = query(filter1);
        String sql2 = query(filter2);
        String sql3 = query(filter3);

        System.out.println(sql1);
        System.out.println(sql2);
        System.out.println(sql3);

        Filter2 filter21 = new Filter2();
        filter21.setAmount(10);
        filter21.setName("技术部");
        System.out.println(query(filter21));
    }

    private static String query(Object f) {

        StringBuilder stringBuilder = new StringBuilder();
        //获取到class
        Class c = f.getClass();
        //获取到table的名字
        boolean exists = c.isAnnotationPresent(Table.class);
        //if exist=false 则返回null
        if (!exists) {
            return null;
        }
        Table table = (Table) c.getAnnotation(Table.class);
        String tableName = table.value();
        stringBuilder.append("select * from").append(tableName).append("where 1=1");
        //3.遍历所有的字段
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            //4.处理每个字段对应的sql
            //4.1 拿到字段名
            boolean fExist = field.isAnnotationPresent(Column.class);
            if (!fExist) {
                continue;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName = column.value();
            //4.2拿到字段的值
            String fieldName = field.getName();
            String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            //字段的值
            Object fieldValue = null;

            try {
                Method getMethod = c.getMethod(getMethodName);
                fieldValue = getMethod.invoke(f);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //拼装sql
            if (fieldValue == null || (fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
                continue;
            }
            stringBuilder.append(" and ").append(fieldName);
            if (fieldValue instanceof String) {
                if (((String) fieldValue).contains(",")) {
                    String[] vaules = ((String) fieldValue).split(",");
                    stringBuilder.append("in(");
                    for (String v : vaules) {
                        stringBuilder.append("'").append(v).append("'").append(",");
                    }
                    //最后一个的逗号给删掉
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                    stringBuilder.append(")");
                } else {
                    stringBuilder.append("=").append("'").append(fieldValue).append("'");
                }

            } else if (fieldValue instanceof Integer) {
                stringBuilder.append("=").append(fieldValue);
            }
        }
        return stringBuilder.toString();
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值