Spring提供了對Hibernate整合支持,支持包spring-orm.jar,提供的主要組件如下:
1.LocalSessionFactoryBean
在Spring容器中創建一個SessionFactory對象。
2.HibernateTemplate
類似於JdbcTemplate,封裝了session使用過程。
3.OpenSessionInViesFilter
提供了對Hibernate延遲加載的支持。
4.HibernateTransactionManager
例如DataSourceTransationManager,用於事務控制。
整合過程
1.引入struts,spring,hibernate開發包
2.添加struts.xml、hibernate.cfg.xml、applicationContext,xml
3.編寫實體類Subject.java
4.追加Subject映射描述信息
@Entity
@Table(name="SUBJECT")
public class Subject implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Integer id;
@Column(name="NAME")
private String name;
@Column(name="DIRECTION_ID")
private Integer directionId;
。。。省略getset方法
}
5.在hibernate.cfg.xml追加<mapping class=""/>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--
<property name="connection.url">
jdbc:mysql://localhost:3306/ovls?useUnicode=true&characterEncoding=utf8
</property>
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
-->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 加載映射描述信息 -->
<mapping class="cn.xdl.entity.Subject"/>
</session-factory>
6.在applicationContext.xml中配置DataSource、SessionFactory和HibernaterTemplate對象(在spring配置文件配置自己的DataSource後hibernate.cfg.xml文件的配置可以註釋掉。)
<bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ovls?useUnicode=true&characterEncoding=utf8"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dbcp"></property>
<property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
</bean>
<bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- Hibernate事務控制 --> 在**Action.java加上@Transactional使用
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
測試一下template對象的創建情況
mport org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate5.HibernateTemplate;
import cn.xdl.entity.Subject;
public class TestHibernateTemplate {
public static void main(String[] args) {
String conf = "applicationContext.xml";
ApplicationContext ac =
new ClassPathXmlApplicationContext(conf);
HibernateTemplate template =
ac.getBean("template",HibernateTemplate.class);
Subject subject = template.get(Subject.class, 1);
System.out.println(subject.getId()+" "+subject.getName());
}
}
7.編寫SubjectDao接口,並用HibernateSubjectDao實現。在applicationcontext.xml中開啓組件掃描。
import cn.xdl.entity.Subject;
public interface SubjectDao {
public List<Subject> loadAll();
public List<Subject> loadByDirection(int directionId);
public Subject loadById(int id);
}
@Repository
public class HibernateSubjectDao implements SubjectDao{
@Autowired
private HibernateTemplate template;
public List<Subject> loadAll() {
List list = template.find("from Subject");
return list;
}
public List<Subject> loadByDirection(int directionId) {
String hql = "from Subject where directionId=?";
Object[] params = {directionId};
List list = template.find(hql,params);
return list;
}
@Override
public Subject loadById(int id) {
Subject subject = template.load(Subject.class, id);
return subject;
}
}
<!--applicationContext.xml文件開啓掃描 掃描dao,service,action -->
<context:component-scan base-package="cn.xdl"/>
測試Dao接口中的方法
public class TestHibernateTemplate {
public static void main(String[] args) {
String conf = "applicationContext.xml";
ApplicationContext ac =
new ClassPathXmlApplicationContext(conf);
SubjectDao subjectDao =
ac.getBean("hibernateSubjectDao",SubjectDao.class);
// List<Subject> list = subjectDao.loadAll();
List<Subject> list = subjectDao.loadByDirection(1);
for(Subject subject:list){
System.out.println(subject.getId()+" "+subject.getName());
}
}
}
8.開發struts2流程
/subject/list.do -->Filter-->SubjecAction-->SubjectDao-->Result-->返回學科集合的JSON結果
9.在web.xml配置Filter
<filter> //解決延遲報錯問題
<filter-name>opensession</filter-name>
<filter-class>
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>opensession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>strutsmvc</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<!-- 默認找src/struts.xml配置文件 -->
</filter>
<filter-mapping>
<filter-name>strutsmvc</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
10.編寫SubjectAction
import cn.xdl.dao.SubjectDao;
import cn.xdl.entity.Subject;
@Controller
@Namespace("/subject")
@ParentPackage("json-default")
@Transactional
public class SubjectAction {
private List<Subject> subjects;//傳出值
private int id;//接收請求參數
private Subject subject;//傳出值
@Autowired
private SubjectDao subjectDao;
@Action(value="list",results={
@Result(name="success",type="json",params={"root","subjects"})
})
public String list(){
subjects = subjectDao.loadAll();
return "success";
}
@Action(value="load",results={
@Result(name="success",type="json",params={"root","subject"})
})
public String load(){
subject = subjectDao.loadById(id);
return "success";
}
。。。。省略getset方法
}
11.在struts.xml配置SubjectAction,註解的形式上面已經配置。
12.在struts.xml配置Result(註解形式已經配置),註解的形式上面已經配置,此處配多種請求方式
<constant name="struts.action.extension" value="do"/> //請求方式
13.在web.xml配置ContextLoaderListener實例化Spring容器
<!-- 創建Spring容器對象,給struts-spring-plugin.jar訪問 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
部署到Tomcat啓動,運行測試。