- 浏览: 238201 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (268)
- oracle (15)
- 设计模式 (4)
- java (16)
- 线程(Thread) (1)
- 常用 (4)
- PL/SQL (1)
- SWING (10)
- 架构 (4)
- 正则表达式 (5)
- Linux (16)
- PostgreSQL (1)
- FTP (1)
- mysql (4)
- TOMCAT (5)
- 素材 (2)
- Hibernate (3)
- 报表打印 (1)
- 高并发,大数据量处理 (6)
- UML (1)
- memcache (3)
- JMF (1)
- 通信 (2)
- window常见问题处理 (5)
- eclipse (7)
- 数据库 (2)
- java内存 (4)
- maven (4)
- Spring (12)
- JavaScript (22)
- nodejs (5)
- OSGI (1)
- 其他 (1)
- 企业开发平台 (1)
- web页面懒加载 (3)
- VMware (2)
- hadoop (2)
- hadoop.hadoop学习笔记 (1)
- web前端 (32)
- vim (6)
- CSS (21)
- web前端.widget (2)
- Activiti (1)
- BPMN (1)
- Cookie (1)
- nigix (1)
- SVN (1)
最新评论
-
woodding2008:
太棒了
用一段代码演示马云双十一晚会上玩的纸牌魔术 -
nihaonihao1987:
[b][/b]
特别响、非常近——BPMN2新规范与Activiti5 -
coosummer:
推荐使用http://buttoncssgenerator.c ...
CSS Button -
tw_wangzhengquan:
ahua186186 写道compile 'com.oracl ...
ext4,spring,hibernate构建企业开发平台 -
ahua186186:
compile 'com.oracle:ojdbc14:10. ...
ext4,spring,hibernate构建企业开发平台
DAO数据库操作类实现在配置文件中的工厂化管理
一、搭建 Hibernate 环境
二、创建数据库操作接口和实现类
<!--[if !supportLists]-->1、 <!--[endif]-->接口
基类接口(所有接口都继承该接口):
package fr.itris.glips.dbconn.module.dao;
import java.io.Serializable;
import java.util.*;
import fr.itris.glips.dbconn.util.HibernateUtil;
public interface DAO {
public void save(Object obj);
public void saveOrUpdate(Object obj);
public List<Object[]> listBySql(String sql);
public List listAll();
public List listAll(Class c);
public List list(String hql);
public List list( String hql, Object[] values);
public Class getEntiryClass();
public Object get( Serializable id);
public Object load( Serializable id);
public Object get(Class c, Serializable id);
public Object load(Class c,Serializable id);
}
实体类接口:
package fr.itris.glips.dbconn.module.dao;
public interface StationDAO extends DAO{
}
<!--[if !supportLists]-->2、 <!--[endif]-->实现类:
基类抽象实现类(所有实现类都继承该类):
package fr.itris.glips.dbconn.module.dao.impl;
import java.io.Serializable;
import java.util.List;
import fr.itris.glips.dbconn.module.dao.DAO;
import fr.itris.glips.dbconn.util.HibernateUtil;
public abstract class AbstractDAO implements DAO{
@Override
public void save(Object entity) {
// TODO Auto-generated method stub
HibernateUtil.save(entity);
}
@Override
public void saveOrUpdate(Object entity) {
// TODO Auto-generated method stub
HibernateUtil.saveOrUpdate(entity);
}
@Override
public List listBySql(String sql) {
// TODO Auto-generated method stub
return HibernateUtil.listBySql(sql);
}
@Override
public java.util.List listAll() {
// TODO Auto-generated method stub
return listAll(getEntiryClass());
}
public java.util.List listAll(Class c) {
// TODO Auto-generated method stub
return HibernateUtil.listAll(c);
}
@Override
public List list(String hql) {
// TODO Auto-generated method stub
return HibernateUtil.list(hql);
};
@Override
public List list(String hql, Object[] values) {
// TODO Auto-generated method stub
return HibernateUtil.list(hql,values);
}
public Object get( Serializable id){
return get(getEntiryClass(), id);
}
public Object load( Serializable id){
return load(getEntiryClass(), id);
}
public Object get(Class c, Serializable id){
return HibernateUtil.get(c, id);
}
public Object load(Class c,Serializable id){
return HibernateUtil.load(c, id);
}
abstract public Class getEntiryClass();
}
基类实现类:
package fr.itris.glips.dbconn.module.dao.impl;
import java.io.Serializable;
import java.util.List;
import fr.itris.glips.dbconn.module.dao.DAO;
import fr.itris.glips.dbconn.util.*;
public class BaseDAO extends AbstractDAO{
@Override
public Class getEntiryClass() {
// TODO Auto-generated method stub
return null;
}
}
实体类实现类:
package fr.itris.glips.dbconn.module.dao.impl;
import fr.itris.glips.dbconn.module.bean.SVGConfigure;
import fr.itris.glips.dbconn.module.bean.SVGElement;
import fr.itris.glips.dbconn.module.bean.Station;
import fr.itris.glips.dbconn.module.dao.SVGConfigureDAO;
import fr.itris.glips.dbconn.module.dao.SVGElementDAO;
import fr.itris.glips.dbconn.module.dao.StationDAO;
public class StationDAOImpl extends AbstractDAO implements StationDAO{
public Class getEntiryClass(){return Station.class;};
}
三、创建工厂管理 DAO 数据库操作类
1 创建 dao.xml , key 代表接口, value 代表实现类
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="DAO">
<entry key="fr.itris.glips.dbconn.module.dao.DAO" value="fr.itris.glips.dbconn.module.dao.impl.BaseDAO"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGElementDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGElementDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGConfigureDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGConfigureDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.StationDAO" value="fr.itris.glips.dbconn.module.dao.impl.StationDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGElementTypeDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGElementTypeDAOImpl"/>
</section>
</configuration>
<!--[if !supportLists]-->2、 <!--[endif]-->创建 ResourcesManager (管理资源文件的类)
package fr.itris.glips.dbconn.resources;
import fr.itris.glips.library.*;
import fr.itris.glips.svgeditor.*;
import org.apache.batik.dom.svg.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
import java.awt.*;
import java.util.prefs.*;
/**
* @author ITRIS, Jordi SUC
*
* The class managing the resources
*/
public class ResourcesManager {
/**
* the map associating the name of a xml document to this document
*/
private final static HashMap<String, Document> cachedXMLDocuments=
new HashMap<String, Document>();
/**
* create a document from tthe given file in the resource files
* @param name the name of the xml file
* @return the document
*/
public static Document getXMLDocument(String name){
Document doc=null;
if(name!=null && ! name.equals("")){
if(cachedXMLDocuments.containsKey(name)){
doc=cachedXMLDocuments.get(name);
}else{
DocumentBuilderFactory docBuildFactory=
DocumentBuilderFactory.newInstance();
String path="";
try{
//parses the XML file
DocumentBuilder docBuild=docBuildFactory.newDocumentBuilder();
path=getPath("xml/"+name);
doc=docBuild.parse(path);
}catch (Exception ex){ex.printStackTrace();}
if(doc!=null){
cachedXMLDocuments.put(name, doc);
}
}
}
return doc;
}
public static String getPath(String resource){
String path="";
//System.out.println("resource="+resource);
try{
path=ResourcesManager.class.getResource(resource).toExternalForm();
}catch (Exception ex){
ex.printStackTrace();
path="";
}
//System.out.println("path="+path);
return path;
}
}
<!--[if !supportLists]-->3、 <!--[endif]-->创建 DAOConfig 类(解析 dao.xml 文件的类)
package fr.itris.glips.dbconn.resources;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import fr.itris.glips.dbconn.util.*;
import fr.itris.glips.svgeditor.NodeIterator;
public class DAOConfig {
private static final String DAO_CONFIG_FILE="dao.xml";
private static final String DAO_CONFIG_SECTION="DAO";
public static synchronized HashMap load(){
Document doc=ResourcesManager.getXMLDocument(DAO_CONFIG_FILE);
Element root=doc.getDocumentElement();
HashMap<Class,Class> map=new HashMap<Class,Class> ();
if(root!=null){
Node current=null;
for(current=root.getFirstChild(); current!=null; current=current.getNextSibling()){
String attr_name;
if(current!=null && current instanceof Element){
//System.out.println(current.getNodeName());
if(current.getNodeName()!=null &¤t.getNodeName().equals("section")){
attr_name=((Element)current).getAttribute("name");
Node current2;
if(attr_name!=null && attr_name.equals(DAO_CONFIG_SECTION)){
for(NodeIterator it2=new NodeIterator(current); it2.hasNext();){
current2=it2.next();
if(current2!=null && current2 instanceof Element){
if(current2.getNodeName()!=null&¤t2.getNodeName().equals("entry")){
String daoIface=((Element)current2).getAttribute("key");
//System.out.println("daoIface=="+daoIface);
String daoImpl=((Element)current2).getAttribute("value");
try{
Class iface=ClassToolKit.loadClass(daoIface);
Class impl=ClassToolKit.loadClass(daoImpl);
map.put(iface, impl);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
}
}
}
}
}
}
return map;
}
public static void main(String[] args){
load();
}
}
<!--[if !supportLists]-->4、 <!--[endif]-->创建 DAO 工厂类
package fr.itris.glips.dbconn.factory;
import java.util.*;
import fr.itris.glips.dbconn.exception.DataAccessException;
import fr.itris.glips.dbconn.module.dao.*;
import fr.itris.glips.dbconn.module.dao.impl.BaseDAO;
import fr.itris.glips.dbconn.resources.DAOConfig;
public class DaoFactory {
private static HashMap<Class,Class> daoClassMap =null;
static Map<String,DAO> daoMap=new HashMap<String,DAO>();
static {
initial();
}
public static synchronized void initial(){
if(null==daoClassMap){
daoClassMap=DAOConfig.load();
}
System.out.println("daoMap.size="+daoClassMap.size());
}
/**
* 获取 DAO 数据库操作类
* @param daoInterface DAO 接口
* @return 实现类
*/
public static DAO getDAO(Class daoInterface){
DAO dao=daoMap.get(daoInterface.getName());
if(dao==null){
try {
Class daoCl=getDAOClass(daoInterface);
dao=(DAO) daoCl.newInstance();
daoMap.put(daoInterface.getName(), dao);
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
return dao;
}
public static Class getDAOClass(Class daoInterface) {
Class dao=daoClassMap.get(daoInterface);
if(null==dao){
System.out.println("No Implementation found of DAO interface=?"+daoInterface.getName());
}
return dao;
}
public static void main(String[] args){
System.out.println("getClass="+DaoFactory.getDAO( DAO.class));
String sql="select name,aliasname from svgconfigure";
DAO dao=new BaseDAO();
List list=dao.listBySql(sql);
for(Object arr:list){
//System.out.println(arr[0]+","+arr[1]);
}
}
}
四、辅助类
1 、工具类
HibernateUtil 类( Hibernate 数据库操作类用到得工具类)
package fr.itris.glips.dbconn.util;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.hibernate.*;
import org.hibernate.cfg.*;
import fr.itris.glips.dbconn.page.PageInfo;
public class HibernateUtil {
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private static SessionFactory sessionFactory=null;
static {
initial();
}
public static void initial(){
if(sessionFactory==null){
try{
sessionFactory=new Configuration().configure().buildSessionFactory();
/*Configuration cfg=new Configuration()
.addClass(events.Event.class)
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource","java:com/env/jdbc/sample")
.setProperty("hibernate.order_update","true");
sessionFactory=cfg.buildSessionFactory();*/
}catch(Throwable ex)
{
ex.printStackTrace();
}
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
//String f="sd/df";
return sessionFactory.openSession();
}
public static Session getCurrentSession(){
Session s=threadLocal.get();
if(s==null ){
s=sessionFactory.openSession();
threadLocal.set(s);
}
return s;
}
public static void closeCurrentSession(){
Session s=threadLocal.get();
if(s!=null){
s.close();
//s=null;
threadLocal.set(null);
}
}
//----------- 保存 --------
/**
* save 后数据进入一级缓存,不会进入二级缓存
* @param entity
*/
public static synchronized void save(Object entity){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.save(entity);
//tran.commit();
}
public static synchronized void saveOrUpdate(Object entity){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.saveOrUpdate (entity);
// tran.commit();
}
public void saveOrUpdateAll(final Collection entities){
Session session=getCurrentSession();
for (Iterator it = entities.iterator(); it.hasNext();) {
session.saveOrUpdate(it.next());
}
}
public void persist( final Object entity) {
Session session=getCurrentSession();
session.persist( entity);
}
public Object merge(final Object entity) {
Session session=getCurrentSession();
return session.merge( entity);
}
//---------------- 修改 --------
public void update(final Object entity ) {
Session session=getCurrentSession();
session.update(entity);
}
/**
*
* @param hql 也可用于删除,如: sql="delete TUser"
* @return
*/
public static int executeUpdate(String hql){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
Query query=session.createQuery(hql);
int n= query.executeUpdate();
//tran.commit();
return n;
}
public static void delete(Object obj){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.delete(obj);
//tran.commit();
}
/**
* @param sql 例如: sql="from TUser"
*/
public static void delete(String hql){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.delete(hql);
//tran.commit();
}
public void deleteAll(final Collection entities){
Session session=getCurrentSession();
for (Iterator it = entities.iterator(); it.hasNext();) {
session.delete(it.next());
}
}
public static void deleteById(Class cl,Serializable id){
Object obj=load(cl,id);
delete(obj);
}
public static int deleteAsScroll(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
ScrollableResults scRes=query.scroll();
int i=0;
//Transaction tran=session.beginTransaction();
while(scRes.next()){
session.delete(scRes.get(i++));
}
//tran.commit();
return i;
}
//------------- 查询
/**
* 内部缓存和二级缓存查找
* 可返回代理类实例
* @param cl
* @param serializable
* @return
*/
public static Object load(Class cl,Serializable serializable){
Session session=getCurrentSession();
return session.load(cl, serializable);
}
/**
* 内部缓存查找
* 返回实体类
* @param cl
* @param serializable
* @return
*/
public static Object get(Class cl,Serializable serializable){
Session session=getCurrentSession();
return session.get(cl, serializable);
}
/**
* 一次取出所有数据
* 如果 hibernate.cache.use_query_cache 为 FALSE (系统默认),则不会利用缓存
* 否则,如果满足( 1 、完全相同的 SQL 重复执行, 2 、两次查询期间,对应的表没有发生过改变),利用缓存, key 为 sql 语句
* @param sql
* @return
*/
public static List list(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
// 设置二级缓存
query.setCacheable(true);
return query.list();
}
/**
* Execute an HQL query, binding one value to a "?" parameter in the query string.
* @param queryString
* @param values
* @return
*/
public static List list(final String queryString, final Object[] values){
Session session=getCurrentSession();
Query queryObject = session.createQuery(queryString);
if (values != null) {
for (int i = 0; i < values.length; i++) {
queryObject.setParameter(i, values[i]);
}
}
return queryObject.list();
}
/**
* 一次取出一条数据
* *iterate 可充分利用缓存( key 为主键 Id ),但是如果缓存中查询不到,会出现 N+1 次查询 **
*
* * 首先执行一条 Select SQL 以获得所有符合条件的数据 id( 先在缓存中查找,如果查找不到就到数据库中查找 ) ,
* 随即, iterate 方法首先在本地缓存中根据 id 查找对应的实体对象是否存在(类似 Session.load() 方法),
* 如果缓存已经存在对应的数据,则直接以此数据对象作为查询结果,
* 如果没找到,再执行相应的 Select 语句获得对应的库表记录
* */
public static Iterator iterate(String sql){
Session session=getCurrentSession();
Query query=session.createQuery(sql);
// 设置二级缓存
query.setCacheable(true);
return query.iterate();
}
public static List listAll(Class c){
Session session=getCurrentSession();
Criteria criteria=session.createCriteria(c);
// 设置二级缓存
criteria.setCacheable(true);
return criteria.list();
}
/**
* 基于游标的数据遍历
* @param sql
* @return
*/
public static ScrollableResults scroll(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
return query.scroll();
}
/**
*
* @param sql
* @return
*/
public static List listBySql (String sql){
Session session=getCurrentSession();
SQLQuery query=session.createSQLQuery(sql );
// 设置二级缓存
//query.setCacheable(true);
return query.list();
}
public static PageInfo pageQuery(Class c,PageInfo page){
Session session=getCurrentSession();
Criteria criteria=session.createCriteria(c);
// 设置二级缓存
criteria.setCacheable(true);
// 总数
page.setTotalRows(criteria.list().size());
int startIndex=(page.getPageNo()-1)*page.getPageSize();
criteria.setFirstResult(startIndex);
criteria.setMaxResults(page.getPageSize());
page.setPageContent(criteria.list());
return page;
}
public static PageInfo pageQuery(String hql,PageInfo page){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
// 设置二级缓存
query.setCacheable(true);
page.setTotalRows(query.list().size());
int startIndex=(page.getPageNo()-1)*page.getPageSize();
query.setFirstResult(startIndex);
query.setMaxResults(page.getPageSize());
page.setPageContent(query.list());
return page;
}
public static void main(String[] args){
System.out.println("session=="+HibernateUtil.getSession());
}
}
ClassToolKit 类(根据类名生成类的类):
package fr.itris.glips.dbconn.util;
public class ClassToolKit{
public static Class loadClass(String className)throws ClassNotFoundException{
Class cls=null;
try{
cls=Thread.currentThread().getContextClassLoader().loadClass(className);
}catch(Exception e){
e.printStackTrace();
}
if(cls==null){
cls=Class.forName(className);
}
return cls;
}
}
<!--[if !supportLists]-->3、 <!--[endif]-->异常类
package fr.itris.glips.dbconn.exception;
public class DAOException extends RuntimeException{
private Throwable throwable;
public DAOException(String errorMassage){
super(errorMassage);
}
public DAOException(Throwable throwable){
this.throwable=throwable;
}
public DAOException(String errorMassage,Throwable throwable){
super(errorMassage);
this.throwable=throwable;
}
@Override
public void printStackTrace() {
if(throwable!=null){
System.err.println("A dao error has occured:");
throwable.printStackTrace();
}
}
}
类图:
相关推荐
这样的设计允许使用不同的数据库技术(如JDBC、Hibernate、MyBatis等)实现相同的业务逻辑,只需更换DAO的实现即可,这就是所谓的"数据访问层的抽象"。 DAO模式在Java开发中非常常见,特别是在企业级应用和Web应用...
在数据访问层中,返回 DataSet 是一种常见的数据交换方式。下面是返回 DataSet 的代码实现: ```csharp public DataSet MySqlDataSet(string Sql, string tableName) { OpenConn(); //打开连接 SqlDataAdapter da...
总的来说,“084集-数据访问层实现类的创建”这个教程将深入讲解如何在Android应用中构建高效的数据访问层,包括SQLite的使用、DAO设计、LiveData和Room的集成,这些都是Android开发中的核心技能。通过学习这部分...
在本案例中,我们讨论的是一个经典的数据库访问层实现,这通常涉及到面向对象的设计模式,如工厂模式、单例模式以及数据访问对象(DAO)模式。以下是对这个主题的详细解释: 1. 数据访问对象(DAO)模式:DAO模式是...
在C#编程中,"通用Dao层"是一个常见的设计模式,用于封装数据库操作,使得业务逻辑层能够专注于处理业务规则,而无需关心底层数据访问的细节。本篇将重点探讨如何利用C#的特性(Attribute)标签来实现这一目标,同时...
业务逻辑层调用数据访问层的DAO对象来操作数据,然后对结果进行处理,最终返回给表现层。`Chapter2_DAO与三层结构.ppt`可能会详细讲解这部分内容。 3. 数据访问层:这一层包含DAO对象,负责与数据库的交互,执行SQL...
DAO(Data Access Object)模式是一种常见的软件设计模式,主要用于数据库操作的封装,使得业务逻辑层与数据访问层解耦,提高代码的可复用性和可维护性。在本例中,我们将探讨如何使用DAO模式来实现宠物数据的更新...
通用数据库访问模块(通常称为 DAO,Data Access Object)是一种软件设计模式,用于在应用程序和数据库之间提供一个抽象层。DAO 类的主要目标是隔离业务逻辑层与数据存储层,使得应用程序可以独立于特定的数据库实现...
首先,DAO模式是一种用于分离业务逻辑层与数据访问层的模式。在该模式中,DAO类作为数据存取的接口,负责处理与数据库的所有交互。这样做的好处在于,业务逻辑层不必直接与数据库进行通信,而是通过调用DAO的方法,...
在给定的`TestDao`中,我们可以猜测这是一个用于测试DAO层实现的类。它可能包含了对DAO方法的调用,用于验证DAO功能的正确性。在单元测试中,我们通常会使用Mock框架(如Mockito)来模拟数据库操作,避免实际访问...
Hibernate 是一个流行的持久层框架,可以与泛型Dao接口集成,实现数据访问的持久化。 Hibernate 对泛型Dao接口的实现主要通过继承泛型Dao接口,使用 Hibernate 的 Session 对象来实现数据访问。 Hibernate 对泛型...
在上面的代码中,我们可以看到,DAO模式与Abstract Factory模式结合使用,形成了一个完整的数据访问层。Abstract Factory模式用于创建DAO工厂,DAO工厂用于创建DAO对象,DAO对象用于访问数据源。 6. DAO模式的优缺 ...
4. 数据访问层的DAO接口和实现,每个DAO对应一个数据库表,包含增删改查等操作。 5. 相关配置文件,如数据库连接配置。 6. 可能还会有单元测试代码,用于验证各个层的正确性。 这个项目源码可以作为一个学习和参考...
Java网站开发通常涉及多个组件,如Servlet、DAO(数据访问对象)层以及前端Ajax交互。在给定的项目中,作者尝试简化这个过程,通过仅使用一个Servlet和一个DAO类来构建整个网站。这种方式旨在降低复杂性,提高开发...
Service层和DAO层是软件开发中常见的两种设计模式,主要用于分离业务逻辑和数据访问操作。在Java Web开发中,它们通常被应用于三层架构或MVC(Model-View-Controller)模型中。 DAO(Data Access Object)层是负责...
3. **数据访问层**:DAO实现,直接与数据库进行读写操作,为业务逻辑层提供数据服务。 **三、数据库设计** 首先,我们需要设计一个简单的数据库表,如`message_board`,包含`id`(主键,自增)、`username`...
DAO模式是一种数据访问层的设计模式,它定义了接口来对数据库或其他持久化存储进行操作,而具体的实现则封装在实现了该接口的类中。这样做的好处在于,业务逻辑层可以完全通过DAO接口进行数据操作,而不必关心底层的...
总的来说,这个资源为开发者提供了一个高效的工具,通过使用Hibernate和通用DAO模式,可以快速构建数据访问层,同时保持代码的整洁和可维护性。在开发Java Web应用程序时,正确理解和运用这种模式,能大大提高开发...
利用org.springframework.orm.hibernate3.support.HibernateDaoSupport 实现对java数据访问层的基本实现,包含增删改查分页方法。