您的位置:首页 > 编程语言 > Java开发

如何用一个Java工具类构建sql语句

2017-08-25 13:20 330 查看
首先写一个名字转换器,需要讲实体类名字转换为对应的表名,代码如下:

public class DefaultNameHandler implements NameHandler {
/** 字段前缀 */
private static final String PREFIX = "_";
/** 主键后缀 */
private static final String PRI_SUFFIX = "_id";

/**
* 根据实体名获取表名

* @param entityName
* @return
*/
@Override
public String getTableName(String entityName) {
return getUnderlineName(entityName);
}

/**
* 根据实体名获取表名

* @param entityName
* @return
*/
public String getTableName(Object obj) {
String clazzName = obj.getClass().getSimpleName();

return getTableName(clazzName);
}

/**
* 根据对象字段属性获取数据库字段名

* Java属性的骆驼命名法转换回数据库下划线“_”分隔的格式

* @param str
* @return
*/
public String getUnderlineName(String str) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isLowerCase(c)) {
if (i == 0) {
sb.append(Character.toLowerCase(c));
} else {
sb.append("_").append(Character.toLowerCase(c));
}
} else {
sb.append(c);
}

}
return sb.toString();
}

/**
* 根据表名获取主键名 本地使用"did"

* @param entityName
* @return
*/
@Override
public String getPrimaryName(String entityName) {
return "did";
}

/**
* 根据属性名获取列名

* @param fieldName
* @return
*/
@Override
public String getColumnName(String fieldName) {
return getUnderlineName(fieldName);
}

其次写一个工具类:

public class SqlUtils {
private static final Log logger = LogFactory.getLog(SqlUtils.class);

/**
* 构建删除

* @param entity
* @param nameHandler
* @
4000
return
* @throws Exception
*/
public static SqlContext buildDeleteSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("delete from ");
sql.append(tableName);
sql.append("  where ");
SqlContext condition = buildQueryCondition(entity, nameHandler);
sql.append(condition.getSql());

return new SqlContext(sql, primaryName, condition.getParams());
}

/**
* 构建insert语句

* @param entity
*            实体映射对象
* @param nameHandler
*            名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
args.append("?");
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
return new SqlContext(sql, primaryName, params);
}

/**
* 构建insert语句

* @param entity
*            实体映射对象
* @param nameHandler
*            名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
args.append("'").append(value).append("'");
}

params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}

/**
* 构建insert语句

* @param entity
*            实体映射对象
* @param nameHandler
*            名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParamList(List list,
NameHandler nameHandler) throws Exception {
Object entity = list.get(0);
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
sql.append(" values ");
StringBuilder args = new StringBuilder();
for (Object obj : list) {
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), obj);
if (value == null) {
continue;
}
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(
DateUtils.formatDateTimeToString(val)).append("'");
} else {
args.append("'").append(value).append("'");
}
args.append(",");
}
args.deleteCharAt(args.length() - 1);
args.append("),");
}
args.deleteCharAt(args.length() - 1);

sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}

/**
* 构建更新sql

* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
sql.append("?");
params.add(value);
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = ?");
params.add(primaryValue);
return new SqlContext(sql, primaryName, params);
}

private static Boolean isNumber(Object obj) {
if (obj instanceof Integer || obj instanceof Double
|| obj instanceof Float || obj instanceof Short) {
return true;
}
return false;
}

private static Boolean isDate(Object obj) {
if (obj instanceof Date) {
return true;
}
return false;
}

/**
* 构建更新sql

* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
if (isNumber(value)) {
sql.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
sql.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
sql.append("'").append(value).append("'");
}
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = '");
sql.append(primaryValue).append("'");
return new SqlContext(sql, primaryName, params);
}

/**
* 构建查询条件

* @param entity
* @param nameHandler
* @throws Exception
*/
public static SqlContext buildQueryCondition(Object entity,
NameHandler nameHandler) throws Exception {
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(entity.getClass());
// PropertyDescriptor[] pds =s
// BeanUtils.getPropertyDescriptors(entityClass);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
StringBuilder condition = new StringBuilder();
List<Object> params = new ArrayList<Object>();
int count = 0;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
if (count > 0) {
condition.append(" and ");
}
condition.append(nameHandler.getColumnName(pd.getName()));
condition.append(" = ?");
params.add(value);
count++;
}
return new SqlContext(condition, null, params);
}

/**
* 获取属性值

* @param readMethod
* @param entity
* @return
* @throws Exception
*/
private static Object getReadMethodValue(Method readMethod, Object entity)
throws Exception {
if (readMethod == null) {
return null;
}
try {
if (!Modifier.isPublic(readMethod.getDeclaringClass()
.getModifiers())) {
readMethod.setAccessible(true);
}
return readMethod.invoke(entity);
} catch (Exception e) {
e.printStackTrace(LogUtil.getErrorStream(logger));
throw e;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: