数据库常用操作也就增删改查,其中查有返回结果,而增删改不返回结果。一般用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());
}
}
}

被折叠的 条评论
为什么被折叠?



