代码如下:
/** * 动态生成SQ及SQL参数L
* @param ve 接收到的消息的CHGLIST
* @param paramList MQ消息中的SQL参数
* @param t 泛型对象
* @param table 数据表
* @param list 可执行SQL语句集合
* @return */public String updateSqlAndParamList(Vector ve,List paramList,T t,String table,List list){
String strSql="";//MQ消息SQlString upSql="";//可执行SQLtry {//组装SQL语句strSql = "update "+table+" set ";
upSql="update "+table+" set ";for(int i = 0; i < ve.size(); i++){
String str = "";
String upStr="";
String key = ve.get(i);
String fileName="get"+key.toUpperCase();
String value=(String)t.getClass().getMethod(fileName).invoke(t);
paramList.add(i,value);if(i == ve.size()-1){
str = key+" = ?";
upStr=key+"='"+value+"'";
}else{
str = key+" = ? ,";
upStr=key+"='"+value+"',";
}
strSql+=str;
upSql += upStr;
}
strSql +=" where Id = ? ";
upSql+=" where id='"+(String) t.getClass().getMethod("getID").invoke(t)+"'";
list.add(upSql);
paramList.add(ve.size(),(String) t.getClass().getMethod("getID").invoke(t));
} catch (Exception e) {
logger.info("组装UPDATE SQL失败!失败详情---"+e);
}return strSql;
}
1.使用动态语句
很多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句、MSSQL的EXEC和SP_EXECUTESQL、Mysql的预处理语句等。这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这种方式只适用于相对简单地动态查询,复杂的情况经常会采用下面的方式。
2、使用存储过程
对于复杂的情况,一般会在存储过程中来拼接动态SQL。使用存储过程完成相对灵活,但编码复杂度过高,有时运行效率较低。
3、使用其他(如JAVA)程序
使用外部的其他高级语言(如JAVA)拼接后再交由数据库执行也是一种选择,其灵活性较高,但由于JAVA缺乏对集合计算的支持,完成这些准备工作并不轻松。
如果需要执行动态SQL的主控程序是JAVA的,那么可以使用集算器来协助完成动态SQL类计算,集算器是动态解释执行的脚本,可以方便地拼出动态SQL执行。集算器提供了JDBC接口,可以置于Java应用程序与数据库之间,让应用程序继续象访问数据库一样执行集算器脚本,应用结构几乎不用改变。
下面通过例子来说明如何使用集算器完成动态SQL类计算,并集成进JAVA程序。