您的位置:首页 > 数据库

调试动态SQL语句

2005-12-14 12:25 323 查看
在调试程序时我们经常需要打印出程序中的SQL语句到其他地方执行或者查看,这对于静态SQL语句(由Statement使用的SQL)直接调用System.out.println()就可以了,但要是动态SQL语句(由PreparedStatement使用的SQL)直接调用System.out.println()的话只会打印出那些带问号的SQL文,要想到别的地方执行还需要手动替换打印出SQL中的问号,要是字段少还好,很多字段的话就非常不方便了,而且手动替换十分容易出错。所以我便自己写了一段小程序来处理这种情况,在实际使用中十分方便。
为清楚起见,我将这项功能分为几个部分并分别放到不同的类中。在实际使用时应当根据实际情况调整这些方法的位置。
Parameter.java
public class Parameter {
public int type;
public Object value;

public Parameter(int type, Object value) {
this.type = type;
this.value = value;
}
}

Util.java
public class Util {
public static StringBuffer getPreparedSql(StringBuffer sql, Vector<Parameter> params) {
if(params == null) return sql;

StringBuffer returnSql = new StringBuffer(1024);
String[] subSql = sql.toString().split("//?", -1);

for(int i = 0; i < params.size(); i ++) {
Parameter param = params.get(i);

switch(param.type) {
case Types.CHAR:
case Types.VARCHAR:
returnSql.append(subSql[i]).append(" '").append(param.value).append("' ");
break;
case Types.INTEGER:
case Types.DOUBLE:
case Types.FLOAT:
case Types.NULL:
returnSql.append(subSql[i]).append(" ").append(param.value).append(" ");
break;
case Types.DATE:
returnSql.append(subSql[i]).append(" '").append(new SimpleDateFormat("yyyy-MM-dd").format(param.value)).append("' ");
break;
case Types.TIME:
returnSql.append(subSql[i]).append(" '").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(param.value)).append("' ");
break;
}
}

if(subSql.length > params.size()) {
returnSql.append(subSql[subSql.length - 1]);
}

return returnSql;
}
}

Test.java
public class Test {
void test() {
StringBuffer sql = new StringBuffer(1024);
sql.append(" INSERT INTO t_test ( f1, f2, f3, f4, f5, f6, f7, f8 )");
sql.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ? ) ");

Parameter param = null;
Vector<Parameter> params = new Vector<Parameter>();
param = new Parameter(Types.INTEGER, 1);
params.add(param);
param = new Parameter(Types.DOUBLE, 2.0D);
params.add(param);
param = new Parameter(Types.FLOAT, 3.0F);
params.add(param);
param = new Parameter(Types.CHAR, 'x');
params.add(param);
param = new Parameter(Types.VARCHAR, "DEF");
params.add(param);
param = new Parameter(Types.DATE, new Date());
params.add(param);
param = new Parameter(Types.TIME, new Date());
params.add(param);
param = new Parameter(Types.NULL, null);
params.add(param);

System.out.println(Util.getPreparedSql(sql, params));
}
}

调用new Test().test()后输出结果:
INSERT INTO t_test ( f1, f2, f3, f4, f5, f6, f7, f8 ) VALUES ( 1 , 2.0 , 3.0 , 'x' , 'DEF' , '2005-12-14' , '2005-12-14 11:04:38' , null )
在处理Types.DATE和Types.TIME类型时所使用的日期时间格式在本文中是以MySQL中格式为准的,并不能保证在其他实现中输出的SQL文也能正确执行。
其中那个getPreparedSql内容并没有写全(理论上要处理所有java.sql.Types中的所有type情况),要根据需要实际添加,只要和在test中调用的一致就可以了。不过目前这些在基本的应用中已经可以了。
另外对于那个getPreparedSql的入口参数并没有完全检测其合法性,如果仅为调试使用,在调用时注意就可以了。
[最后编辑于2005年12月14日 voozoo]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql insert null class object date