利用反射动态生成sql语句

  1. /**
  2. 这里代码的意思是传进来一个object,检查里面有没有空值,如果有空值,则赋给默认值,最后传出一个没有空值的object,防止入库的时候发生空值错误
  3. **/
  4. package com.copote.xmove4Frame.util;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.lang.reflect.Method;
  8. /**
  9.  * bean的反射,检查出bean中的值是否包含空值,如果为空,则赋默认值
  10.  * @author Don Quixote
  11.  * Dec 26, 2008 12:51:30 PM
  12.  * Hello,Don Quixote!
  13.  */
  14. public class BeanReflect {
  15.     
  16.     public Object beanReflect(Object object){
  17.         
  18.         Method metd = null;
  19.         String fdname = null;
  20.        
  21.         Class cs = object.getClass();// 获取集合中的对象类型
  22.          Field[] fds = cs.getDeclaredFields();// 获取他的字段数组
  23.          for (Field field : fds) {// 遍历该数组
  24.              fdname = field.getName();// 得到字段名,
  25.              try {
  26.                     //先获取相应的method对象
  27.                     //getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
  28.                     //因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
  29.                     // 根据字段名找到对应的get方法,null表示无参数
  30.                     metd = cs.getMethod("get" + change(fdname), null);
  31.                     //第一个参数是具体调用该方法的对象
  32.                     //第二个参数是执行该方法的具体参数
  33.                     Object value = metd.invoke(object, null);// 调用该字段的get方法
  34.                     //当value不为空的时候 
  35.                     if(value==null){
  36.                         //当得到的属性值不包含表的主键值的时候
  37.                         BeanReflect brf=new BeanReflect();
  38.                         brf.beanf(object,fdname,"0");
  39.                     }
  40.                   
  41.              } catch (IllegalArgumentException e) {
  42.                     // TODO Auto-generated catch block
  43.                     e.printStackTrace();
  44.              } catch (IllegalAccessException e) {
  45.                     // TODO Auto-generated catch block
  46.                     e.printStackTrace();
  47.              } catch (InvocationTargetException e) {
  48.                     // TODO Auto-generated catch block
  49.                     e.printStackTrace();    
  50.              } catch (SecurityException e) {
  51.                 // TODO Auto-generated catch block
  52.                 e.printStackTrace();
  53.              } catch (NoSuchMethodException e) {
  54.                 // TODO Auto-generated catch block
  55.                 e.printStackTrace();
  56.              }
  57.          }
  58.         return object;
  59.     }
  60.     //将src的第一个字母转换为大写,src为空时返回null
  61.      public  String change(String src) {
  62.             if (src != null) {
  63.                 StringBuffer sb = new StringBuffer(src);
  64.                 sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
  65.                 return sb.toString();
  66.             } else {
  67.                 return null;
  68.             }
  69.         }
  70.      //判断一个字符串是否为空,包含字符串全部由空格组成的情况
  71.     //如果为空,返回true
  72.      public  boolean blankTest(Object ob){
  73.          boolean rv=false//返回值,为空,返回true
  74.          if(ob==null){
  75.              rv=true;
  76.          }else{
  77.              String st=ob.toString();
  78.              int sl=st.length();
  79.              if(sl==0) rv=true;
  80.              for(int i=0;i<sl-1;i++){
  81.                  if(st.substring(i, i+1)!=" "){
  82.                      rv=false;
  83.                  }
  84.              } 
  85.          }
  86.          return rv;
  87.      }
  88.      //判断tableKeyArr是否包含
  89.      public  boolean tableKeyTest(String[] tableKeyArr,String st){
  90.         for(int i=0;i<tableKeyArr.length;i++){
  91.             if(tableKeyArr[i].contains(st)) return true;
  92.         }
  93.         return false;
  94.      }
  95.      
  96.      public void beanf(Object bean,String nullValueName,Object value){
  97.          Method[] methods = bean.getClass().getDeclaredMethods();
  98.          String methodName;
  99.          String methodNameFix;
  100.          String field = nullValueName;
  101.           try {
  102.              for (int i = 0; i < methods.length; i++) {
  103.                   methodName = methods[i].getName();
  104.                   methodNameFix = methodName.substring(3, methodName.length());
  105.                   methodNameFix = methodNameFix.toLowerCase();
  106.                   if (methodName.startsWith("set")) {
  107.                       if (methodNameFix.equals(field)) {
  108.                           Object[] objs = new Object[1];
  109.                            objs[0] = value;
  110.                             methods[i].invoke(bean, objs);
  111.                         // 激活obj相应的set方法,///objs数组存放调用该方法的参数
  112.                            continue;
  113.                       }
  114.                   }
  115.              }
  116.           } catch (IllegalArgumentException e) {
  117.                 // TODO Auto-generated catch block
  118.                 e.printStackTrace();
  119.             } catch (IllegalAccessException e) {
  120.                 // TODO Auto-generated catch block
  121.                 e.printStackTrace();
  122.             } catch (InvocationTargetException e) {
  123.                 // TODO Auto-generated catch block
  124.                 e.printStackTrace();
  125.             }
  126.      }
  127. }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java通过反射注解生成对应的SQL语句的步骤如下: 1. 定义注解:首先需要定义一个注解,该注解用于标识字段信息,例如字段名、字段类型、是否为主键等信息。 ``` @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String name(); // 字段名 String type(); // 字段类型 boolean primaryKey() default false; // 是否为主键 } ``` 2. 定义实体类:在实体类的字段上使用上面定义的注解。 ``` public class User { @Column(name = "id", type = "int", primaryKey = true) private int id; @Column(name = "name", type = "varchar") private String name; @Column(name = "age", type = "int") private int age; // 省略getter和setter方法 } ``` 3. 通过反射获取实体类的字段信息:通过反射获取实体类的字段信息,然后读取字段上的注解,获取字段名、字段类型和是否为主键等信息。 ``` public static <T> String generateCreateTableSql(Class<T> clazz) { StringBuilder sb = new StringBuilder(); sb.append("CREATE TABLE IF NOT EXISTS "); sb.append(clazz.getSimpleName()); sb.append("("); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); sb.append(column.name()); sb.append(" "); sb.append(column.type()); if (column.primaryKey()) { sb.append(" PRIMARY KEY"); } sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(")"); return sb.toString(); } ``` 4. 生成SQL语句:将读取到的字段信息拼接成对应的SQL语句,例如创建表、插入数据、更新数据等。 ``` public static <T> String generateInsertSql(T entity) { StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO "); sb.append(entity.getClass().getSimpleName()); sb.append("("); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); sb.append(column.name()); sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(") VALUES ("); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { field.setAccessible(true); Object value = field.get(entity); if (value instanceof String) { sb.append("'"); sb.append(value); sb.append("'"); } else { sb.append(value); } sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(")"); return sb.toString(); } ``` 以上就是利用反射注解生成对应的SQL语句的步骤,可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值