java注解:完成sql语句的拼接

    刚学完注解之后可能大家还有一些问题,这里我们通过一个简单的sql语句拼接的方式,来进行一下注解的总结和学习:
首先,我们建立一个表,并且声明表中的字段:

package com.item;

@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("email")
    private String email;
    @Column("mobile")
    private String mobile;
    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 getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    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;
    }
}

在这里我们用到了两个注解,一个用来表示表,一个用来表示各字段,接下来进行自定义这两个注解:

package com.item;

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();
}
package com.item;

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

最后,我们正式开始sql语句拼接的工作:

package com.item;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) {
        Filter f1=new Filter();
        f1.setId(10);//表示查询id为10的用户

        Filter f2=new Filter();
        f2.setUserName("username");//模糊查询用户名为username

        Filter f3=new Filter();
        f3.setEmail("wushao@126.com");//查询邮箱
        Test test=new Test();
        test.query(f1);
        String sql1=query(f1);
        String sql2=query(f2);
        String sql3=query(f3);
        System.out.println(sql1);
        System.out.println(sql2);
        System.out.println(sql3);
    }
    private static String query(Filter f){
        StringBuilder s=new StringBuilder();
        Class c=f.getClass();//反射机制
        boolean table=c.isAnnotationPresent(Table.class);//判断是否存在该注解
        if(!table) {
         return null;       
        }
    Table annotationTable=(Table)c.getAnnotation(Table.class);//获取该注解
        String tablename=annotationTable.value();
        s.append("select* from").append(tablename).append("where 1=1");
        //遍历所有的字段
        Field[] field=c.getDeclaredFields();//获取到所有字段
        for (Field field2 : field) {

            String fieldName=field2.getName();          
            boolean a=c.isAnnotationPresent(Column.class);//判断是否存在该注解
            if(a) {
                continue;
            }
//          Column column=(Column)c.getAnnotation(Column.class);
//          String columname=column.value();
            String MethodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);//将属性名字的首字母大写,加上后面的部分,在前面加上get则得到getter方法的方法名

            Object fieldValue=null;
            try {
                Method  m = c.getMethod(MethodName);
                    fieldValue=m.invoke(f);//利用java反射机制调用函数     
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            if(fieldValue==null||(fieldValue instanceof Integer && (Integer)fieldValue==0)) {
                continue;
            }
            s.append("and").append(fieldName).append("=").append(fieldValue);
        }
        return s.toString();
    }
}

最终的运行结果为:

select* fromuserwhere 1=1andid=10
select* fromuserwhere 1=1anduserName=username
select* fromuserwhere 1=1andemail=wushao@126.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值