通过Hibernate模板访问数据
application.xml文件:
(1)下面是配置一个LocalSessionFactoryBean,它加载了映射文件。dataSource属性引用一个数据源连接,这里就不再给出dataSource的配置。
<bean id="sessionFactory" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/model/Student.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibername.dialect}</prop>
</props>
</property>
</bean>
(2)在Spring里配置HibernateTemplate:
<bean id="hibernateTemplate" ref="sessionFactory" />
</bean>
(3)注入HibernateTemplate到我们的DAO类里来访问数据库。
<bean id="studentDao" ref="hibernateTemplate" />
</bean>
StudentDao.java:
public class StudentDao {
private HibernateTemplate hibernateTemplate;
private Student student;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public Student findStudentById(long id) {
/*student = (Student) hibernateTemplate.load(Student.class, id)return student;*/
/*List result = hibernateTemplate.find("from Student s where s.studentId = ?", new Object[] {id});
return result;*/
student = (Student) hibernateTemplate.get(Student.class, id);
return student;
}
public void saveOrUpdate(Student student) {
hibernateTemplate.saveOrUpdate(student);
}
}
(1)这是HibernateTemplate的3种操作数据库的方法,HibernateTemplate提供了数十个方法来查询和保存对象;
(2)我使用的是Hibernate3,当使用hibernateTemplate.load()时,返回的student对象里的属性居然全是null,这是因为如果你的映射文件里如果没有设置是延迟检索还是立即检索,Hibernate3默认类级别的检索策略是延迟检索(ibernate2默认是立即检索),当hibernateTemplate.load()时,并没有真正执行SQL语句,而是返回一个代理类的实例,仅仅初始化了ID属性,其他属性都是null,当调用getΧΧΧ()或setΧΧΧ()时,才真正执行SQL语句。但是当我student.getStudentName()时,报错了,这是因为session已经关闭,而getΧΧΧ()和setΧΧΧ()仅支持在一个session里。
(3)hibernateTemplate.get()是不支持延迟检索的。