简析J2EE应用程序数据库类设计模式 (转)[@more@]本文主要介绍一种
数据库相关类的设计
模式。并介绍在
J2EE
框架中的具体实现,以及在事务处理方面的一些考虑。
一、设计模式简介
在开发J2EE应用 程序时,通常是要找出应用程序中涉及到的各种信息,比如一个公司的产品目录,或一个网站的 用户信息,我们会将这些信息放在数据库里。
在通常的设计中,我们要分析这些数据的属性和关系,然后进行数据库的逻辑设计,把各种信息用不同的表来 存储。比如,要开发一个图书信息查询 系统。可以创建下面两个表来分别表示书和出版社。
table Book (ID, Name, ISBN, Author, PublisherID, Price, Volume)
table Publisher (ID, Name, Telephone, Address, Postcode)
表Book包含了ID,书名,书号,作者,出版社ID,价格,页数。表Publisher包含ID,社名,电话,地址,邮编。这两个表通过出版社ID相关。
下面我们来介绍一种数据库相关类的设计的模式。
数据库相关类可以分成实体类(Entity Class)和会话类(Session Class)。
实体类对应于一个表的记录的封装,也就是该类的一个实例对应于表中的一个记录。而且,该类中的属性和记录中的字段是一一对应的。
会话类对应于对一个表中的所有记录的操作。比如增加一条记录,删除一条记录,查找记录和 更新一条记录。
通过使用这种设计模式,使程序更加模块化,便于开发和维护。当然,也可以使用其他设计模式。
二、程序实现
在具体实现上面的这种模式时,往往根据具体的应用程序来选用不同的技术来实现。看到上面的描述模式后,我们很容易就发现,可以用 EJB来实现(EJB分两种,实体EJB和会话EJB)。
我们知道,EJB提出来的目的是用于提供一种分布式 组件系统的开发。如果我们的应用程序是一个分布式的应用系统,那么毫无疑问,使用EJB来实现能大大减轻 编程的工作量。同时,通过使用EJB容器的一些高级特性,可以使应用程序更加可靠,扩展性也大大加强。这样一来,开发人员就不必关心一些底层技术,比如事务处理, 安全等各个方面,而是把重点放在怎样实现业务逻辑上。但是我们应该注意,如果开发的应用不是分布式的情况下,那么采用EJB有可能大大降低系统的 性能。因为,EJB 调用的开销很大。
本文将探讨在不利用EJB技术的情况下如何来实现上面介绍的这个模式。
下面以开发图书信息查询系统为例。
1.实体类
如前面讲到的,实体类的每个实例与表中一个记录对应。这样,实体类的属性应该和表的每个字段一一对应。必须注意的是,实体类的实例是每个记录在 内存中的对应,因此,在程序中对实例的操作并不马上反应到数据库的记录中。
在该类中,只是对数据的包装,因此,该类仅需要一些基本的方法,即setXX()和getXX()方法。
下面是一个实体类,是对Book表的封装。
class Book{
protected int ID;
protected String Name;
protected String ISBN;
protected String Author;
protected int PublisherID;
protected double Price;
protected int Volume;
public void setID(int iID);
public int getID();
public void setName(String sName);
public String getName();
public void setISBN(String sISBN);
public String getISBN();
public void setAuthor(String sAuthor);
public String getAuthor();
public void setPublisherID(int iID);
public int getPublisherID();
public void setPrice(double dPrice);
public double getPrice();
public void setVolume(int iVolume);
public int getVolume();
public Book(int iID, String sName, String sISBN, int iPublisherID, double dPrice, int iVolume);
};
同样地可以对表Publisher进行封装。
2.会话类
会话类主要是对一个表进行处理。这些操作可以是在表中创建一条记录,删除一条记录,更新一条记录和查找一条记录。这些操作的结果是将表中的记录和内存中的实体类的实例对应起来,或将实例与表中的记录对应起来。
我们可以看一下对Book表的封装。
class BookTable{
void Add(Book book);
void Delete(Book book);
void Update(Book book);
Collection fin dbyID(int iID);
Collection findbyXXXX(XX,XX);
Collection findbyPulisherName(String sPublisherName);
};
上面的类的申明中,Add()用于将内存中的一个Book实例映射到数据库中。Delete()用于删除数据库中的某一个记录。Update()用于更新表中的一个记录。而findbyXXXX()则对应于 select语句。
对于涉及到多个表操作时,可以有两种方式。一种是象BookTable一样,专门封装一个类。另一个方法是,直接在BoolTable中写一个findbyPublisherName()。这个方法设计成返回一个Book的集合。
上面只是简单的介绍了怎样实现实体类和会话类。在具体的应用中,还要考虑到数据库操作的一致性。下面就介绍一下事务处理的相关内容。
三、事务处理
为了确保对数据操作的完整和一致,在 程序设计时要充分考虑到事务处理方面的问题。
1. JDBC中怎样将多个 sql语句组合成一个事务。
在JDBC中,打开一个连接 对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次 执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。
在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。
下面的代码是一个示范:
con.setAutoCommit(false);
PreparedStatement updateSales=con.prepareStatement("UPDATE COFFES SET SALES=? WHERE COF_NAME LIKE ?");
updateSales.setInt(1,50);
updateSales.setString(2,"Colombian");
updateSales.executeUpdate();
PreparedStatement updateTotal=con.prepareStatement("UPDATE COFFEES SET TOTAL =TOTAL+ ? WHERE COD_NAME LIKE ?");
updateTotal.setInt(1,50);
updateTotal.setString(2,"Colombian");
updateTotal.executeUpdate();
con.commit(0;
con.setAutoCommit(true);
2.J2EE中分布式事务处理
在J2EE中,程序里可以使用JTA来调用底层的JTS( Java Transaction Service 提供者服务)来处理分布式的事务处理。另外,如果使用EJB,可以通过在描述 文件中指定transaction的属性来实现。
有关分布式事务处理的具体内容,请参见J2EE规范。
一、设计模式简介
在开发J2EE应用 程序时,通常是要找出应用程序中涉及到的各种信息,比如一个公司的产品目录,或一个网站的 用户信息,我们会将这些信息放在数据库里。
在通常的设计中,我们要分析这些数据的属性和关系,然后进行数据库的逻辑设计,把各种信息用不同的表来 存储。比如,要开发一个图书信息查询 系统。可以创建下面两个表来分别表示书和出版社。
table Book (ID, Name, ISBN, Author, PublisherID, Price, Volume)
table Publisher (ID, Name, Telephone, Address, Postcode)
表Book包含了ID,书名,书号,作者,出版社ID,价格,页数。表Publisher包含ID,社名,电话,地址,邮编。这两个表通过出版社ID相关。
下面我们来介绍一种数据库相关类的设计的模式。
数据库相关类可以分成实体类(Entity Class)和会话类(Session Class)。
实体类对应于一个表的记录的封装,也就是该类的一个实例对应于表中的一个记录。而且,该类中的属性和记录中的字段是一一对应的。
会话类对应于对一个表中的所有记录的操作。比如增加一条记录,删除一条记录,查找记录和 更新一条记录。
通过使用这种设计模式,使程序更加模块化,便于开发和维护。当然,也可以使用其他设计模式。
二、程序实现
在具体实现上面的这种模式时,往往根据具体的应用程序来选用不同的技术来实现。看到上面的描述模式后,我们很容易就发现,可以用 EJB来实现(EJB分两种,实体EJB和会话EJB)。
我们知道,EJB提出来的目的是用于提供一种分布式 组件系统的开发。如果我们的应用程序是一个分布式的应用系统,那么毫无疑问,使用EJB来实现能大大减轻 编程的工作量。同时,通过使用EJB容器的一些高级特性,可以使应用程序更加可靠,扩展性也大大加强。这样一来,开发人员就不必关心一些底层技术,比如事务处理, 安全等各个方面,而是把重点放在怎样实现业务逻辑上。但是我们应该注意,如果开发的应用不是分布式的情况下,那么采用EJB有可能大大降低系统的 性能。因为,EJB 调用的开销很大。
本文将探讨在不利用EJB技术的情况下如何来实现上面介绍的这个模式。
下面以开发图书信息查询系统为例。
1.实体类
如前面讲到的,实体类的每个实例与表中一个记录对应。这样,实体类的属性应该和表的每个字段一一对应。必须注意的是,实体类的实例是每个记录在 内存中的对应,因此,在程序中对实例的操作并不马上反应到数据库的记录中。
在该类中,只是对数据的包装,因此,该类仅需要一些基本的方法,即setXX()和getXX()方法。
下面是一个实体类,是对Book表的封装。
class Book{
protected int ID;
protected String Name;
protected String ISBN;
protected String Author;
protected int PublisherID;
protected double Price;
protected int Volume;
public void setID(int iID);
public int getID();
public void setName(String sName);
public String getName();
public void setISBN(String sISBN);
public String getISBN();
public void setAuthor(String sAuthor);
public String getAuthor();
public void setPublisherID(int iID);
public int getPublisherID();
public void setPrice(double dPrice);
public double getPrice();
public void setVolume(int iVolume);
public int getVolume();
public Book(int iID, String sName, String sISBN, int iPublisherID, double dPrice, int iVolume);
};
同样地可以对表Publisher进行封装。
2.会话类
会话类主要是对一个表进行处理。这些操作可以是在表中创建一条记录,删除一条记录,更新一条记录和查找一条记录。这些操作的结果是将表中的记录和内存中的实体类的实例对应起来,或将实例与表中的记录对应起来。
我们可以看一下对Book表的封装。
class BookTable{
void Add(Book book);
void Delete(Book book);
void Update(Book book);
Collection fin dbyID(int iID);
Collection findbyXXXX(XX,XX);
Collection findbyPulisherName(String sPublisherName);
};
上面的类的申明中,Add()用于将内存中的一个Book实例映射到数据库中。Delete()用于删除数据库中的某一个记录。Update()用于更新表中的一个记录。而findbyXXXX()则对应于 select语句。
对于涉及到多个表操作时,可以有两种方式。一种是象BookTable一样,专门封装一个类。另一个方法是,直接在BoolTable中写一个findbyPublisherName()。这个方法设计成返回一个Book的集合。
上面只是简单的介绍了怎样实现实体类和会话类。在具体的应用中,还要考虑到数据库操作的一致性。下面就介绍一下事务处理的相关内容。
三、事务处理
为了确保对数据操作的完整和一致,在 程序设计时要充分考虑到事务处理方面的问题。
1. JDBC中怎样将多个 sql语句组合成一个事务。
在JDBC中,打开一个连接 对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次 执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。
在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。
下面的代码是一个示范:
con.setAutoCommit(false);
PreparedStatement updateSales=con.prepareStatement("UPDATE COFFES SET SALES=? WHERE COF_NAME LIKE ?");
updateSales.setInt(1,50);
updateSales.setString(2,"Colombian");
updateSales.executeUpdate();
PreparedStatement updateTotal=con.prepareStatement("UPDATE COFFEES SET TOTAL =TOTAL+ ? WHERE COD_NAME LIKE ?");
updateTotal.setInt(1,50);
updateTotal.setString(2,"Colombian");
updateTotal.executeUpdate();
con.commit(0;
con.setAutoCommit(true);
2.J2EE中分布式事务处理
在J2EE中,程序里可以使用JTA来调用底层的JTS( Java Transaction Service 提供者服务)来处理分布式的事务处理。另外,如果使用EJB,可以通过在描述 文件中指定transaction的属性来实现。
有关分布式事务处理的具体内容,请参见J2EE规范。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-990577/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10752043/viewspace-990577/