Spring in Action 笔记(III)
By: icess blog: http://blog.matrix.org.cn/page/icess
这次来看看使用Spring的Hibernate模板来操作数据, Spring提供了Hibernate的一层包装,使Hibernate使用起来更加方便,尤其是结合Hibernate Annotation时, 配置文件更少,维护更加简单. 下面来看看吧.
下面是一个测试数据实体类TestData.java 和前一篇提到的实体类一样,只不过用了Annotation注释.
package
test.orm.hibernate.model;
import
javax.persistence.Basic;
import
javax.persistence.Entity;
import
javax.persistence.Id;
import
javax.persistence.Table;
@Entity
@Table(name =
"test"
,schema =
"APP"
)
public class
TestData {
private int
id;
private
String name;
public
TestData(
int
id, String name) {
this
.id = id;
this
.name = name;
}
public
TestData() {}
@Id
public int
getId() {
return
id;
}
public void
setId(
int
id) {
this
.id = id;
}
@Basic
public
String getName() {
return
name;
}
public void
setName(String name) {
this
.name = name;
}
}
下面是测试Hibernate模板的类, TestHibernateTemplate.java
package
test.orm.hibernate;
import
java.sql.SQLException;
import
org.hibernate.HibernateException;
import
org.hibernate.Session;
import
org.springframework.orm.hibernate3.HibernateCallback;
import
org.springframework.orm.hibernate3.HibernateTemplate;
import
test.orm.hibernate.model.TestData;
public class
TestHibernateTemplate {
private
HibernateTemplate hibernateTemplate;
public
TestHibernateTemplate() {}
public
HibernateTemplate getHibernateTemplate() {
return
hibernateTemplate;
}
public void
setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this
.hibernateTemplate = hibernateTemplate;
}
//测试使用HibernateTemplate来操作数据
public
TestData getTestData(
final int
id) {
return
(TestData) hibernateTemplate.execute(
new
HibernateCallback() {
public
Object doInHibernate(Session s)
throws
HibernateException, SQLException {
// TODO Auto-generated method stub
return
s.get(TestData.class, id);
}
});
}
// 上面查询数据的方法 使用了HibernateCallBack接口,对于这样简单的查询,可以使用下面由HibernateTemplate 提供的更简单的方法
public
TestData getTestData2(
final int
id) {
return
(TestData) hibernateTemplate.get(TestData.class, id);
}
/* 如果上面的两处方法使用Load 方法的时, 抛出延迟加载属性异常, Spring管理Session的问题, 应该是Spring用完Session 然后就关闭了,
* 所以不可以延迟加载, 也就不可以使用load 方法了,,????? 为什么????*/
// 其他操作数据方法 如: 插入,修改.... 和使用Hibernate session 差不多, HibernateTemplate只是Session的包装
}
可以看到使用Hibernate模板来操作数据,是多么简单,
注意: 上面注释中,提到了在使用Load方法时候,会有问题, Session in view 时候使用load是不会出问题的, 这里Spring提供的方法应该是按照Hibernate的语义写的吧.
下面就是用来测试上面的类是否正常工作的测试类了.TestApp.java
package
test.orm.hibernate;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import
test.jdbc.DatabaseUtils;
import
test.orm.hibernate.model.TestData;
public class
TestApp {
/**
*
@param
args
*/
public static void
main(String[] args) {
// TODO Auto-generated method stub
DatabaseUtils dataUtils =
new
DatabaseUtils();
dataUtils.connect();
System.out.println(
"Open database:!"
);
ApplicationContext context =
new
ClassPathXmlApplicationContext(
"test/orm/hibernate/spring-hibernate.xml"
);
TestHibernateTemplate hibernateTemplate = (TestHibernateTemplate) context.getBean(
"testDao"
);
System.out.println(
"name : "
);
TestData data = hibernateTemplate.getTestData(
9
);
System.out.println(
"name : "
+ data.getName());
data = hibernateTemplate.getTestData2(
3
);
System.out.println(
"name 2: "
+ data.getName());
dataUtils.disconnect();
}
}
注意: 本测试中用到了上一篇使用到的DatabaseUtils.java 工具类来操作Derby数据库.
由
以上实例可以看出,在Spring中使用Hibernate,效率更高一些. 你不这样认为吗?
同时
Spring也提供了 JDO等其他一些数据操作框架的包装,使用上基本上 是一样的这里就不在详述了.
下一次我们来看看Spring的I18N处理,和自定义属性编辑器的实现.