JDBC查询动态封装

JDBC查询动态封装
JDBC针对条件个数不定的查询,一般的做法是直接拼装查询字符串,但是这样做无法抵御注入攻击,还是要封装才安全,但是封装对条件个数、类型不定,是很有困难的,最近终于找到了解决办法:
public   class  queryDAOImpl  implements  queryDAO {
    
/**
     * 动态拼装查询
     * 
@param  mq 封装查询条件的类
     * 
@return
     * 
@throws  java.sql.SQLException
     
*/
    
public  List < Map >  queryAll(MnewsQ mq)  throws  SQLException {
        List
< Map >  v  =   new  Vector < Map > ();
        Connection con 
=   null ;
        PreparedStatement pstmt 
=   null ;
        ResultSet rs 
=   null ;
        Vector t 
=   new  Vector();    // 储存查询条件
        Vector < String >  t2  =   new  Vector < String > ();    // 储存查询条件类型
        String sql  =   " SELECT * FROM mnews WHERE mnews.sc=0 " ;
        
// 如果提交了查询条件gj (int型)
         if  (mq.getGj()  >   0 ) {
            sql 
=  sql  +   "  AND gj=? " ;
            t.add(mq.getGj());
            t2.add(
" int " );
        }
        
// 如果提交了查询条件gjz4 (String型)
         if  (mq.getGjz4()  !=   null   &&  mq.getGjz4().length()  >   0 ) {
            sql 
=  sql  +   "  AND gjz4=? " ;
            t.add(mq.getGjz4());
            t2.add(
" String " );
        }
        
try  {
            con 
=  ConnectionMannagerJNDI.getCon();     // 取得数据库连接
            pstmt  =  con.prepareStatement(sql);
            
int  paramNum  =  t.size();     // 查询条件数量
             for  ( int  i = 0 ; i < paramNum; i ++ ) {
                
if  ( " int " .equals(t2.get(i).toString())) {
                    pstmt.setInt(i 
+   1   +   2 , Integer.parseInt(t.get(i).toString()));
                } 
else   if  ( " String " .equals(t2.get(i).toString())) {
                    pstmt.setString(i 
+   1   +   2 , t.get(i).toString());
                }
// Date、float等类型依此类推
            }
            rs 
=  pstmt.executeQuery();
            
// 以字段名为键,以字段值为值,将查询结果存入Map,再装进Vector
            ResultSetMetaData rsmd  =  rs.getMetaData();
            
int  columnNum  =  rsmd.getColumnCount();
            
while  (rs.next()) {
                Map map 
=   new  HashMap();
                
for  ( int  i = 1 ; i <= columnNum; i ++ ) {
                    map.put(rsmd.getColumnName(i),rs.getObject(i));
                }
                v.add(map);
            }
        } 
finally  {
            ConnectionMannagerJNDI.releaseConnection(rs, pstmt, 
null , con);
        }
        
return  v;
    }
}


你可能感兴趣的:(JDBC查询动态封装)