发表于: 2017-11-28 14:12:22

1 733


今天完成的事情:复习了一下 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



返回列表 返回列表
评论

    分享到