调试动态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]
为清楚起见,我将这项功能分为几个部分并分别放到不同的类中。在实际使用时应当根据实际情况调整这些方法的位置。
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]
相关文章推荐
- Mybaits--使用log4j调试动态SQL语句
- 在PL/SQL中使用SQL,动态SQL语句
- c++ builder adoquery sql语句的动态增加
- SQL动态语句查询
- 经典的SQL语句,列是可变的动态行列转换,运用了循环的思想
- 关于mybatis动态SQL语句的写法
- 动态SQL语句语法
- 动态sql语句基本语法
- adoquery查询语句sql动态查询删除方法
- 动态sql语句基本语法
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 1(理解动态SQL语句)
- 动态SQL(nds语句)中的execute immediate语句
- 处理动态SQL语句的参数
- 使用@@,select case及Exec动态执行SQL语句
- ssm的mybatis的动态SQL语句
- MyBatis动态SQL语句
- MyBatis之动态SQL语句
- 行列转换-->动态SQL语句例子
- 动态sql语句游标的写法
- IBatis.net动态SQL语句