Spring第四阶段

Spring

案例: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

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

引入配置文件
  • Struts2
    • web.xml
    • struts.xml
  • Hibernate5
    • hibernate.cfg.xml
    • 映射文件
  • Spring
    • applicationContext.xml
    • log4j.properties
    • web.xml 核心监听器ContextLoaderListener
      02
具体实现
  1. 创建包结构
  2. 引入相关的页面
  3. 修改页面的路径
Struts2 和Spring的整合
  • Action类由Struts2的自身创建
    1. 引入一个Struts2中的lib包中的spring
    2. 在jar包中有一个配置文件:struts-plugins.xml
      • 在struts核心包中的default.properties,有下面这个常量:
        03
      • 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属性
      04
    2. 定义Hibernate模板,并注入到Dao中去
      05
      06
      然后在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);
修改跟删除

07

查询一个

08

查询多个

HQL:
09

QBC:
10

延迟加载的解决

  • 延迟加载问题:就是想用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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值