
org.fastquery.util.BeanUtil Maven / Gradle / Ivy
/*
* Copyright (c) 2016-2017, fastquery.org and/or its affiliates. All rights reserved.
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information, please see http://www.fastquery.org/.
*
*/
package org.fastquery.util;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.fastquery.core.Id;
import org.fastquery.core.Placeholder;
import org.fastquery.core.RepositoryException;
import com.alibaba.fastjson.JSONArray;
/**
*
* @author xixifeng ([email protected])
*/
public final class BeanUtil {
private static final Logger LOG = Logger.getLogger(BeanUtil.class);
private BeanUtil() {
}
/**
* 将1个bean 转换成 insert sql语句, 注意: 主键值为null,将不参与运算.
*
* @param bean 实体
* @param dbNamePrefix 数据库名称前缀
* @return insert 语句
*/
public static String toInsertSQL(Object bean,boolean dbNamePrefix) {
int idOfSet = -1; // 用于记录主键名应该在sql中的什么位置
Class> clazz = bean.getClass();
String tableName = clazz.getSimpleName();
StringBuilder sqlsb = new StringBuilder("insert into ");
if(dbNamePrefix) {
sqlsb.append("`${dbpre}`.");
}
sqlsb.append("`");
sqlsb.append(tableName);
sqlsb.append("`");
sqlsb.append("(");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(field.getType().isArray() || !TypeUtil.isWarrp(field.getType())){
continue;
}
// 如果是主键,记录一下应该插入的位置
if(field.getAnnotation(Id.class) !=null ) {
idOfSet = sqlsb.length();
} else {
sqlsb.append("`");
sqlsb.append(field.getName());
sqlsb.append("`");
}
sqlsb.append(',');
}
sqlsb.deleteCharAt(sqlsb.length() - 1);
sqlsb.append(") values");
try {
sqlsb.append('(');
for (Field field : fields) {
if(field.getType().isArray() || !TypeUtil.isWarrp(field.getType())){
continue;
}
field.setAccessible(true);
Object val = field.get(bean);
if(field.getAnnotation(Id.class)!=null) {
if (val != null) {
sqlsb.insert(idOfSet, new StringBuilder().append("`").append(field.getName()).append("`"));
sqlsb.append("'" + StringEscapeUtils.escapeSql(val.toString()) + "',");
} else {
if(sqlsb.charAt(idOfSet) == ',') {
sqlsb.deleteCharAt(idOfSet);
}
}
} else {
if (val != null) {
sqlsb.append("'" + StringEscapeUtils.escapeSql(val.toString()) + "',");
} else {
sqlsb.append(val);
sqlsb.append(',');
}
}
}
sqlsb.deleteCharAt(sqlsb.length() - 1);
sqlsb.append("),");
} catch (Exception e) {
throw new RepositoryException(e);
}
sqlsb.deleteCharAt(sqlsb.length() - 1);
return sqlsb.toString();
}
public static String toInsertSQL(String dbName, Object bean) {
return toInsertSQL(bean, true).replace("${dbpre}", dbName);
}
public static String toFields(Class clazz,Field[] fields,B bean) {
StringBuilder sb = new StringBuilder();
sb.append('(');
for (Field field : fields) {
if(field.getType().isArray() || !TypeUtil.isWarrp(field.getType())){
continue;
}
try {
field.setAccessible(true);
if(field.getAnnotation(Id.class) == null || field.get(bean) != null) {
sb.append("`");
sb.append(field.getName());
sb.append("`,");
}
} catch (IllegalAccessException | IllegalArgumentException e) {
throw new RepositoryException(e);
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append(')');
return sb.toString();
}
/**
* 将bean 转换成这样的格式: ('12','sunny','20')
* @param 实体
* @param clazz 实体class
* @param fields 实体字段集
* @param bean 实体
* @return sql value部分
*/
public static String toValue(Class clazz,Field[] fields,B bean) {
StringBuilder sb = new StringBuilder();
sb.append('(');
for (Field field : fields) {
if(field.getType().isArray() || !TypeUtil.isWarrp(field.getType())){
continue;
}
Object val = null;
try {
field.setAccessible(true);
val = field.get(bean);
} catch (IllegalAccessException | IllegalArgumentException e) {
throw new RepositoryException(e);
}
if( val!= null ) {
sb.append("'");
sb.append(StringEscapeUtils.escapeSql(val.toString()));
sb.append("',");
} else if(field.getAnnotation(Id.class) == null) {
sb.append("null,");
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append(')');
return sb.toString();
}
/**
* 把实体集合转换成sql中的values部分
* @param clazz 实体class
* @param fields 实体的字段
* @param beans 实体集
* @return sql 中的 values 部分
*/
private static String toValues(Class clazz,Field[] fields,Iterable beans) {
StringBuilder sbValues = new StringBuilder();
sbValues.append("values");
for (B b : beans) {
sbValues.append(toValue(clazz,fields,b));
sbValues.append(',');
}
sbValues.deleteCharAt(sbValues.length() - 1);
return sbValues.toString();
}
/**
* 转换insert 语句
* @param 实体
* @param beans 如果结合为空,则返回null
* @param dbName 如果为null,表名称之前不会有前缀
* @param ignoreRepeat 忽略重复
* @return 插入语句
*/
public static String toInsertSQL(Iterable beans,String dbName,boolean ignoreRepeat) {
if(beans==null)
return null;
Iterator iterator = beans.iterator();
if(!iterator.hasNext()) {
return null;
}
// 集合中的第一个bean
B bean = iterator.next();
@SuppressWarnings("unchecked")
Class clazz = (Class) bean.getClass();
// 确立表名称
StringBuilder sb = new StringBuilder();
if(dbName!=null) {
sb.append('`');
sb.append(dbName);
sb.append("`.`");
sb.append(clazz.getSimpleName());
sb.append('`');
} else {
sb.append('`');
sb.append(clazz.getSimpleName());
sb.append('`');
}
Field[] fields = clazz.getDeclaredFields();
// 表名称
String tableName = sb.toString();
// 表字段
String fs = toFields(clazz, fields, bean);
// values 部分
String values = toValues(clazz, fields, beans);
// insert into 语句
String insertStr;
if(ignoreRepeat) {
insertStr = "insert ignore into";
} else {
insertStr = "insert into";
}
StringBuilder insertsql = new StringBuilder();
insertsql.append(insertStr);
insertsql.append(" ");
insertsql.append(tableName);
insertsql.append(fs);
insertsql.append(" ");
insertsql.append(values);
return insertsql.toString();
}
public static String arr2InsertSQL(Object[] beans,String dbName,boolean ignoreRepeat) {
Iterable
© 2015 - 2025 Weber Informatics LLC | Privacy Policy