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

springer nature下的peer review_配置文件


Struts跟Hibernate同时包含了这个,删除一个低版本的

引入配置文件
  • Struts2
  • web.xml
  • struts.xml
  • Hibernate5
  • hibernate.cfg.xml
  • 映射文件
  • Spring
  • applicationContext.xml
  • log4j.properties
  • web.xml 核心监听器ContextLoaderListener
具体实现
  1. 创建包结构
  2. 引入相关的页面
  3. 修改页面的路径
Struts2 和Spring的整合
  • Action类由Struts2的自身创建
  1. 引入一个Struts2中的lib包中的spring
  2. 在jar包中有一个配置文件:struts-plugins.xml
  • 在struts核心包中的default.properties,有下面这个常量:
  • Struts中的是默认将这个常量注释的,在插件包中将其开启,这个常量的开启会引发下面一系列常量的开启
  • 开启后只需要在action中加一个Service的变量跟set方法,即可直接使用Service,配置文件中只要有名字跟他对上了即可使用

  • Action类交给Spring管理(建议使用)
  1. 在Spring中创建一个Action的实例,
  2. 因为Struts配置文件中已经有了action的实例,所以需要把Struts中的class改为spring中实例的id
  • 注意:Actioin是多例的,所以要在Spring中的action实例中加一个scope=prototyte
  • Service的属性需要在Spring中手动注入

建议使用交给Spring,因为Spring中有AOP,可以方便增强

Spring整合Hibernate
  • 编写Dao,配置Dao
  • 创建数据库和实体类,配置文件
  • 因为隔离级别跟绑定当前线程都交给Spring管了,所以在这里就把配置文件中的删掉。
  • 在Spring中引入Hibernate的信息
  1. 在Spring的配置文件中构建一个SessionFactory(注意版本5),并注入configLoaction属性
  2. 定义Hibernate模板,并注入到Dao中去


    然后在Dao中写模板的变量跟set方法即可。
  3. 因为写一个Dao就得注入一次,特麻烦,所以可以让Dao继承HibernateDaoSupport,里面有模板的变量跟set方法
  4. 还能更简单: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);
修改跟删除

springer nature下的peer review_配置文件_02

查询一个

springer nature下的peer review_xml_03

查询多个

HQL:

springer nature下的peer review_xml_04

QBC:

springer nature下的peer review_hibernate_05

延迟加载的解决

  • 延迟加载问题:就是想用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>