?
Spring in Action 筆記(III)
By: icess blog: http://blog.matrix.org.cn/page/icess
這次來看看使用Spring的Hibernate模板來操作數(shù)據(jù), Spring提供了Hibernate的一層包裝,使Hibernate使用起來更加方便,尤其是結(jié)合Hibernate Annotation時(shí), 配置文件更少,維護(hù)更加簡(jiǎn)單. 下面來看看吧.
下面是一個(gè)測(cè)試數(shù)據(jù)實(shí)體類TestData.java 和前一篇提到的實(shí)體類一樣,只不過用了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;
??
}
}
下面是測(cè)試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;
??
}
??
??
//測(cè)試使用HibernateTemplate來操作數(shù)據(jù)
??
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);
??????
}
??????
????
});
??
}
//??上面查詢數(shù)據(jù)的方法?使用了HibernateCallBack接口,對(duì)于這樣簡(jiǎn)單的查詢,可以使用下面由HibernateTemplate?提供的更簡(jiǎn)單的方法
??
public?
TestData?getTestData2(
final?int?
id)?{
????
return?
(TestData)?hibernateTemplate.get(TestData.class,?id);
??
}
??
/*?如果上面的兩處方法使用Load?方法的時(shí),?拋出延遲加載屬性異常,?Spring管理Session的問題,?應(yīng)該是Spring用完Session?然后就關(guān)閉了,
???
*?所以不可以延遲加載,?也就不可以使用load?方法了,,??????為什么????*/
??
??
//?其他操作數(shù)據(jù)方法?如:?插入,修改....?和使用Hibernate?session?差不多,?HibernateTemplate只是Session的包裝
}
可以看到使用Hibernate模板來操作數(shù)據(jù),是多么簡(jiǎn)單,
注意: 上面注釋中,提到了在使用Load方法時(shí)候,會(huì)有問題, Session in view 時(shí)候使用load是不會(huì)出問題的, 這里Spring提供的方法應(yīng)該是按照Hibernate的語義寫的吧.
下面就是用來測(cè)試上面的類是否正常工作的測(cè)試類了.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();
????
??
}
}
注意: 本測(cè)試中用到了上一篇使用到的DatabaseUtils.java 工具類來操作Derby數(shù)據(jù)庫.
由
以上實(shí)例可以看出,在Spring中使用Hibernate,效率更高一些. 你不這樣認(rèn)為嗎?
同時(shí)
Spring也提供了 JDO等其他一些數(shù)據(jù)操作框架的包裝,使用上基本上?是一樣的這里就不在詳述了.
下一次我們來看看Spring的I18N處理,和自定義屬性編輯器的實(shí)現(xiàn).