您的位置:首页 > 编程语言 > Java开发

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

2017-10-29 23:51 585 查看
刚学完注解之后可能大家还有一些问题,这里我们通过一个简单的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();

4000
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息