该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-05-11
这个例子实现了: 1. 用ThreadLocal管理session,保证了在一个thread中使用同一个session(connection) 2. 在ServletFilter中initSessionFactory和closeSession,保证一个应用中只有一个SessionFactory并做到了session-per-request, instead of session-per-operation 3. DAO的粗略实现 菜菜鸟可以先参考一下本人写的第一个例子,Tomcat+Mysql+UltraEdit,10分钟Hibernate初体验http://forum.iteye.com/viewtopic.php?t=4077 1. 保证你的Mysql工作正常。 CREATE TABLE cat ( cat_id varchar(20); NOT NULL, name varchar(20); NOT NULL, sex char(1);, weight float, PRIMARY KEY (cat_id); );; insert cat values('1', 'ada', 'F', 5);; insert cat values('2', 'belinda', 'F', 10);; commit; 2. 保证你的Tomcat工作正常。Then stop Tomcat。 在{TOMCAT_HOME}\conf\server.xml中加入: <Context path="/hellohibernate" docBase="hellohibernate" reloadable="true"> <Resource name="jdbc/hellohibernate" scope="Shareable" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/hellohibernate"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <!-- DBCP database connection settings --> <parameter> <name>url</name> <value>jdbc:mysql://localhost:3306/test</value> </parameter> <parameter> <name>driverClassName</name><value>com.mysql.jdbc.Driver</value> </parameter> <parameter> <name>username</name> <value>yourusername</value> </parameter> <parameter> <name>password</name> <value>yourpassword</value> </parameter> <!-- DBCP connection pooling options --> <parameter> <name>maxWait</name> <value>3000</value> </parameter> <parameter> <name>maxIdle</name> <value>100</value> </parameter> <parameter> <name>maxActive</name> <value>10</value> </parameter> </ResourceParams> </Context> 3. 将附件hellohibernate.zip更名为hellohibernate.war,扔到{TOMCAT_HOME}\webapps下,重新启动Tomcat。 4. 你会发现hellohibernate已经被自动部署了,copy下列文件到{TOMCAT_HOME}\webapps\hellohibernate\WEB-INF\lib下: hibernate2.jar log4j-1.2.8.jar commons-collections-2.1.jar commons-logging-1.0.3.jar dom4j-1.4.jar cglib-2.0-rc2.jar odmg-3.0.jar ehcache-0.6.jar jta.jar (其实我本可以把它们打包到war里面的,但是这样war文件就到了2M,现在才12K) 5. http://localhost:9090/hellohibernate/servlet/HelloHibernateServlet 参看HelloHibernateServlet.java,你会发现我们做了以下操作: a. create了罗宾猫,得力猫和胖子猫 b. delete了阿达猫和柏林达猫 c. update了胖子猫 d. select了所有猫 6. 代码分析 web.xml <filter> <filter-name>HelloHibernateFilter</filter-name> <filter-class>com.xanada.HelloHibernateFilter</filter-class> </filter> <filter-mapping> <filter-name>HelloHibernateFilter</filter-name> <url-pattern>/*</url-pattern> //Filter对所有的请求都响应 </filter-mapping> HelloHibernateFilter.java //init在整个servlet的生命周期中只做一次,在这里它初始化了SessionFactory,从而保证了SessionFactory在整个进程中只有一个实例 public void init(FilterConfig filterConfig); throws ServletException { try { HibernateSessionFactory.init();; } catch (HibernateException e); { e.printStackTrace();; } } //session是从DAO中得到的,但是做完一个operation后并不close,而是在整个request完成后在doFilter的finally里面close public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain); throws ServletException, IOException { try { chain.doFilter(req, res);; } finally { try { HibernateSessionFactory.closeSession();; } catch (HibernateException e); { e.printStackTrace();; } } } 其实你若不愿用filter,完全可以把这两段代码放在相应的servlet.init()和servlet.execute()的finally里。 HibernateSessionFactory //sessionFactory是一个singleton private static SessionFactory sessionFactory; //init在filter.init();中被调用 public static void init(); throws HibernateException //currentSession被DAO中被调用 public static Session currentSession(); throws HibernateException //closeSession在filter.doFilter();的finally中被调用 public static void closeSession(); throws HibernateException CatDAOImpl //注意:这里的session用完之后并不close,而只flush一下 public void delCat(String strCatId); { try { Session s = HibernateSessionFactory.currentSession();; Object cat = s.load(Cat.class, strCatId);; s.delete(cat);; s.flush();; } catch (HibernateException e); { e.printStackTrace();; } } CatDAO //对Cat的CRUD的封装 public interface CatDAO { public void creatCat(Cat cat);; public List readCats();; public void updateCat(Cat cat);; public void delCat(String strCatId);; } 这里只是对DAO做了最粗略的封装,实际应用中还要加一层DAOFactory。关于DAO pattern,可以在这里得到详细资料:http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html Hope it's helpful, thanks. 2004/05/10 xanada 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-05-12
谢谢楼主的努力
|
|
返回顶楼 | |
发表时间:2004-05-12
不要误人子弟,del方法中要在load之前判断一下哪个object是否存在。不然...........
|
|
返回顶楼 | |
发表时间:2004-05-12
呵呵,这只不过是一个toy,目的是让后来人能看到一个完整的能run起来的例子而已。要说应用到实际里,该修正的地方还多呢。
anyway,谢谢提醒。 |
|
返回顶楼 | |
发表时间:2004-05-13
感谢xanada!你的例子是最完整的其中一个。再次感谢对我们初学者的照顾。
To WFoxd: Only a example,也希望你给更好帮助给我们。 |
|
返回顶楼 | |
发表时间:2004-06-08
有个Cat,你就写了一个CatDAO,但要再有一个狗,是否再写一个DogDAO?保存Cat的函数saveCat(),保存Dog就要saveDog(),可Hibernate可以实现对象的映射,都能用session.save()完成,这样的DAO,是否只能增大工作量,意义大吗?
|
|
返回顶楼 | |
发表时间:2004-06-08
这个这个,我已经说了。论坛上相关的讨论很多,能run的完整例子却没有,所以我就试着提供一个。
细节部分当然有很多不妥的地方,比如那个update其实也不太对,所以要应用到实际当中,还有很多要改进的地方呢。 |
|
返回顶楼 | |
发表时间:2004-07-13
你的文章看了深有感触!对于初学者来说真的是太好了!
|
|
返回顶楼 | |
发表时间:2004-08-01
我觉得DAO主要是对JDBC编程用的,以前有个软件就是用了MysqlDat,DB2Dao,对于Hibernate这种ORM
中间层来说,作一个BO,PO,在BO里面直接操作PO,JSP or Struts action只要操作BO就行了, 请指教 |
|
返回顶楼 | |
发表时间:2004-08-02
nesta 写道 有个Cat,你就写了一个CatDAO,但要再有一个狗,是否再写一个DogDAO?保存Cat的函数saveCat(),保存Dog就要saveDog(),可Hibernate可以实现对象的映射,都能用session.save()完成,这样的DAO,是否只能增大工作量,意义大吗?
用DAO封装持久层可以实现持久层和业务层的分离。也许有一天出来一个叫待机的东西呢。 |
|
返回顶楼 | |