packagecom.hwq.reflex;importcom.hwq.annotate.KeyID;importcom.hwq.annotate.TableName;importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;importjava.util.ArrayList;importjava.util.List;public class SqlHelper{protected String tableName = null; //表名
protected String id; //主键在 实体类的 名称
protected String key; //主键在 数据库的 名称
protected List fieldList = new ArrayList(); //字段数据
Field[] fieldArr; //反射出来的字段对象,在取值的时候有用
/*** 获取泛型类的方法,由于 JAVA 虚拟机的泛型擦除机制,我们无法获取对应的实体类
* 该方法可以在子类明确表示实体类的情况下,获取到实体类注解以及字段
*@return
*/
private synchronized voidgetTableInfo() {if (tableName == null) {
Type type= this.getClass().getGenericSuperclass();
Type[] typeArr=((ParameterizedType) type).getActualTypeArguments();
Class mtClass = (Class) (typeArr[0]);
TableName table= (TableName) mtClass.getAnnotation(TableName.class); //获取类上 @TableName 注解
tableName =table.value();
fieldArr=mtClass.getDeclaredFields();
List keyList = new ArrayList();
List idList = new ArrayList();for (int i = 0; i < fieldArr.length; i++) {
fieldArr[i].setAccessible(true);
KeyID keyID= fieldArr[i].getAnnotation(KeyID.class); //获取类字段上的 @KeyId 注解
if (keyID != null) {
key=keyID.value();
id=fieldArr[i].getName();
}
fieldList.add(fieldArr[i].getName());//获取类的所有字段
}
}
}/*** 新增的方法*/
public voidsave(T t) {
getTableInfo();
StringBuilder insertSql= new StringBuilder(192);
StringBuilder filedStr= new StringBuilder(64);
StringBuilder valueStr= new StringBuilder(64);
insertSql.append("INSERT INTO ");
insertSql.append(tableName);
filedStr.append(" (");
valueStr.append(" VALUE (");try{for (int i = 0; i < fieldList.size(); i++) {
String field=fieldList.get(i);if (field == id) continue;
filedStr.append(field);
filedStr.append(",");
valueStr.append("'");
valueStr.append(fieldArr[i].get(t));
valueStr.append("',");
}
}catch(Exception ex) {throw newRuntimeException(ex.getMessage());
}
insertSql.append(filedStr.substring(0, filedStr.length() - 1));
insertSql.append(")");
insertSql.append(valueStr.substring(0 ,valueStr.length() - 1));
insertSql.append(")");
String sql=insertSql.toString();
System.out.println(insertSql.toString());
}/*** 编辑的方法,根据主键编辑*/
public voidedit(T t) {
getTableInfo();
StringBuilder updateSql= new StringBuilder(192);
updateSql.append("UPDATE ");
updateSql.append(tableName);
updateSql.append(" SET ");int count = 0;
String idValue= null;try{for (int i = 0; i < fieldList.size(); i++) {
Object value=fieldArr[i].get(t);if (value == null) continue;
String field=fieldList.get(i);if (field ==id) {
idValue=value.toString();
}else{
updateSql.append(field);
updateSql.append("='");
updateSql.append(value);
updateSql.append("',");
count++;
}
}
}catch(Exception ex) {throw newRuntimeException(ex.getMessage());
}if (count == 0 || idValue == null) {throw new RuntimeException("主键为空或实体类没有需要修改的字段");
}
String sql= updateSql.substring(0, updateSql.length() - 1);
sql+= " WHERE " + key + "='" + idValue + "'";
System.out.println(sql);
}/*** 删除的方法,根据主键,单个删除*/
public void removeById(intid) {
getTableInfo();
StringBuilder deleteSql= new StringBuilder(128);
deleteSql.append("DELETE FROM ");
deleteSql.append(tableName);
deleteSql.append(" WHERE ");
deleteSql.append(key);
deleteSql.append("=");
deleteSql.append(id);
String sql=deleteSql.toString();
System.out.println(sql);
}
}