设计模式与数据库的一些想法

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

 

 

 

 

你可能感兴趣的:(java,设计模式,sql,OO)