发表于: 2017-11-28 14:12:22
1 732
今天完成的事情:复习了一下 sql语句 写了一下 动态拼接
public static String convert2Sql(Map<String, Object> conditions, Integer start, Integer limit) {
StringBuffer sqlBuffer = new StringBuffer();
if (conditions.containsKey("@update")) {
// update
sqlBuffer = sqlBuffer.append("update ");
if (conditions.containsKey("@table")) {
String table = (String) conditions.get("@table");
sqlBuffer = sqlBuffer.append(table);
}else{
log.error("not get any table ");
}
sqlBuffer = sqlBuffer.append(" set ");
boolean querySentence = false;
if (conditions.containsKey("@field")) {
String field = (String) conditions.get("@field");
sqlBuffer = sqlBuffer.append(field);
}else{
log.error("not get any field ");
}
sqlBuffer = sqlBuffer.append(" = ");
if (conditions.containsKey("@value")) {
String value = (String) conditions.get("@value");
sqlBuffer = sqlBuffer.append(value);
}else{
log.error("not get any value ");
}
sqlBuffer = sqlBuffer.append(" where ");
boolean first=true;
for (String field : conditions.keySet()) {
String[] ps = field.split("&");
if (ps.length == 1) {
if (field.startsWith("@")) {
continue;
} else {
if(first){
}else{
sqlBuffer = sqlBuffer.append(" and ");
}
first=false;
}
sqlBuffer = sqlBuffer.append(field);
sqlBuffer = sqlBuffer.append(" = ");
} else {
if(first){
}else{
sqlBuffer = sqlBuffer.append(" and ");
}
first=false;
sqlBuffer = sqlBuffer.append(ps[0]);
sqlBuffer = sqlBuffer.append(ps[1]);
}
sqlBuffer = sqlBuffer.append(conditions.get(field));
}
} else {
// select
sqlBuffer = sqlBuffer.append("select ");
if (conditions.containsKey("@query")) {
sqlBuffer = sqlBuffer.append(conditions.get("@query"));
} else {
sqlBuffer = sqlBuffer.append("id");
}
sqlBuffer = sqlBuffer.append(" from ");
if (conditions.containsKey("@table")) {
String table = (String) conditions.get("@table");
sqlBuffer = sqlBuffer.append(table);
}else{
log.error("not get any table ");
}
sqlBuffer = sqlBuffer.append(" where 1 = 1 ");
boolean querySentence = false;
for (String field : conditions.keySet()) {
String[] ps = field.split("&");
if (ps.length == 1) {
if (field.startsWith("@")) {
continue;
} else {
sqlBuffer = sqlBuffer.append(" and ");
}
sqlBuffer = sqlBuffer.append(field);
sqlBuffer = sqlBuffer.append(" = ");
} else {
sqlBuffer = sqlBuffer.append(" and ");
sqlBuffer = sqlBuffer.append(ps[0]);
sqlBuffer = sqlBuffer.append(ps[1]);
}
sqlBuffer = sqlBuffer.append(conditions.get(field));
}
if (conditions.containsKey("@group")) {
sqlBuffer = sqlBuffer.append(" group by ");
sqlBuffer = sqlBuffer.append(conditions.get("@group"));
} else {
}
if (conditions.containsKey("@order")) {
sqlBuffer = sqlBuffer.append(" order by ");
sqlBuffer = sqlBuffer.append(conditions.get("@order"));
} else {
}
sqlBuffer = sqlBuffer.append(" limit ");
sqlBuffer = sqlBuffer.append(start);
sqlBuffer = sqlBuffer.append(" , ");
sqlBuffer = sqlBuffer.append(limit);
}
return sqlBuffer.toString();
}
明天计划的事情:继续写接口
遇到的问题:数据库连接异常
分析,出现这种异常的原因是:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空间超过8个小时,Mysql将自动断开该connection,这就是问题所在,在连接池中的connection如果空闲超过8小时,mysql将其断开,连接池并不知道该connection已失效,如果这时有client请求connection,连接池将失效的connection提供给client,将会造成上面的异常。
解决的方法:(1)增加wait_timeout的时间。 不能用 公共数据库
(2)测试连接池中的connection的有效性。 没看出来框架怎么调用的数据库原
可以使用hibernate等持久化管理框架,如使用配置:
<property name=”connection.autoReconnect”>true</property> <!–这个是最主要的–>
<property name=”connection.autoReconnectForPools”>true</property>
<property name=”connection.is-connection-validation-required”>true</property
也可以在Mysql的url中加入autoReconnect=true。
在data source 配置时加入下面三行也可以解决问题:
<property name=”connection.autoReconnect”>true</property> <!–这个是最主要的–>
<property name=”connection.autoReconnectForPools”>true</property>
<property name=”connection.is-connection-validation-required”>true</property
实际上我更改了group。xml的设置 把最大空闲连接太从50改到了10 好了
今天的收获:
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
StringBuffer 类支持的主要方法:public StringBuffer append(String s) 将指定的字符串追加到此字符序列。
Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断
List集合的contains()方法用于判断集合中包不包含某个元素,返回值是boolean。 Map集合的containsKey()和containsValue()方法和上面的相同,分别判断 集合中的key和 value
评论