标签:ssh
因为这里写的是通用Dao功能,因此将它放置到core包里面。
1、定义通用Dao中的方法
BaseDao.java
package com.rk.core.dao; import java.io.Serializable; import java.util.List; public interface BaseDao<T> { void save(T entity); void update(T entity); void delete(Serializable id); T findById(Serializable id); List<T> findAll(); }
2、通用Dao的实现
需要注意的地方:
(1)BaseDaoImpl类继承自HibernateDaoSupport类,并实现了BaseDao接口。
(2)在BaseDaoImpl构造方法中,我们通过反射获取了泛型T的真实类型
(3)在delete方法中,我们通过调用HibernateConfigurationUtils类的方法来获得实体类的主键属性。HibernateConfigurationUtils是一个自定义的类。
HibernateDaoSupport类 1、HibernateDaoSupport介绍 我们使用Hibernate进行数据库的访问,访问数据库的这一层代码称为DAO层。 spring帮开发者封装了一个HibernateDaoSupport类(位于org.springframework.orm.hibernate3.support包下),该类提供了获取HibernateTemplate的方法,而HibernateTemplate对象可以方便的进行数据库的CRUD操作,因此我们自己写的Dao层的代码可以继承HibernateDaoSupport类。 2、如何使用HibernateDaoSupport类? 这里有一个前提要注意一下:我们是Spring和Hibernate整合的情况下使用HibernateDaoSupport。 首先,我们需要为HibernateDaoSupport类提供一个SessionFactory对象。 其次,我们可以通过调用HibernateDaoSupport类的getHibernateTemplate()方法得到一个HibernateTemplate对象。 最后,我们使用HibernateTemplate对象进行数据库操作。 假设我们最终会写一个UserDaoImpl类,那么UserDaoImpl类继承自BaseDaoImpl类,而BaseDaoImpl类继承自HibernateDaoSupport类。 Convenient super class for Hibernate-based data access objects. Requires a |
BaseDaoImpl.java
package com.rk.core.dao.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.rk.core.dao.BaseDao; import com.rk.core.utils.HibernateConfigurationUtils; public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { private Class<T> clazz; @SuppressWarnings("unchecked") public BaseDaoImpl() { ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); Type[] args = pt.getActualTypeArguments(); this.clazz = (Class<T>) args[0]; } public void save(T entity) { getHibernateTemplate().save(entity); } public void update(T entity) { getHibernateTemplate().update(entity); } public void delete(Serializable id) { String identifierPropertyName = HibernateConfigurationUtils.getIdentifierPropertyName(clazz); Session session = getSession(); session.createQuery("delete from " + clazz.getSimpleName() + " where " + identifierPropertyName + "=?") .setParameter(0, id).executeUpdate(); } public T findById(Serializable id) { return getHibernateTemplate().get(clazz, id); } @SuppressWarnings("unchecked") public List<T> findAll() { Session session = getSession(); Query query = session.createQuery("from " + clazz.getSimpleName()); return query.list(); } }
3、HibernateConfigurationUtils
主键属性,通过反射来获取
ApplicationContext对象-->Configuration对象-->PersistentClass对象-->获取类的主键属性
需要注意的是:
(1)HibernateConfigurationUtils 实现了 ApplicationContextAware 接口;ApplicationContextAware接口是位于org.springframework.context包下。
(2)HibernateConfigurationUtils类需要在bean-core.xml文件中进行注册,而bean-core.xml需要引入到applicationContext.xml文件中。
<bean class="com.rk.core.utils.HibernateConfigurationUtils"></bean>
ApplicationContextAware接口的定义如下: package org.springframework.context; import org.springframework.beans.BeansException; import org.springframework.beans.factory.Aware; public interface ApplicationContextAware extends Aware { public abstract void setApplicationContext(ApplicationContext applicationcontext) throws BeansException; } 我们可以看到ApplicationContextAware接口只有一个方法,它的作用是:让实现了ApplicationContextAware接口的类能够访问到ApplicationContext对象。 Interface to be implemented by any object that wishes to be notified of the |
HibernateConfigurationUtils.java
package com.rk.core.utils; import org.hibernate.cfg.Configuration; import org.hibernate.mapping.PersistentClass; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.orm.hibernate3.LocalSessionFactoryBean; public class HibernateConfigurationUtils implements ApplicationContextAware { // 1、ApplicationContext对象 private static ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { HibernateConfigurationUtils.applicationContext = applicationContext; } // 2、Configuration对象 private static Configuration configuration; public static Configuration getConfiguration() { if(configuration == null) { // 取sessionFactory的时候要加上& LocalSessionFactoryBean factory = (LocalSessionFactoryBean) applicationContext.getBean("&sessionFactory"); configuration = factory.getConfiguration(); } return configuration; } public static void setConfiguration(Configuration configuration) { HibernateConfigurationUtils.configuration = configuration; } // 3、PersistentClass对象 private static <T> PersistentClass getPersistentClass(Class<T> clazz) { synchronized(HibernateConfigurationUtils.class) { PersistentClass pc = getConfiguration().getClassMapping(clazz.getSimpleName()); if(pc == null) { configuration = configuration.addClass(clazz); pc = configuration.getClassMapping(clazz.getName()); } return pc; } } // 4、获取映射信息 // 4.1、获取类信息-主键属性 public static <T> String getIdentifierPropertyName(Class<T> clazz) { return getPersistentClass(clazz).getIdentifierProperty().getName(); } }
4、使用通用Dao
User.java
package com.rk.tax.entity; import java.util.Date; public class User { private String id; private String dept; private String account; private String name; private String password; private String headImg; private boolean gender; private String state; private String mobile; private String email; private Date birthday; private String memo; //用户状态 public static String USER_STATE_VALID = "1";//有效 public static String USER_STATE_INVALID = "0";//无效 public User() { } public User(String id, String dept, String account, String name, String password, String headImg, boolean gender, String state, String mobile, String email, Date birthday, String memo) { this.id = id; this.dept = dept; this.account = account; this.name = name; this.password = password; this.headImg = headImg; this.gender = gender; this.state = state; this.mobile = mobile; this.email = email; this.birthday = birthday; this.memo = memo; } // {{ Properties public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDept() { return dept; } public void setDept(String dept) { this.dept = dept; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getHeadImg() { return headImg; } public void setHeadImg(String headImg) { this.headImg = headImg; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } // }} }
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.rk.tax.entity" auto-import="true"> <class name="User" table="T_Users"> <id name="id" column="id" type="string" length="32"> <generator class="uuid.hex"></generator> </id> <property name="name" column="name" type="string" length="20" not-null="true"></property> <property name="dept" column="dept" type="string" length="20" not-null="true"></property> <property name="account" column="account" type="string" length="50" not-null="true"></property> <property name="password" column="password" type="string" length="50" not-null="true"></property> <property name="headImg" column="headImg" type="string" length="100"></property> <property name="gender" column="gender" type="boolean" not-null="true"></property> <property name="email" column="email" type="string" length="50"></property> <property name="mobile" column="mobile" type="string" length="20"></property> <property name="birthday" column="birthday" type="date" length="10" ></property> <property name="state" column="state" type="string" length="1"></property> <property name="memo" column="memo" type="string" length="200"></property> </class> </hibernate-mapping>
UserDao.java
package com.rk.tax.dao; import com.rk.core.dao.BaseDao; import com.rk.tax.entity.User; public interface UserDao extends BaseDao<User> { }
UserDaoImpl.java
package com.rk.tax.dao.impl; import com.rk.core.dao.impl.BaseDaoImpl; import com.rk.tax.dao.UserDao; import com.rk.tax.entity.User; public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao { }
标签:ssh
原文地址:http://lsieun.blog.51cto.com/9210464/1835776