动态sql之我见(字段名动态生成)
来源:互联网 发布:程序员的算法趣题pdf 编辑:程序博客网 时间:2024/06/05 09:33
http://blog.sina.com.cn/s/blog_4c925dca0100ehr0.html
动态sql这个话题,应该说不是什么新鲜事情了!但是,在一些特殊场合,我们就会要用到动态sql,如果是第一次去用动态sql的话,估计不会那轻松。这里阿堂把自己在项目中用动态sql的过程,和朋友们分享一下!
我这里所说的动态sql,是指的select语句中后面跟的字段是不确定的,是要根据实际业务来拼成的select语句。并不是简单指select后面的where条件是动态变化的
我的实际业务情况如下
运输公司在web页面,根据相应条件查询后,得到的select语句后字段都不确定,如,有时候,可能是select a,b,c,有时候可能又会是selecte,f,g,h,i,j等,然后,还要将这些查询得到的记录下载到excel文件中,也就是说每次查询后,得到的记录列字段都有可能不一样,生成的excel文件中的字段也是不一样的(除了行数,不确定外,列名也是不确定的),所以程序中就不能写死了,就得要去判断了,阿堂这里用到ResultSetMetaData类,实际上ResultSetMetaData应该是用到了反射技术的。。也就是我们只要得到一个ResultSet对象如rs,我们就可以得到
ResultSetMetaData类的对象了,进而,可以得到记录的总行数,记录的总列数,记录的列名,列字段的字段类型等,这时候,我们就可以将每一行记录封装到一个List对象中,然后,将每一个List对象,再封装到一个总的List对象中,最后利用jxl包中的一些方法,写入到excel文件中就可以了,当然,其中还会涉及到很多的细节性方面的东西,这不是我这里需要讨论的细节了,所以,我就不对此展开了,如有疑问,可以给阿堂单独留言咨询讨论!
(这是一个原来的项目,就是用的jdbc来操作的。。如果是这种动态的sql,用hibernate,ibatis这些框架处理起来就绝非易事了)
处理记录ResultSet集的类
public class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID =-5361448825948488492L;
ResultSetrs;
ResultSetMetaData rsmd;
//以一个ResultSet结果集构造TableModel构造函数
publicMyTableModel(ResultSet rs)
{
this.rs=rs;
try{
rsmd=rs.getMetaData();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//重写getColumnCount方法,用于设置该TableModel的列数
public intgetColumnCount()
{
try {
return rsmd.getColumnCount();
}
catch (SQLException e)
{
e.printStackTrace();
return 0;
}
}
//重写getRowCount方法,用于设置该TableModel的行数
public intgetRowCount() {
try{
rs.last();
return rs.getRow();
}
catch(Exception e)
{
e.printStackTrace();
return 0;
}
}
//重写getValueAt方法,用于设置该TableModel指定单元格的值
publicObject getValueAt(int row, int column) {
try{
rs.absolute(row+1); //定位到column列
returnrs.getObject(column+1);