第五章Hibernate
-OSIV与泛型DAO模式
-
Open Session In View(OSIV)
使用Servlet过滤器实现OSIV模式
1.编写泛型DAO接口
2.编写泛型DAO的实现类
3.使用GenericDao接口
4.使用GenericDaoHibernate类
我们使用servlet过滤器来实现自己的OSIV模式。当用户向一个JSP页面或者Servlet发出请求的时候开启Session对象,在JSP页面或者Servlet执行之后,在关闭Session对象。
编写HibernateSessionFilter.java
public class HibernateSessionFilter implements Filter {
private Transaction transaction = null;
private SessionFactory sessionFactory = null;
public void destroy() {
sessionFactory.close();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try{
Session session = sessionFactory.getCurrentSession();
transaction = session.beginTransaction();
chain.doFilter(request, response);
transaction.commit();
}catch(Exception e){
e.printStackTrace();
try{
if(transaction.isActive()){
transaction.rollback();
}
} catch(Exception e2){
e2.printStackTrace();
}
}
}
public void init(FilterConfig arg0) throws ServletException {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
}
配置web.xml
<filter>
<filter-name>HibernateSessionFilter</filter-name>
<filter-class>com.crazy.HibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1 编写泛型DAO接口
2 编写泛型DAO的实现类
3 GenericDao.java
4 GenericDaoHibernate.java
public interface GenericDao<T,PK extends Serializable> {
public T findById(PK id);
public List<T> findAll();
public T save(T entity);
public void update(T entity);
public void delete(T entity);
}
public class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T,PK> {
private Class<T> clazz;
public GenericDaoHibernate(){
clazz = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public void delete(T entity) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
session.delete(entity);
}
public List findAll() {
Session session = new Configuration().configure().buildSessionFactory().openSession();
Query query = session.createQuery("from" +clazz.getName());
return query.list();
}
public T findById(PK id) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
return (T)session.get(clazz, id);
}
public T save(T entity) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
session.save(entity);
return entity;
}
public void update(T entity) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
session.update(entity);
}
}
由于Java中的泛型采用擦拭方法,因此无法直接通过反射获取到T.class。而getGenericSuperclass()方法会返回一个ParameterizedType对象,这个对象保存负累的泛型绑定参数的类型,所以通过该对象即可获取T.class。
public interface GuestbookDao extends GenericDao <Guestbook,Integer> {
public List<Guestbook> findAllOrderById();
}
public class GuestbookDaoHibernate extends GenericDaoHibernate<Guestbook,Integer> implements GuestbookDao{
public List<Guestbook> findAllOrderById() {
Session session = new Configuration().configure().buildSessionFactory().openSession();
Query query = session.createQuery("from Guestbook order by id desc");
return query.list();
}
}
分享到:
相关推荐
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
基于hibernate5 泛型Dao实例,下载后改一下数据库 配置直接可以用
T21.13_泛型DAO模式与OSIV java 经典教程 经典教材
C++程序设计与实践:11-模板和泛型编程.ppt
Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页
JAVA设计模式--程序设计--反射--注解--泛型
减少重复代码的编写,增强DAO层代码的重用。
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
OCJP认证-3期(PX017) 面向对象程序设计-集合与泛型.doc 学习资料 复习资料 教学资源
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1491352
· - STL和泛型编程
泛型DAO 完善的dao代码及criteria查询底层代码
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
NULL 博文链接:https://zhaoshijie.iteye.com/blog/982232
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490705
6-generics(泛型6).pdf
泛型DAO模式在Java Web开发中的应用
Hibernate泛型DAO及使用方法.
S2SH整合例子 注解配置 JSON 泛型Dao
C语言在泛型这一块确实不行,哈,但我就是喜欢泛型啊。 用宏定义做的C语言泛型,提供一个思路给大家。