您的位置:首页 > 数据库

通过反射+注解生成sql语句

2016-06-13 09:31 295 查看

通过反射+注解生成sql语句

先写注解

设置主键的注解

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 Primarykey {//主键的注解

}

//不属于类中字段的注解(有些表之间有关联的,在类中有字段但是在数据库查询语句中不需要该字段的)
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 NonField {

}


然后写方法

代码块

public class BeanUtil {//方法类
//获取查询语句
public static String selectsql(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<? extends Object> c=obj.getClass();//通过反射获取类
String tableName = c.getSimpleName();//获取类名(数据库表名)
StringBuffer sbsql=new StringBuffer();//拼接sql语句
sbsql.append(" select * from "+tableName+" where 1=1 ");
Field[] fields = c.getDeclaredFields();//获取类中的字段
for(Field f : fields){
String methodName="get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);//拼接字符串
Method m = c.getDeclaredMethod(methodName);//通过拼接的字符串获取方法
Object o=m.invoke(obj);//通过方法得到值
if(o instanceof String){//判断值是否属于字符串类型(oracle的sql语句中string类型需要加''号)
sbsql.append("and "+methodName+"='"+o+"' ");
}else{
sbsql.append("and "+methodName+"="+o+" ");
}

}
return sbsql.toString();
}
//获取添加语句
public static String insertsql(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<? extends Object> c=obj.getClass();
String tableName = c.getSimpleName();
StringBuffer sbsql=new StringBuffer();
sbsql.append(" insert into "+tableName+" ( ");
Field[] fields = c.getDeclaredFields();
for(Field f : fields){
String str=f.getName();
sbsql.append(str+",");

}
sbsql.deleteCharAt(sbsql.length()-1);//去掉生成的字符串最后一个多余的【,】号
sbsql.append(") values(");

for(Field f : fields){
String methodName="get"+f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
Method m = c.getDeclaredMethod(methodName);
Object o=m.invoke(obj);
if(o instanceof String ){
sbsql.append("'"+o+"',");
}else{
sbsql.append(o+",");
}

}
sbsql.deleteCharAt(sbsql.length()-1);//去掉生成的字符串最后一个多余的【,】号
sbsql.append(") ");
return sbsql.toString();
}
//获取更新语句
public static String updatesql(Object obj) throws IllegalArgumentException, IllegalAccessException{
Class<? extends Object> c = obj.getClass();
String tableName = c.getSimpleName();
String sbsql=" update "+tableName;
String sql1=" where ";
String sql2=" set ";
Field[] fields = c.getDeclaredFields();
for(Field f:fields){
f.setAccessible(true);
if(f.isAnnotationPresent(Primarykey.class)){
Object o=f.get(obj);
if(o instanceof String){
sql1+=f.getName()+"='"+o+"' ";
}else{
sql1+=f.getName()+"="+o+" ";
}
}else if(!f.isAnnotationPresent(NonField.class)){
Object o=f.get(obj);
if(o instanceof String){
sql2+=f.getName()+"='"+o+"', ";
}else{
sql2+=f.getName()+"="+o+", ";
}
}
}
sql2=sql2.substring(0,sql2.length()-2);
sbsql=sbsql+sql2+sql1;
return sbsql;
}
//获取删除语句
public static String deletesql(Object obj) throws IllegalArgumentException, IllegalAccessException{
Class<? extends Object> c = obj.getClass();
String tableName = c.getSimpleName();
String sql=" delete from "+tableName;
String sql2=" where ";
Field[] fields= c.getDeclaredFields();
for(Field f:fields){
f.setAccessible(true);
if(f.isAnnotationPresent(Primarykey.class)){
Object o = f.get(obj);
if(o instanceof String ){
sql2+=f.getName()+"='"+o+"' ";
}else{
sql2+=f.getName()+"="+o+" ";
}
}
}
sql=sql+sql2;
return sql;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: