数据库常用操作也就增删改查,其中查有返回结果,而增删改不返回结果。一般用java访问数据库,需要经过以下几个步骤:获得Connection,executeXXX(),释放Connection。而对于executeQuery(),还要依次遍历ResultSet。遍历的代码基本都是相似的,但你又不得不在每一个方法里都重复写。虽然对于小型的项目,Ctrl+C、Ctrl+V也很方便,但这种形式的代码复用绝对不是OO思想所能容忍的。我们要善于运用OO的继承体制真正实现代码的复用。下面的代码中需要用到数据库连接池,其具体代码请参考我的上一篇博客。
DbBean.java
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public abstract class DbBean { private ConnectionPool pool; private Connection conn; private Statement stmt; public DbBean() { pool = ConnectionPool.getInstance(); conn = pool.getConnection(); try { stmt = conn.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } public Statement getStatement() { return stmt; } public abstract void executeSql(String sql); }
DbBean是一个抽象类,其中它的构造方法中实现了Statement对象的获取,executeSql方法没有实现,这是留给子类的任务。BdBean有两个子类:SelectBean和UpdateBean.这里用到了模版方法模式,把公共的方法放在父类中实现,像示例中的获得连接的方法,全部在分类的构造函数中实现。这样子类在实例化的时候,就自动继承了这些方法,但子类区别与其它子类的方法,父类就没有必要实现,所以是抽象方法,有每个子类各自实现。
SelectBean.java
import java.sql.ResultSet; import java.sql.SQLException; public class SelectBean extends DbBean { private ResultSet rs; public void executeSql(String sql) { try { rs = getStatement().executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } } public ResultSet getResultSet() { return rs; } }
UpdateBean.java
import java.sql.ResultSet; import java.sql.SQLException; public class UpdateBean extends DbBean{ public void executeSql(String sql) { try { getStatement().executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } return null; } }
ProductSelect继承于SelectBean,对应数据库中的一张表product。
import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class ProductSelect extends SelectBean{ private List<Product> product; public List<Product> getProductList() throws SQLException { ResultSet rs = getResultSet(); product = new ArrayList<Product>(); while(rs.next()) product.add(new Product(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4))); return product; } }
看一下测试类
import java.sql.SQLException; import java.util.List; class Test { public static void main(String[] args) throws SQLException { DbBean productSelect = new ProductSelect(); productSelect.executeSql("select * from product"); List<Product> productList = ((ProductSelect)productSelect).getProductList(); for(Product product:productList) { System.out.println(product.getId()); System.out.println(product.getName()); System.out.println(product.getPath()); System.out.println(product.getDescription()); } DbBean updateBean = new UpdateBean(); updateBean.executeSql("insert into product values('4','ddd','ddd','ddd')"); productSelect = new ProductSelect(); productSelect.executeSql("select * from product"); productList = ((ProductSelect)productSelect).getProductList(); for(Product product:productList) { System.out.println(product.getId()); System.out.println(product.getName()); System.out.println(product.getPath()); System.out.println(product.getDescription()); } } }