java反射获取注解并拼接sql语句

先建两个注解 分别为 Table 和 Column

package com.hk.test;

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

  

package com.hk.test;

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

然后新建一个 bean 类 Filter.java (本类可根据自己需求更改,只要样式不变就好)

package com.hk.test;
@Table("user")
public class Filter {
    @Column("id")
    private int id;
    @Column("user_name")
    private String userName;
    @Column("age")
    private int age;
    @Column("email")
    private String email;
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}

然后测试类

package com.hk.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 *
 * @author hk_z
 * @deprecated 对类进行反射 获取注解和字段名 拼接成sql语句
 * @version 0.1
 */
public class Test {
    public static void main(String[] args) {
        Filter f1 = new Filter();
        f1.setId(10);

        Filter f2 = new Filter();
        f2.setUserName("lucy"); //模糊查询

        Filter f3 = new Filter();
        f3.setEmail("[email protected],[email protected]"); //任意其一

        String sql1 =query(f1);
        System.out.println(sql1);
        String sql2 =query(f2);
        System.out.println(sql2);
        String sql3 =query(f3);
        System.out.println(sql3);
    }

    private static String query(Filter f1) {
        // TODO Auto-generated method stub
        StringBuilder sb =new StringBuilder();
        //1.获取到class
        Class c = f1.getClass();
        //2.获取到table 的名字
        boolean exists = c.isAnnotationPresent(Table.class); //class 中有没有table的注解
        if(!exists){
            return null;
        }
        Table t= (Table)c.getAnnotation(Table.class);
        String tableName = t.value(); //表名
        sb.append("select * from ").append(tableName).append(" where 1 = 1");
        //3.遍历所有的字段
        Field[] fArray = c.getDeclaredFields();
        for(Field field:fArray){
            //4.处理每个字段对应的sql
            //4.1 拿到字段名
            boolean fExists = field.isAnnotationPresent(Column.class);
            if(!fExists){
                continue;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName = column.value();  //表里面字段的名字
            //4.2拿到字段的值
            String filedName = field.getName(); //变量的名字
            String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
            Object fieldValue = null;
            //拼装get方法 获取返回值 ;
            try {
                Method getMethod = c.getMethod(getMethodName); //反射
                fieldValue = getMethod.invoke(f1);     //反射调用    

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //4.3 拼装sql
            if(fieldValue == null||(fieldValue instanceof Integer &&(Integer)fieldValue==0))
            {
                continue;
            }
            sb.append(" and ").append(filedName);
            String [] val=null;
            if(fieldValue instanceof String){ //字串型并且有逗号 进行拆分
                if(((String)fieldValue).contains(",")){
                    val = ((String) fieldValue).split(",");
                    sb.append(" in(");
                    for(String v:val){
                        sb.append("‘").append(v).append("‘").append(",");
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append(")");
                    }
                else{
                    sb.append(" = ").append("‘").append(fieldValue).append("‘");
                }
            }
            else if(fieldValue instanceof Integer){
            sb.append(" = ").append(fieldValue);
            }

        }
        return sb.toString();
    }
}
时间: 2024-10-12 19:01:57

java反射获取注解并拼接sql语句的相关文章

java用字符串拼接SQL语句的特殊字符转义问题

在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询.如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入.比如对输入的%和_和',就需要进行转义,因为这3个字符是SQL的特殊字符,如果不处理会导致sql出错或者是查询数据不正确. 假如有这样1个查询请求,模糊查询标题中包含a%b_cc'd的记录,正确的sql应该是下面这样的: select * from t_sch_work_info t where t.t

Java自定义注解和运行时靠反射获取注解

Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在c

java动态拼接sql语句并且执行时给sql语句的参数赋值

问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 1.就拿我上面的那个多条件模糊查询为例,第一步是拼接sql语句,先定义一个通用的sql语句,String sql = "select * from user where 1 = 1 ";这里添加where 1= 1是一个小技巧,方便后面sql语句的拼接. String sql = &quo

JAVA反射与注解实例

1    JAVA反射机制 JAVA反射机制是在运行状况中,号码大全关于恣意一个类,关键词挖掘工具都能够晓得这个类的一切特点和办法:关于恣意一个目标,都能够调用它的恣意一个办法和特点:这种动态获取的信息以及动态调用目标的办法的功能称为java言语的反射机制.或许说,JAVA反射机制指的是咱们能够于运行时加载.探知.运用编译时间完全不知道的classes.换句话说,Java程序能够加载一个运行时才得知称号的class,得悉其完好结构(但不包括methods界说),并生成其目标实体.或对其field

mybatis(4)--使用注解方式配置sql语句

使用注解方式配置sql语句,不需要写对应的UserMapper.xml package com.mapper; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations

SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集

ALTER PROCEDURE [dbo].[usp_visit_detail](@siteid BIGINT, @Startime VARCHAR(15), @Endtime  VARCHAR(15), @Aflag  INT = 10,                                    --初始值为10,非10,则表示有传入参数 @Area   VARCHAR(20) = 'N',               -- --初始值为N,非N,则表示有传入参数 @Nflag  

使用表达式避免拼接SQL语句

在SQL语句编写过程中,无论在存储过程中还是在程序中,有时为了使语句兼容全部情况与某字段的特殊情况,不得不拼接SQL字串 如下表 商品ID 类别ID 1 1 2 1 3 2 4 3 5 3 如果我们要写一个SQL,改SQL可通过类别ID获得该类别的商品ID,并且要求兼容传入类别ID为0时获得所有商品,我们不得不拼接SQL了 --@类别ID为传入的参数 DECLARE @Sql NVARCHAR(500) SET @Sql='SELECT * FROM 商品' IF(@类别ID!=0) SET @

关于在java中向带有IN的SQL语句中传参数的问题

今天遇到俩个问题: 1.在使用表格模型的时候,从数据库查询出来的数据赋值到Jtable的时候永远只显示最后一天记录,前面的都被覆盖了.一直在究其原因,未果,遂择其道而行之(第二个问题). 2.为了解决上面的问题,我将SQL语句的条件换成IN,目的想把所有参数一并传过去,查询所有记录后在一并显示到Jtable上,实验证明我的做法是对的.但是,一直没有搞懂IN(?)这个问号应该如何传值. SQL : String sql = " select sxh,grbm,xm,yybm,fyze,qzfbf,

sqlserver 存储过程中拼接sql语句 动态执行

ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @gradeId INT, @cId INT, @keyWords NVARCHAR(100), @userName VARCHAR(50) AS BEGIN DECLARE @sqlfilter VARCHAR(max) SET @sqlfilter = ' ' IF(@schoolId <> -1) S