Spring整合Web,Mybatis,Hibernate

来源:互联网 发布:mac玩魔兽世界 编辑:程序博客网 时间:2024/05/18 03:24
一.Spring整合web
1.添加jar
IOC+AOP
spring-web.jar

2.web.xml配置文件

<!--配置访问默认主页 -->

  <welcome-file-list>

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

  </welcome-file-list>

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

    <context-param>

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

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

    </context-param>

<!-- 监听器(用于创建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"/>

三、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目录中
四、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"/>
原创粉丝点击