Spring整合Web,Mybatis,Hibernate

一.Spring整合web
1.添加jar
IOC+AOP
spring-web.jar

2.web.xml配置文件css

<!--配置訪問默認主頁 -->html

  <welcome-file-list>java

    <welcome-file>/public/index.html</welcome-file>mysql

  </welcome-file-list>web

<!-- springweb的整合讀取applicationContext.xml -->redis

    <context-param>spring

    <param-name>contextConfigLocation</param-name>sql

    <param-value>classpath:applicationContext.xml</param-value>數據庫

    </context-param>express

<!-- 監聽器(用於建立ac容器) spring提供ContextLoaderListener-->

    <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

<!-- 核心控制器配置(springMVC) 讀取springMVC配置文件-->

<servlet>

    <servlet-name>springMVC</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:springMVC.xml</param-value>

    </init-param>

<!-- 啓動加載-->

    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>springMVC</servlet-name>

    <url-pattern>/</url-pattern>

  </servlet-mapping>

<!-- 過濾器(解決中文亂碼問題) spring提供CharacterEncodingFilter-->

    <filter>

    <filter-name>encodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

       <param-name>encoding</param-name>

       <param-value>UTF-8</param-value>

    </init-param>

    </filter>

    <filter-mapping>

    <filter-name>encodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

<!-- woff等字體文件一直報404錯誤的解決-->

<servlet-mapping>

        <servlet-name>default</servlet-name>

        <url-pattern>*.woff</url-pattern>

   </servlet-mapping>

   <servlet-mapping>

        <servlet-name>default</servlet-name>

        <url-pattern>*.woff2</url-pattern>

    </servlet-mapping>

<!-- 配置靜態文件不走核心控制器-->

  <servlet-mapping>   
     <servlet-name>
default</servlet-name>  
     <url-pattern>
*.js</url-pattern>  
 </servlet-mapping>
 <servlet-mapping>   
     <servlet-name>
default</servlet-name>  
     <url-pattern>
*.css</url-pattern>  
 </servlet-mapping>
 <servlet-mapping>   
     <servlet-name>
default</servlet-name>  
     <url-pattern>
*.png</url-pattern>  
 </servlet-mapping>
 <servlet-mapping>   
     <servlet-name>
default</servlet-name>  
     <url-pattern>
*.jpg</url-pattern>  
 </servlet-mapping>
 <servlet-mapping>   
     <servlet-name>
default</servlet-name>  
     <url-pattern>
*.ico</url-pattern>  
 </servlet-mapping>
 <mime-mapping>
<extension>
ico</extension>
<mime-type>
image/x-icon</mime-type>
</mime-mapping>

二.Spring整合Mybatis  (Dao層無實現類,由spring掃描Dao包接口建立Dao層實例)
1.導入jar
IOC+AOP
spring-jdbc.jar 
spring-tx.jar       事物
spring-orm.jar
spring-oxm.jar
mybatis.jar
mybatis-spring.jar
dbcp:
commons-dbcp.jar
commons-pool.jar
dataSource-->sqlSessionFactoryBean-->MapperScannerConfigure(DAO)-->Service-->Action
2.applicationContext.xml文件配置

<!-- 掃包注入(service) -->

  <!-- <context:component-scanbase-package="com.huapu.dao"></context:component-scan>-->

  <context:component-scanbase-package="com.huapufinance.service.impl"></context:component-scan>

  <!-- 讀取jdbc.properties文件 -->

  <context:property-placeholderlocation="classpath:jdbc.properties"/>

  <!-- 使用第三方數據源 -->

  <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">

    <propertyname="driverClassName"value="${driverClassName}"></property>

    <propertyname="url"value="${url}"></property>

    <propertyname="password"value="${password}"></property>

    <propertyname="username"value="${dbUsername}"></property>

    <propertyname="maxActive"value="${maxActive}"></property>

    <propertyname="minIdle"value="${minIdle}"></property>

    <propertyname="maxWait"value="${maxWait}"></property>

    <propertyname="testWhileIdle"value="true"/>

    <propertyname="testOnBorrow"value="false"/>

    <propertyname="testOnReturn"value="false"/>

    <propertyname="validationQuery"value="select 1"/>

    <propertyname="timeBetweenEvictionRunsMillis"value="60000"/>

    <propertyname="numTestsPerEvictionRun"value="${maxActive}"/>

  </bean>

  <!-- springmybatis整合 -->

  <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">

    <!--若是使用mybatis核心配置文件 -->

    <!-- <property name="configLocation"value="classpath:mybatis-config.xml"></property> -->

    <!--數據源 -->

    <propertyname="dataSource"ref="dataSource"></property>

    <!--實體類(映射文件) -->

    <propertyname="mapperLocations"value="classpath:com/huapufinance/mapper/*Mapper.xml"></property>

    <!--包別名定義 -->

    <propertyname="typeAliasesPackage"value="com.huapufinance.entity"></property>

  </bean>

  <!-- 建立dao層實例將其放入IOC容器中 -->

  <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <!-- session -->

    <propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"></property>

    <!--接口 -->

    <propertyname="basePackage"value="com.huapufinance.dao"></property>

  </bean>

  <!-- 事物方式三:採用命名空間 -->

  <!-- <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <propertyname="dataSource" ref="dataSource"></property>

  </bean>

  <tx:adviceid="transactionAdvice" transaction-manager="transactionManager">

    <tx:attributes> 

      <tx:methodname="*" propagation="REQUIRED" />

    </tx:attributes>

  </tx:advice>

  <aop:config>

    <aop:pointcutexpression="execution(* com.huapu.service.impl.*ServiceImpl.*(..))"id="pc" />

    <aop:advisoradvice-ref="transactionAdvice" pointcut-ref="pc"/>

  </aop:config>-->

  <!-- redis配置(與數據庫配置相似) -->

  <beanid="jedisPoolConfig"class="redis.clients.jedis.JedisPoolConfig">

    <property name="maxActive" value="90"/> 

        <property name="maxIdle"  value="5"/> 

        <property name="maxWait" value="1000"/> 

        <property name="testOnBorrow" value="true"/>

  </bean>

  <beanid="jedisPool"class="redis.clients.jedis.JedisPool">

    <constructor-argref="jedisPoolConfig"/>

    <constructor-argvalue="127.0.0.1"/>

    <constructor-argvalue="6379"/>

  </bean>

  <beanid="jedisAPI"class="com.huapufinance.utils.RedisAPI">

    <propertyname="jedisPool"ref="jedisPool"></property>

  </bean>

  <!-- 註解方式配置事物 -->

  <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <propertyname="dataSource"ref="dataSource"></property>

  </bean>

  <tx:annotation-driventransaction-manager="transactionManager"/>

3、spring整合Hibernate
1.導入jar
IOC+AOP
spring-jdbc.jar
spring-tx.jar
spring-orm.jar
spring-oxm.jar
hibernate/*.jar
dbcp:
commons-dbcp.jar
commons-pool.jar
2.JNDI配置數據源:
   ①在tomcat/conf/context.xml
<Resource name="hibernate/dataSource" 
auth="Container"
type="javax.sql.DataSource"
factroy="org.apache.commons.dbcp.BasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_book?useUnicode=true&amp;characterEncoding=UTF-8"
username="root"
password="123456" />
    ②須要在web工程中引用該資源(web.xml)
<resource-ref>
<res-ref-name>hibernate/dataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3.spring引用dataSource
方式一:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/hibernate/dataSource"></property>
</bean>
方式二:(使用jee命名空間)
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/hibernate/dataSource"></jee:jndi-lookup>
PS:JDNI名稱最好添加前綴java:comp/env/    若是發現驅動找不到,就將數據庫驅動jar添加到tomcat/lib目錄中
4、Spring整合JDBC
1.添加jar
IOC+AOP
spring-web.jar
spring-jdbc.jar
spring-tx.jar    事物管理
DataSource配置的三種方式:
1.  使用spring提供的DataSource (IOC容器管理)
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/db_book?useUnicode=true&amp;characterEncoding=UTF-8</value>
</property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.  使用其餘第三方的(c3p0/dbcp/druid...)IOC容器管理
<!-- 使用第三方數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="password" value="${password}"></property>
<property name="username" value="${dbUsername}"></property>
<property name="maxActive" value="${maxActive}"></property>
<property name="minIdle" value="${minIdle}"></property>
<property name="maxWait" value="${maxWait}"></property>
</bean>
3.  jndi (由Tomcat服務器管理數據源)
什麼是JNDI:
JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface), 在J2EE規範中是重要的規範之一,很多專家認爲,沒有透徹理解JNDI的意義和做用, 就沒有真正掌握J2EE特別是EJB的知識。
       dataSource--->jdbcTemplate-->Dao---->Service--->Action
事物特性:(ACID)
A(atomicity)  :原子性 (要麼都成功,要麼都失敗)
C(consistency):一致性 (操做成功後,數據先後總額一致)
I(isolation)  :隔離性 (有一事務操做表,另外一事務也操做此表,彼此間不相識的)
D(durability) :持久性 (一但提交數據,真正改變數據庫中的值)
事物屬性:
事物的傳播屬性
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS
事物的隔離級別
TRANSACTION_NONE             指示事務不受支持的常量。
TRANSACTION_READ_UNCOMMITTED 指示能夠發生髒讀 (dirty read)、不可重複讀和虛讀 (phantom read) 的常量。  
TRANSACTION_READ_COMMITTED   指示不能夠發生髒讀的常量;不可重複讀和虛讀能夠發生。 
TRANSACTION_REPEATABLE_READ  指示不能夠發生髒讀和不可重複讀的常量;虛讀能夠發生。 
TRANSACTION_SERIALIZABLE     指示不能夠發生髒讀、不可重複讀和虛讀的常量。 

事物併發會發生的一些錯誤:
髒讀:   一個事物讀取到另外一個事物沒有提交的數據.
不可重複讀 :  一個事物使用數據的時候,另一個事物在修改數據(數據不一致)
虛讀/幻讀 :   一個事物使用數據的時候,另一個事物在刪除、新增數據(數據量不一致)

只讀優化:readonly
回滾條件:拋出RuntimeException回滾 
超時處理
事物配置的四種方式:(aop織入的四種方式)四種方式均需先得到事物管理實例以下:
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
//事物 方式一(採用FactoryBean 的實現類TransactionProxyFactoryBean)
注:TransactionProxyFactoryBean專門用來代理事物,不須要再有交叉業務邏輯.
<bean id="loginService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="loginServiceImpl"></property> //目標類
<property name="proxyInterfaces">                          //目標類的實現接口列表
<list>
<value>com.itany.service.LoginService</value>
</list>
</property>
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="login">PROPAGATION_SUPPORTS</prop>
<prop key="regist">PROPAGATION_REQUIRED</prop>
<prop key="select*">PROPAGATION_SUPPORTS</prop>
<prop key="query*">PROPAGATION_SUPPORTS</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
//事物 方式二(採用後處理器BeanNameAutoProxyCreator自動代理)
//事物環繞通知配置,TransactionInterceptor類
<bean id="transactionAdvice" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="login">PROPAGATION_SUPPORTS</prop>
<prop key="regist">PROPAGATION_REQUIRED</prop>
<prop key="select*">PROPAGATION_SUPPORTS</prop>
<prop key="query*">PROPAGATION_SUPPORTS</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
//後處理器自動代理BeanNameAutoProxyCreator
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*ServiceImpl</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionAdvice</value>
</list>
</property>
</bean>
//方式三(採用命名空間方式,需加入事物管理schama文件)
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">  //通知
<tx:attributes>
<tx:method name="login" propagation="SUPPORTS"/>       //代理方法login
<tx:method name="regist" propagation="REQUIRED"/>      //代理方法regist
<tx:method name="*" propagation="REQUIRED"/>             //全部方法
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.itany.service.impl.*ServiceImpl.*(..))" id="pc"/>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="pc"/>
</aop:config>
//方式四(註解方式)  需在類或方法上加@Transactional   
(示例@Transactional(propagation=Propagation.REQUIRED))
<tx:annotation-driven transaction-manager="transactionManager"/>
相關文章
相關標籤/搜索