在上文《JDBC进阶——通过Java类实现数据库的增删改》中,我们实现用JAVA类来对数据库进行增删改的功能,接下来我们将实现查询功能。下面我们继续以dog表为例进行操作。
一、基础操作类的修改
1.增加泛型
当我们进行增删改的操作时,我们不需要对返回的结果进行处理。但是,当我们进行查询时,要对数据库返回的结果进行处理。我们不知道查询结果返回的类型是dog类还是master类,所以我们要运用到泛型来处理结果。
对BaseDao类进行修改,在类后导入泛型,其余不变。
public class BaseBao2<T> {...}
2.定义接口接收处理数据
数据返回时,可能有多条数据,每条数据也有不同的处理方法,所以我们创建一个接口来接收数据、定义处理数据的方法。
public interface RowMapper <T>{
T mapper(ResultSet resultSet);
}
3.获取一条数据的方法
这里和上文的BaseDao类似,但是只返回一组ResultSet对象。
public T getObjectByParams(RowMapper<T> row, String sql, Object...params){
Connection connection = this.getConnection();
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
if (null!=params){
for (int i = 0;i<params.length;i++){
preparedStatement.setObject(i+1,params[i]);
}
}
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
return row.mapper(resultSet);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
二、操作类的修改
编辑好基础类过后,我们同样要对操作类进行修改。
1.继承修改后的BaseDao类
这里只需要继承带泛型的基础类即可,接口不需要改动
public class DogDaoImp2 extends BaseBao2<Dog> implements DogDao {...}
2.定义处理数据的方法
继承BaseDao类后,我们就可以定义处理数据的方法。
RowMapper<Dog> row = new RowMapper<Dog>() {
@Override
public Dog mapper(ResultSet resultSet) {
Dog dog = new Dog();
try {
dog.setId(resultSet.getInt("id"));
dog.setName(resultSet.getString("name"));
dog.setHealth(resultSet.getInt("health"));
dog.setLove(resultSet.getInt("love"));
dog.setStrain(resultSet.getString("strain"));
dog.setLytm(resultSet.getDate("lytm"));
} catch (SQLException e) {
e.printStackTrace();
}
return dog;
}
};
3.输入SQL语句进行操作
这里和之前类似,只是参数不同罢了。
@Override
public Dog getDogById(Integer id) {
String sqlStr = "select id,name,health,love,strain,lytm," +
"from dog " +
"where id=?";
Dog dog = super.getObjectByParams(row, sqlStr, id);
return dog;
}
三、在测试类中调用
@Test
public void testGetDogById2(){
DogDao dogDao = new DogBaoImpl();
Dog dog = dogDao.getDogById(4);
System.out.println(dog);
}