三大框架整合的原理
ssh整合過程
注意:在整合框架的過程中,每一大步都要測試,在這樣容易排查問題,出現問題從頭開始。
1、導包
(1)、先將Hibernate中的包全部導入進來。
Jap 注意:10個包+一個驅動包。
(2)、再將Struts2中的包導入進來。
導包時,如果發現是同一個包,版本不同一定要將其中之一刪掉,原則是刪除低版本。
再導入Struts2和spring整合的包
一旦導入了這個包,struts2在啓動時會自動尋找spring容器,如果沒有配置spring,就會出現異常。
(3)、導入spring的所有包 16
4+2 基本的包
2+2 aop
4 c3p0 tx spring jdbc數據庫驅動包 spring Jdbc
1 test
1 spring web 包
1 orm 包
一共40個包。
2、測試spring是否配置成功
(1)、首先創建一個applicationContext.xml
(2)、導入4個約束,beans context aop tx
(3)、在web.xml中配置監聽器
<!--監聽器-->
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--項目一啓動自動加載配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
3、單獨配置Struts2
先把Struts2插件包刪除
然後書寫struts.xml文件,導入約束,書寫剛剛的userAction的配置。在web.xml文件中配置struts2的過濾器。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache SoftwareFoundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--友好提示-->
<constant name="struts.devMode"value="true"></constant>
<!--
action的創建交給spring
struts.objectFactory = spring
-->
<constant name="struts.objectFactory"value="spring"></constant>
<!--
spring負責裝配的action的屬性
struts.objectFactory.spring.autoWire = name
-->
<constant name="struts.objectFactory.spring.autoWire"value="name"></constant>
<package name="main" namespace="/"extends="struts-default">
<action name="userAction_*"class="userAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
測試
4、整合Spring和struts2
(1)、將剛剛刪除的包導入進來。
(2)、添加常量
<!—
action的創建交給spring
struts.objectFactory = spring
-->
<constant name="struts.objectFactory"value="spring"></constant>
<!--
spring負責裝配的action的屬性
struts.objectFactory.spring.autoWire= name
-->
<constant name="struts.objectFactory.spring.autoWire"value="name"></constant>
(3)、由spring管理action(兩種方式)
一、由struts2創建action 由spring負責struts2的屬性注入。
Struts2配置文件
<package name="main"namespace="/" extends="struts-default">
<actionname="userAction_*" class="cn.hd.action.UserAction"method="{1}">
<resultname="success">/index.jsp</result>
</action>
</package>
Spring配置文件
<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>
<bean name="userAction"class="cn.hd.action.UserAction">
<propertyname="userService" ref="userService"></property>
</bean>
二、完全交給spring去管理action。
在配置action的時候,class的屬性值改爲在spring中bean的名字。
Struts2配置文件
<package name="main"namespace="/" extends="struts-default">
<actionname="userAction_*" class="userAction"method="{1}">
<resultname="success">/index.jsp</result>
</action>
</package>
Spring配置文件
<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>
<bean name="userAction"class="cn.hd.action.UserAction">
<propertyname="userService" ref="userService"></property>
</bean>
注意:spring配置action要配置的類的創建模式爲多例。
<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>
<bean name="userAction"class="cn.hd.action.UserAction" scope="prototype">
<propertyname="userService" ref="userService"></property>
</bean>
5、單獨整合Hibernate
(1)、書寫實體類和orm數據源文件
(2)、書寫核心配置文件
將線程綁定
事務隔離級別刪除掉,後面使用Spring管理事務。
(3)、書寫測試類,測試Hibernate單獨配置成功
package cn.hd.test;
import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class Demo {
@Test
public void fun1(){
Configuration configuration = newConfiguration().configure();
SessionFactory sessionFactory =configuration.buildSessionFactory();
Session session =sessionFactory.openSession();
Transaction transaction =session.beginTransaction();
User user = new User();
user.setMoney(10000);
user.setName("李四");
user.setPsd("123456");
session.saveOrUpdate(user);
transaction.commit();
}
}
6、Hibernate和Spring的結合
實際上結合的原理就是Hiernate當中的sessionFactory和事務交給Spring管理。
一、 hibernate中的配置文件不動,在spring配置文件中配置sessionFactory對象。
<!--orm包下-->
<bean name="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<propertyname="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
package cn.hd.test;
import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
@Resource(name = "sessionFactory")
private SessionFactorysessionFactory;
@Test
public void fun1(){
Session session =sessionFactory.openSession();
User user =session.get(User.class, 1);
System.out.println(user);
}
}
二、 不使用hibernate配置文件,所有配置文件寫入到spring配置文件中。
<!--第二種-->
<bean name="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<propertyname="hibernateProperties">
<props>
<!--必寫-->
<propkey="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<propkey="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo?useUnicode=true&characterEncoding=utf-8</prop>
<propkey="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password">123</prop>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<!--可選-->
<propkey="hibernate.show_sql">true</prop>
<propkey="hibernate.format_sql">true</prop>
<propkey="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!--配置源數據-->
<propertyname="mappingDirectoryLocations"value="classpath:cn/hd/entity"></property>
</bean>
package cn.hd.test;
import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
@Resource(name ="sessionFactory")
private SessionFactorysessionFactory;
@Test
public void fun1(){
Session session =sessionFactory.openSession();
User user =session.get(User.class, 1);
System.out.println(user);
}
}
7、整合c3p0連接池
(1)、使用spring讀取連接池的配置文件
<context:property-placeholder
location="classpath:db.properties"></context:property-placeholder>
(2)、配置連接池的bean
<bean name="dataSourse"class="com.mchange.v2.c3p0.ComboPooledDataSource">
<propertyname="driverClass"value="${jdbc.driverClass}"></property>
<property name="jdbcUrl"value="${jdbc.jdbcUrl}"></property>
<property name="user"value="${jdbc.user}"></property>
<propertyname="password"value="${jdbc.password}"></property>
</bean>
(3)、將hibernate中的數據庫配置刪除掉,增加一個properties爲dataSource
<bean name="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--得到dataSource-->
<propertyname="dataSource" ref="dataSourse"></property>
<propertyname="hibernateProperties">
<props>
<!--必寫-->
<!--<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<propkey="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo?useUnicode=true&characterEncoding=utf-8</prop>
<propkey="hibernate.connection.username">root</prop>
<propkey="hibernate.connection.password">123</prop>-->
<propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<!--可選-->
<propkey="hibernate.show_sql">true</prop>
<propkey="hibernate.format_sql">true</prop>
<propkey="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
8、整合狀態下操作數據庫(dao)
書寫dao類並讓dao類繼承HibernateDaoSupport
提供了一個HibernateTemplate模板
這個模板可以實現hibernate crud hql criteria sql四種查詢
public class UserDaoImpl extendsHibernateDaoSupport implements UserDao {
@Override
public void add(User user) {
/*可以將它當成session來用*/
HibernateTemplate ht =getHibernateTemplate();
ht.save(user);
}
9、整合Spring AOP事務
(1)、獲得事務管路對象
<bean name="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager"></bean>
(2)、配置事務通知
<!--配置事務-->
<bean name="transactionManager"class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory"ref="sessionFactory"></property>
</bean>
<!--配置事務通知-->
<tx:advice id="txAdvice"transaction-manager="transactionManager">
<tx:attributes>
<tx:methodname="add*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="persist*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="delete*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="remove*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="update*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="modify*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="get*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
<tx:methodname="find*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--將事務織入到目標對象-->
<aop:config>
<!--切點-->
<aop:pointcut id="txPc"expression="execution(*cn.hd.service.impl.*ServiceImpl.*(..))"></aop:pointcut>
<!--切面-->
<aop:advisorpointcut-ref="txPc"advice-ref="txAdvice"></aop:advisor>
</aop:config>
10、介紹Template模板
使用HibernateTemplate.excute方法就拿到了session
回到了原始的Hibernate開發
@Override
public List<User> getAll() {
returnthis.getHibernateTemplate().execute(newHibernateCallback<List<User>>() {
@Nullable
@Override
public List<User>doInHibernate(Session session) throws HibernateException {
String hql = "fromUser";
Query query =session.createQuery(hql);
List<User> list =query.list();
return list;
}
});
}