1. 程式人生 > >Spring中使用MappingSQLQuery封裝JDBC結果集例項

Spring中使用MappingSQLQuery封裝JDBC結果集例項

使用Spring提供的MappingSqlQuery的方法,可以很好的封裝JDBC返回的結果集,建立相應的domain物件,MappingSqlQuery的子類必須要實現mapRow方法,mapRow方法從底層的ResultSet中獲取資料,返回對應的domain物件

 資料庫指令碼(MySQL)

CREATETABLE `test` (
  `testid` 
varchar(10defaultNULL,
  `testname` 
varchar(10defaultNULL
) ENGINE
=InnoDB DEFAULT CHARSET=gb2312;

表中資料為:
1  name1
2  name2
3  name3
4  name4
5  name5

DAO介面:

package ch8.MappingSqlQuery;

import java.util.List;

publicinterface ITestDAO {
  
public List getUserByName(String name);
}

Domain物件

package ch8.MappingSqlQuery;

publicclass User {
  
private String name;
  
private String id;
public User(String name, String id) 
{

    
this.name = name;
    
this.id = id;
}

public String getId() {
    
return id;
}

publicvoid setId(String id) {
    
this.id = id;
}

public String getName() {
    
return name;
}

publicvoid setName(String name) {
    
this.name = name;
}


public String toString() {
    
    
returnthis.id+"--"+this.name;
}


}

MappingSqlQuery抽象子類及實現類

這裡之所以進行了2層設計,主要是考慮到每一個查詢sql的引數不一定相同,所以把sql引數的配置放到了單獨的子類中,如SelectByName

package ch8.MappingSqlQuery;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.object.MappingSqlQuery;

publicabstractclass AbstractSelect extends MappingSqlQuery {

    
public AbstractSelect(DataSource dataSource,String sql){
        
super(dataSource,sql);
    }

    
protected Object mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user
=new User(rs.getString("testid"),rs.getString("testname"));

        
return user;
    }


}



package ch8.MappingSqlQuery;

import java.sql.Types;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameter;

publicclass SelectByName extends AbstractSelect {
   

public SelectByName(DataSource dataSource,String sql){
    
super(dataSource,sql);
    
this.declareParameter(new SqlParameter(Types.VARCHAR)); //sql中注入一個引數
}


}

DAO實現類

package ch8.MappingSqlQuery;

import java.util.List;

import org.springframework.jdbc.core.support.JdbcDaoSupport;




publicclass TestDAOImpl extends JdbcDaoSupport implements ITestDAO {
    
    
private SelectByName selectByName;
    
privatefinal String sql="select * from test where testname=?"//查詢SQL

    
public SelectByName getSelectByName() {
        
return selectByName;
    }

    
publicvoid setSelectByName(SelectByName selectByName) {
        
this.selectByName = selectByName;
    }

    
public List getUserByName(String name) {
        selectByName
=new SelectByName(getDataSource(),sql); //構造SelectByName物件,以便使用MappingSqlQuery封裝Resultset
        
//return selectByName.execute(name);
return selectByName.execute(new Object[]{name});
    }

 
    

}

測試程式碼:

package ch8.MappingSqlQuery;

import java.util.Iterator;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

publicclass Test {

    
/**
     * 
@param args
     
*/

    
publicstaticvoid main(String[] args) {
        ApplicationContext context
=new ClassPathXmlApplicationContext("ch8/MappingSqlQuery/applicationContext.xml");
        TestDAOImpl testDAOImpl
=(TestDAOImpl)context.getBean("testDAO");
        List result
=testDAOImpl.getUserByName("name1");
        
        
for (Iterator iter = result.iterator(); iter.hasNext();) {
            User element 
= (User) iter.next();
            System.out.println(element);            
        }
    
     }


}

結果:

name1--1

可以看到,我們並沒有自己去處理ResultSet,同樣也獲得了user物件