Spring
- Spring
- 案例CRM的保存案例SSH完成
- SSH 整合方式一零障碍整合
- SSH基本回顾
- 第一步创建项目引入jar包
- 引入配置文件
- 具体实现
- Struts2 和Spring的整合
- Spring整合Hibernate
- 添加事务管理
- SSH整合方式二不带Hibernate配置文件
- 在Spring中配置连接池
- Hibernation 模板的使用
- 修改跟删除
- 查询一个
- 查询多个
- 延迟加载的解决
案例:CRM的保存案例(SSH完成)
SSH 整合方式一:零障碍整合
意思就是没有注解用所有的配置文件,最原始的那种写法
SSH基本回顾
第一步:创建项目,引入jar包
33个
- Struts2 中基本的开发包:struts-blanks中找 13个
- struts2中的依赖包(看需求):
sturts/lib/
- 例:
spring
:Struts2整合Spring -
convention
:注解 -
json
:整合AJAX的开发包
- Hibernate5 基本:
lib/required
里面的所有9个
- 还需要 日志记录
log4j
跟数据库驱动connector
- 有可能用的到数据库的连接池:
- C3P0 (3个):5的版本,3的版本的时候只需要一个C3P0即可
- Spring 基本:
-
IOC
基本 6个,四个核心包,两个日志 -
AOP
基本 4个,两个核心包,两个依赖 - 事务管理 :
tx
- JDBC :
jdbc
跟数据库驱动connector
- 整合web :
web
- 整合单元测试 :
test
- 整合其他框架(Hibernate反正在这):
orm
Struts跟Hibernate同时包含了这个,删除一个低版本的
引入配置文件
- Struts2
- web.xml
- struts.xml
- Hibernate5
- hibernate.cfg.xml
- 映射文件
- Spring
- applicationContext.xml
- log4j.properties
- web.xml 核心监听器
ContextLoaderListener
具体实现
- 创建包结构
- 引入相关的页面
- 修改页面的路径
Struts2 和Spring的整合
- Action类由Struts2的自身创建
- 引入一个Struts2中的lib包中的
spring
包 - 在jar包中有一个配置文件:
struts-plugins.xml
- 在struts核心包中的
default.properties
,有下面这个常量: - Struts中的是默认将这个常量注释的,在插件包中将其开启,这个常量的开启会引发下面一系列常量的开启
- 开启后只需要在action中加一个Service的变量跟set方法,即可直接使用Service,配置文件中只要有名字跟他对上了即可使用
- Action类交给Spring管理(建议使用)
- 在Spring中创建一个Action的实例,
- 因为Struts配置文件中已经有了action的实例,所以需要把Struts中的class改为spring中实例的id
- 注意:Actioin是多例的,所以要在Spring中的action实例中加一个
scope=prototyte
- Service的属性需要在Spring中手动注入
建议使用交给Spring,因为Spring中有AOP,可以方便增强
Spring整合Hibernate
- 编写Dao,配置Dao
- 创建数据库和实体类,配置文件
- 因为隔离级别跟绑定当前线程都交给Spring管了,所以在这里就把配置文件中的删掉。
- 在Spring中引入Hibernate的信息
- 在Spring的配置文件中构建一个
SessionFactory
(注意版本5),并注入configLoaction
属性 - 定义Hibernate模板,并注入到Dao中去
然后在Dao中写模板的变量跟set方法即可。 - 因为写一个Dao就得注入一次,特麻烦,所以可以让Dao继承
HibernateDaoSupport
,里面有模板的变量跟set方法 - 还能更简单:
HibernateDaoSupport
中有getHibernateTemplate
的方法,里面的内容是有模板就能用,没有就创建一个模板,所以只需要在Dao中注入SessionFactory
,然后再调用getHibernateTemplate
方法即可。
- 在Spring跟Hibernate的整合上修改数据库时,必须使用事务管理,要不然会抛出
read-only
异常。
添加事务管理
- 配置事务管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sesssionFactory" ref="sessionFactory" />
</bean>
- 开启注解事务
<tx:annotation-driven transaction-manager="transactionManager" />
- 在业务层添加注解
@Transactional
public class CustomerServiceImpl implements CustomerService{}
SSH整合方式二:不带Hibernate配置文件
web 项目复制之后过去不能直接用,必须修改项目属性中的 Web Project Settings
在Spring中配置连接池
- 提供属性文件(数据库连接)
- 引入外部属性文件
<context:property-placeholder location="classspath:jdbc.properties" />
- 配置连接池
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
- 构建连接池,构建一个SessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 设置Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">updata</prop>
</props>
</property>
</bean>
- 设置Hibernate的映射文件
<property name="mappingResources">
<list>
<value>com/spring/ssh/...</value>
</list>
</property>
- 在加载映射文件的时候还有很多种方式:
- 具体到包中所有的映射文件 :
<property name="mappingDirectoryLocations"> <array> <value>classpath:cn/itcast/domain</value> </array> </property>
- 使用通配符的概念加载映射文件 :
<property name="mappingLocations"> <array> <value>classpath:cn/itcast/domain/*.hbm.xml</value> </array> </property>
Hibernation 模板的使用
- save(Object obj)
- update(Object obj)
- delete(Object obj)
- T get(Class clazz,Serializable id);
- List/ find(String hql);
- List/ findByCriteria(DetachedCriteria c);
修改跟删除
查询一个
查询多个
HQL:
QBC:
延迟加载的解决
- 延迟加载问题:就是想用Load的时候,因为已经在service使用了事务,所以当延迟加载的时候,到Service的时候就把session关闭了,所以当action中用到查询的东西的时候,没有办法去获得数据了,就会报错
- 解决办法:用
OpenSessionInViewFilter
过滤器,把session的开启跟关闭放在action中。
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>