Spring中使用MappingSQLQuery封裝JDBC結果集例項
阿新 • • 發佈:2019-01-24
使用Spring提供的MappingSqlQuery的方法,可以很好的封裝JDBC返回的結果集,建立相應的domain物件,MappingSqlQuery的子類必須要實現mapRow方法,mapRow方法從底層的ResultSet中獲取資料,返回對應的domain物件
資料庫指令碼(MySQL)
CREATETABLE `test` (`testid` varchar(10) defaultNULL,
`testname` varchar(10) defaultNULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
表中資料為:
1 name1
2 name2
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物件