说明:编译环境Eclipse(java)+MySql
使用JDBC查询数据库最不方便的一个地方在于,JDBC的executeQuey方法得到的是结果是一个结果集(ResultSet),实际应用时,需要用遍历的方法把一个个对象从ResultSet中取出来
<pre name="code" class="html">//rs为ResultSet对象
rs = stmt.executeQuery();
//将Result转换成List<Object[]>
int colCount = rs.getMetaData().getColumnCount();//得到查出的列的数量
while(rs.next()){
Object[] oArr = new Object[colCount];//对应数据表中的一行,然后每一列都对应数组中的一个元素
for (int i = 0; i < oArr.length; i++) {
<span style="white-space:pre"> </span>oArr[i] = rs.getObject(i+1);
}
<span style="white-space:pre"> </span>list.add(oArr);//把取得的对象放入list中
}
对于自定义的类,还要进行类型转换,这时,可利用RowMapper接口
public class UserRowMapper implements RowMapper<User> {
@Override
public Caller getEntity(ResultSet rs) throws SQLException {
User user=new User()
user.setId(rs.getInt("C_ID"));
user.setCno(rs.getString("C_NO"));
user.setCname(rs.getString("C_NAME"));
user.setPassword(rs.getString("C_PASSWORD"));
return user;
}
}
while(rs.next()){
User user= rm.getEntity(User);//RowMapper<User>rm=new UserRowMapper();
<span style="white-space: pre;"> </span>list.add(user);//把取得的对象放入list中
}
但是,每个类都需要一个与之对应的rowMapper,自定义的类比较多时也是很累的……
DBUtils就可以解决这个问题,只需要定义
ResultSetHandler<List<Person>> h = new BeanListHandler<Person>(Person.class);
执行的时候传进去就可以了,方便很多!!
List<Person> persons = run.query("SELECT * FROM Person", h);
但是,使用过程中却发现一个问题。
使用DBUtils时,类中的属性名和数据库中的表中的字段名必须一致,否则查询出来的数据和类中属性无法对应!!