标签:des style blog http color io os ar 使用
各式结构化数据的动态接入存储查询,这一需求相信有很多人都遇到过,随着实现技术路线选择的不同,遇到的问题出入大了,其解决办法也是大相径庭。数据存储在哪儿,是关系型数据库,还是NoSQL数据库,是MySQL还是Oracle,怎么建立索引,建立什么类型的索引,都是大学问。下面,我要把我对这一解决办法的思考总结一下,有成熟的也有不成熟的,希望大家一起共同探讨。
各式结构化数据 动态 接入-存储-查询 的处理办法 (第一部分)http://www.cnblogs.com/wgp13x/p/4019600.html
)屏蔽了如int、string、date等数据类型,在colummns中可以说明数据中各字段的数据类型,也可以省略这一colummns说明;在data中,统一把数值转化为string类型。
/**
* 数据
*
* @author 王安琪
* @since 2014-9-30下午4:13:07
*/
public class Datas implements Serializable
{
@JsonProperty("dataType")
private String dataType;//数据类型名称
@JsonProperty("columns")
private Map<String, String> columns;//这里可以为空,属性名-属性类型 键值对
@JsonProperty("datas")
private List<Data> datas;//多行数据
} |
/**
* 一行数据
*
* @author 王安琪
* @since 2014-9-30下午2:16:06
*/
public class Data implements Serializable
{
@JsonProperty("data")
private Map<String, String> data;//属性名-属性值 键值对} |
/**
* 查询条件
*
* @author 王安琪
* @since 2014-9-30下午3:45:23
*/
public class Search implements Serializable
{
@JsonProperty("area")
private List<String> area;
@JsonProperty("order")
private Order order;
@JsonProperty("condition")
private Condition condition;} |
/**
* 查询排序条件
*
* @author 王安琪
* @since 2014-7-30下午4:03:46
*/
public class Order implements Serializable
{
@JsonProperty("front")
private int front;
@JsonProperty("end")
private int end;
@JsonProperty("sequences")
private Map<String, String> sequences; // "age", "desc"; "name", "asc"} |
/**
* 查询约束组合
*
* @author 王安琪
* @since 2014-9-30下午4:04:41
*/
public class Condition implements Addable, Serializable
{
@JsonProperty("relation")
private String relation;
@JsonProperty("terms")
private List<Term> terms;
@JsonProperty("conditions")
private List<Condition> conditions;} |
/**
* 单一查询约束
*
* @author 王安琪
* @since 2014-9-30下午3:45:39
*/
public class Term implements Addable, Serializable
{
@JsonProperty("field")
private String field;
@JsonProperty("type")
private String type;
@JsonProperty("oper")
private String oper;
@JsonProperty("values")
private List<String> values;} |
Term 类 | Term 类 |
/**
* 将Term转变为SQL语句
*
* @return SQL语句
*/public String toSQL()
{
StringBuilder sql = new StringBuilder();
String valuesSQL = getSqlValues(type, oper, values);
String sqlOper = getSqlOper(oper);
sql.append(field).append(" ").append(sqlOper).append(" ")
.append(valuesSQL);
if (sqlOper.equals("like"))
{
sql.append(" ESCAPE ‘!‘");
}
return sql.toString();
} |
private String getSqlValues(String type, String oper, List<String> values)
{
StringBuilder sqlValue = new StringBuilder();
if (values.size() == 1)
{
sqlValue.append(getSqlValue(type, oper, values.get(0)));
}
else if (values.size() > 1)// between
{
for (String value : values)
{
sqlValue.append(getSqlValue(type, oper, value)).append(" and ");
}
sqlValue.delete(sqlValue.length() - 5, sqlValue.length());
}
return sqlValue.toString();
} |
private String getSqlValue(String type, String oper, String value)
{
StringBuilder sqlValue = new StringBuilder();
value = StringEscapeUtils.escapeSql(value);
sqlValue.append("‘");
switch (oper)
{
case "like":
sqlValue.append("%").append(escapeLikeSql(value)).append("%");
break;
default:
sqlValue.append(value);
break;
}
sqlValue.append("‘");
return sqlValue.toString();
} |
private String escapeLikeSql(String likeValue)
{
String str = StringUtils.replace(likeValue, "!", "!!");
str = StringUtils.replace(str, "%", "!%");
str = StringUtils.replace(str, "*", "!*");
str = StringUtils.replace(str, "?", "!?");
str = StringUtils.replace(str, "_", "!_");
return str;
}
private String getSqlOper(String oper)
{
String sqlOper;
switch (oper)
{
case "like":
sqlOper = "like";
break;
default:
sqlOper = oper;
break;
}
return sqlOper;
} |
Condition 类 | Search 类 |
/**
* 产生SQL语句
*
* @return SQL语句
*/
public String toSQL()
{
StringBuilder sql = new StringBuilder();
String rlt = (relation == null || relation.isEmpty()) ? Constants.SQL_AND
: relation;
if (terms != null)
{
for (Term term : terms)
{
sql.append("(").append(term.toSQL()).append(")").append(rlt);
}
sql.delete(sql.length() - rlt.length(), sql.length());
}
if (conditions != null)
{
for (Condition condition : conditions)
{
sql.append("(").append(condition.toSQL()).append(")")
.append(rlt);
}
sql.delete(sql.length() - rlt.length(), sql.length());
}
return sql.toString();
} |
public String toSQL()
{
if (this.condition == null)
{
return "1 = 1";
}
return this.condition.toSQL();
} |
List<Data> datas = new ArrayList<Data>();
for (Object oResult : result)
{
Map mResult = (Map) oResult;
Map<String, String> values = new HashMap<String, String>();
for (Object o : mResult.keySet())
{
if (o == null || mResult.get(o) == null)
{
continue;
}
String name = String.valueOf(o);
Object vo = mResult.get(name);
String value;
{
value = String.valueOf(mResult.get(name)).trim();
}
if (value == null || value.equals(""))
{
continue;
}
values.put(name, value);
}
Data data = new Data(values);
datas.add(data);
}
Datas ret = new Datas(search.getArea().get(0), null, datas); |
各式结构化数据 动态 接入-存储-查询 的处理办法 (第二部分)
标签:des style blog http color io os ar 使用
原文地址:http://www.cnblogs.com/wgp13x/p/4031979.html