通过jdbc我们可以访问数据库实现对数据库的增删改查的操作,利用java的封装特写我们会发现 增加、修改、与删除可以用一个方法去实现,它们的不同之处在于sql语句不同另外接收的参数也不同,这些通过传入的参数就可以soeasy的解决掉了,今天来谈谈如何优化查询的代码,查询其实也可以向上提取出一个方法,但是查询的结果该如何处理呢,要知道每一种查询的操作的结果都不一样该怎么办呢?
本片的精髓,查询的结果都不相同不能笼统的自己处理,需要把查询的结果集返回给调用的方法去处理。
优化前的代码通过id去查与查询全部
@Override
public void findAll() {
Student student=null;
try {
conn=myConn.getConnection(); //这是一个工具类用于数据库的链接与关闭操作
String sql="select * from student;";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
student=new Student();
student.setName(rs.getString("name"));
student.setMath(rs.getInt("math"));
student.setEnglish(rs.getInt("english"));
System.out.println(student);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
myConn.close(rs, ps, conn);这是一个工具类用于数据库的链接与关闭操作
}
}
@Override
public void findById(int id) {
try {
conn=myConn.getConnection();
String sql="select * from student where id=?;";
ps=conn.prepareStatement(sql);
ps.setInt(1, id);
rs=ps.executeQuery();
if(rs.next()){
Student student=new Student();
student.setName(rs.getString("name"));
student.setMath(rs.getInt("math"));
student.setEnglish(rs.getInt("english"));
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
myConn.close(rs, ps, conn);
}
}
可以看出二者有很多的相似之处我们需要把相同的部分抽取出来如何实现
1 根据查询的结果是一个结果集ResltSet所以需要定义一个接口 添加一个方法 这个方法用于调用者自行处理
public interface ResultSetHandler {
public Object doHandler(ResultSet rs) throws SQLException;
}
2创建模板类
public class JdbcTem{
public Object query(String sql,ResultSetHandler handler,Object...args){
try {
conn=MyConnection.getConnection();//对数据库的链接操作
ps=conn.prepareStatement(sql);
if(args!=null){
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
}
rs=ps.executeQuery();
return handler.doHandler(rs);
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
MyConnection.close(rs, ps, conn);//对数据库的关闭操作
}
}
}
上面的操作返回了一个handler的方法连同插叙的结果集一同返回给了调用者所以调用者必须要去实现具体可以用匿名内部类
操作一通过Id去查
@Override
public void findById(final int id) {
String sql="select * from student where id=?";
Person p= (Person) jdbcTem.query(sql, new ResultSetHandler(){
@Override
public Object doHandler(ResultSet rs) throws SQLException {
Person p=null;
if(rs.next()){
p=new Person();
p.setEnglish(rs.getInt("english"));
p.setMath(rs.getInt("math"));
p.setName(rs.getString("name"));
}
return p;
}
},id);
System.out.println(p);
}
查询全部
@Override
public void findAll() {
String sql="select * from student;";
@SuppressWarnings("unchecked")
List<Person>list=(List<Person>) jdbcTem.query(sql, new ResultSetHandler() {
@Override
public Object doHandler(ResultSet rs) throws SQLException {
List<Person>li=new ArrayList<Person>();
Person p=null;
while(rs.next()){
p=new Person();
p.setEnglish(rs.getInt("english"));
p.setMath(rs.getInt("math"));
p.setName(rs.getString("name"));
li.add(p);
}
return li;
}
});
for (Person person : list) {
System.out.println(person);
}
}
到目前为止我们已经是简化查询的操作,上面的代码一共有2句只是第二句比较长而已。其实在项目开发中我们都会去使用第三方的组件去实现查询的操作但我们需要理解这个道理。