1.添加jar
IOC+AOP
spring-web.jar
2.web.xml配置文件
<!--配置访问默认主页 -->
<welcome-file-list>
<welcome-file>/public/index.html</welcome-file>
</welcome-file-list>
<!-- spring与web的整合读取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>
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>
<!-- spring与mybatis整合 -->
<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整合Hibernate1.导入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&characterEncoding=UTF-8"
username="root"
②需要在web工程中引用该资源(web.xml)password="123456" />
<resource-ref>
<res-ref-name>hibernate/dataSource</res-ref-name></resource-ref>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
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&characterEncoding=UTF-8</value>
</property></bean>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
<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></bean>
<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>
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:advice><tx:method name="login" propagation="SUPPORTS"/> //代理方法login<tx:method name="regist" propagation="REQUIRED"/> //代理方法regist<tx:method name="*" propagation="REQUIRED"/> //所有方法</tx:attributes>
<aop:config>
<aop:pointcut expression="execution(* com.itany.service.impl.*ServiceImpl.*(..))" id="pc"/></aop:config>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="pc"/>
//方式四(注解方式) 需在类或方法上加@Transactional
(示例@Transactional(propagation=Propagation.REQUIRED))
<tx:annotation-driven transaction-manager="transactionManager"/>