常青树 发表于 2018-10-20 13:10:40

Java注解项目实战即模拟Hibenernate生成sql语句

package com.imooc.test;  
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);
  
Filter f2 = new Filter();
  
f2.setUserName("lucy");
  
Filter f3 = new Filter();
  
f3.setEmail("su@outlook.com,li@qq.com,hehe@163.com");
  
Coder c1 = new Coder();
  
c1.setUserName("ruanjianlin");
  
String sql1 = query(f1);
  
String sql2 = query(f2);
  
String sql3 = query(f3);
  
String sql4 = query(c1);
  
System.out.println(sql1);
  
System.out.println(sql2);
  
System.out.println(sql3);
  
System.out.println(sql4);
  
}
  
private static String query(Object f) {
  
// TODO Auto-generated method stub
  
StringBuilder sb = new StringBuilder();
  
// 1.获取Class通过类的类类型得到类的详细信息
  
Class c = f.getClass();
  
// Java Package.isAnnotationPresent()方法用法实例教程。方法返回true,如果指定类型的注释存在于此元素上,
  
// 否则返回false
  
// 2.获取Table的名字
  
boolean exists = c.isAnnotationPresent(Table.class);
  
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();
  
   Object fieldValue = null;
  
   String filedName = field.getName();
  
   // 4.2拿到字段值(先获取字段的get方法)
  
   String getMethodName = "get"
  
   + filedName.substring(0, 1).toUpperCase()
  
   + filedName.substring(1);
  
   try {
  
    Method getMethod = c.getMethod(getMethodName);// 取得该值
  
    // 反射渠道得到字段值
  
    fieldValue = getMethod.invoke(f);
  
   } catch (SecurityException e) {
  
    // TODO Auto-generated catch block
  
    e.printStackTrace();
  
   } catch (NoSuchMethodException e) {
  
    // TODO Auto-generated catch block
  
    e.printStackTrace();
  
   } catch (IllegalArgumentException e) {
  
    // TODO Auto-generated catch block
  
    e.printStackTrace();
  
   } catch (IllegalAccessException e) {
  
    // TODO Auto-generated catch block
  
    e.printStackTrace();
  
   } catch (InvocationTargetException e) {
  
    // TODO Auto-generated catch block
  
    e.printStackTrace();
  
   }
  
   if (fieldValue == null
  
   || (fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
  
    continue;
  
   }
  
   //4.3拼装sql
  
   sb.append("and ").append(columnName);
  
   if (fieldValue instanceof String) {
  
    if (((String) fieldValue).contains(",")) {
  
   String[] values = ((String) fieldValue).split(",");
  
   sb.append(" in(");
  
   for (String v : values) {
  
      sb.append("'").append(v).append("',");
  
   }
  
   sb.deleteCharAt(sb.length() - 1);
  
   sb.append(")");
  
    } else {
  
   sb.append("= '").append(fieldValue).append("'");
  
    }
  
   } else {
  
    sb.append("=").append(fieldValue.toString());
  
   }
  
}
  
return sb.toString();
  
}
  
}


页: [1]
查看完整版本: Java注解项目实战即模拟Hibenernate生成sql语句