日期:2014-05-16 浏览次数:20495 次
预备知识:抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
?适用性:1.一个系统要独立于它的产品的创建、组合和表示时。
?
2.一个系统要由多个产品系列中的一个来配置时。
?
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
?
?4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
?DAO: Data Access Object.
:a Data Access Object provides the operations to create, delete, update, and find data in a database. (提供了对数据库增删改查的操作的方法. DTO: Data Transfer Objects(数据操作转换的对象,就是操作对象的一个类型的实例) -- ===================================================================================
?
1.连接工厂(Connection Factory):获得数据库的连接
?
2.DAO Factory: 获得不同的DAO
?
3.构建一个抽象工厂(Abstract Factory): 需要进行数据库的判断,根据不同的数据库提供不同的Factory 比如:OracleDaoFactory, SqlDaoFactory 以上的Factory均继承Factory.
?
?4.构建DAO步骤:
(1)需要一个DAO接口,接口;里面定义增删改查方法.
(2)用具体的实现类,实现接口中的方法,对于不同的数据库.创建不同的实现操作类.
?
5.调用步骤: (1)根据不同的数据库,从Connection Factory中获取连接.
(2)从DAO Factory中获得不同的DAO 工厂模式的优化: 将连接工厂封装到数据库工厂里面,对于具体的数据库进行具体的连接操作. 即:指定了数据库,那么我就可以进行指定的数据库连接操作了. -- ====================================================================================
具体实现如下: (仅实现了SQL Server2005 的连接,实现的一个添加的操作.其他的可以按照这个具体实现) 首先,定义一个DTO,我这里定义一个Student类: 属性为:学生姓名,密码和学号.代码如下:
?
public class Student {
?//学生姓名
?? ?private String stuName;
?//密码
??? private String stuPwd;
?//学生学号
?? private int stuId;
? //get和set方法
?
??public String getStuName()
??? {
??????? return stuName;
?? ?}
?
?public void setStuName(String stuName)
{
??? this.stuName = stuName;
? }
?
?public String getStuPwd() {
???? return stuPwd;
?? ?}
?
public void setStuPwd(String stuPwd)??? {
?? this.stuPwd = stuPwd;
?}
?
public int getStuId() {
?????? return stuId;
}
?
public void setStuId(int stuId) {
????? ?this.stuId = stuId;
}
?}
/*------------------------------------------*/
现在,我们建立一个DAO的接口,定义对数据库student的增删改查操作具体的实现由确定数据库后进行操作.具体代码如下:
?
public interface IStuOperDao {
?? /** * 添加学生 * @param stu 学生对象 */
?
public int addStu(Student stu);
?
?/** * 按照学号删除学生信息 * @param stuId 学生学号 */
?
?public int delStu(int stuId);
?
/** * 根据学生学号来获取学生信息 * @param stuId 学生学号 */
?
?public Student getStu(int stuId);
?
/** * 根据学号 修改学生信息 * @param stuId 学生学号 * @return 影响行数 */
?
?public int updateStu(int stuId); }
?
?/*--------------------------------*/
?
在这个接口的实现类中,对每个数据库我们都应该定义一个实现类,因为每种数据库的操作是不同的这也是我们在这里定义接口的好处,可以很方便地添加新的数据库实现. 这里具体实现的为SQL Server 2005的实现类.具体代码如下:
?
?public class SqlStuOperDAOImp implements IStuOperDao {
?
private Connection conn;
?
/** * 利用构造函数对conn进行初始化 * * @param conn */
?
?public SqlStuOperDAOImp(Connection conn) {
?
?????????? this.conn = conn;
??}
?
@Override
?
?public int addStu(Student stu) {
???????
???? ??Statement stmt = null;
?
???? //执行的SQL语句
?
?? ?String sql = "insert into student values('" + stu.getStuName() + "','" + stu.getStuPwd() + "')";
?
?? ?int num = 0;
?
??? try {
?
? ?//获取连接的Statement对象
?
stmt = conn.createStatement();
?
?//执行SQL语句,返回影响的行数
?
num = stmt.executeUpdate(sql);
?} catch (SQLException e) {
e.printStackTrace(); }
?
finally{ //关闭资源.
?try { if (stmt != null) { stmt.close(); }
if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return num; }
?
@Override
?
public int delStu(int stuId) {
?// TODO Aut