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

通过反射+注解生成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;
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值