五大块
1,配置和使用数据源
2,Spring中使用JDBC
3,事务管理
4,整合Hibernate
5,发送电子邮件
6,定时调度任务
测试用的数据源
不带连接池的数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///test");
dataSource.setUsername("root");
dataSource.setPassword("root");
DataSource ds = (DataSource)context.getBean("dataSource");
Connection conn = ds.getConnection();
配置DATASOURCE
配置一个带第三方连接池的数据源
**C3P0:需要添加c3p0-x.x.x.jar包
<bean id="dataSource" destroy-method="close"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql:///test" />
<property name="user" value="root" />
<property name="password" value="root" />
</bean>
加载属性文件
从托管环境获取DATASOURCE
通过JNDI从应用服务器中得到DataSource
¡当resourceRef属性为true时,jndiName会被添加java:comp/env/。
Spring中使用JDBC
在SPRING中使用JDBC,主要有两种方式:
*使用JDBC模板类
*使用对JDBC的DAO的支持类
JDBC模板类
*Spring提供了几个JDBC模板类
Spring提供了几个JDBC模板类:
¡JdbcTemplate:利用JDBC和简单的索引参数查询提供对数据库的简单访问。(线程安全的)
¡NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数。
¡SimpleJdbcTemplate:利用JDK5的特性简化JDBC模板的使用。
使用:
¡在spring的配置文件中配置JDBC模板类
把JDBC模板类在装配到DAO中,用它来访问数据库
使用对JDBC的 DAO的支持类
Spring提供3个对JDBC的DAO支持类:
¡JdbcDaoSupport
¢getJdbcTemplate()
¡NamedParameterJdbcDaoSupport
¢getNamedParameterTemplate()
¡SimpleJdbcDaoSupport
¢getSimpleJdbcTemplate()
事务管理
事务管理
Spring和EJB一样,既提供了对程序控制事务管理的支持,也提供了对声明式事务管理的支持。
¡声明式事务帮助把一个操作从事务规则中分离出来。首选
¡程序控制事务管理能让你在代码中精确定义事务边界。
SPRING常用的事务管理器
Spring不直接管理事务。它通过事务管理器将事务管理的责任委托给相应的持久性机制的某个特定平台事务实现。
事务管理实现 |
使用时机 |
org.springframework.jdbc.datasource.DataSourceTransactionManager |
在单一的JDBC DataSource中管理事务 |
org.springframework.orm.hibernate3.HibernateTransactionManager |
当持久化机制是Hibernate时,用它来管理事务 |
org.springframework.orm.jpa.JpaTransactionManager |
当JPA用作持久化时,用它来管理事务 |
org.springframework.tranaction.jta.JtaTransactionManager |
使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用 |
… |
… |
声明要使用的事务管理器
在Spring配置文件中进行配置
声明式事务管理
spring对声明式事务管理的支持是通过它的AOP实现的。
声明式事务是用事务参数来定义,有以下5个事务参数:
¡传播行为:指定一个方法是否应该在事务中运行。
¢Spring提供EJB CMT中熟悉的事务传播选项。
¡隔离级别:当前事务和其它事务的隔离的程度。
¢例如,这个事务能否看到其他事务未提交的写数据?
¡只读状态:只读事务只对后端数据库执行读操作,这样数据库可以采用一些优化措施。
¢只读事务在某些情况下(如使用Hibernate时)是一种非常有用的优化。
¡事务超时:事务在超时前能运行多久(自动被底层的事务基础设施回滚)。以秒为单位。
¡回滚规则:哪些异常引起回滚,哪些不引起。
¢默认情况下,只在出现RuntimeException时回滚,而受检异常不回滚。
事务的传播行为
¡PROPAGATION_REQUIRED:当前方法必须在一个事务中运行。如果一个事务正在运行,该方法将会在那个事务中运行。否则就要开始一个新事务。
¢Spring的TransactionDefinition的默认传播行为。
¡PROPAGATION_SUPPORTS:当前方法不需要事务性上下文。如果有一个事务正在进行,它也可以在这个事务里运行。
¡PROPAGATION_MANDATORY:当前方法必须在一个事务中运行。如果有一个事务正在进行,该方法将会在那个事务中运行。如果没有一个活动的事务,则抛出异常。
事务的传播行为(续)
¡PROPAGATION_REQUIRES_NEW:当前方法必须在它自己的事务里运行。总是开启一个新的事务,如果有一个事务正在运行,则将在这个方法的运行期间被挂起。
¡PROPAGATION_NOT_SUPPORTED:当前方法总是非事务地执行.。如果有一个事务正在运行,它将在这个方法的运行期间被挂起。
¡PROPAGATION_NEVER:当前方法不能在一个事务上下文中。如果有一个事务正在运行,则抛出异常。
¡PROPAGATION_NESTED:如果当前有一事务正在运行,则该方法运行在一个嵌套式事务中。如果没有活动事务, 则按PROPAGATION_REQUIRED 属性执行。
事务的隔离级别
隔离级别定义一个事务受其它并发事务活动影响的程度。
¡ISOLATION_DEFAULT: 使用数据库默认的事务隔离级别。
¢Spring的PlatfromTransactionManager的默认隔离级别
¡ISOLATION_READ_UNCOMMITTED: 它充许另一个事务可以看到这个事务未提交的数据。隔离级别最低。
¢这种隔离级别会产生脏读,不可重复读和幻读。
¡ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。
¢可能出现不可重复读和幻读。
¡ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。
¢可能出现幻像读。
ISOLATION_SERIALIZABLE:事务被处理为顺序执行。可以防止脏读、不可重复读、幻读。隔离级别最高
只读状态,事务超时和回滚规则
只读状态:
¡只读事务只对后端数据库执行读操作,后端数据库可以采用一些优化措施来提高效率。
事务超时:
¡指定事务在特定秒数后自动回滚,不必等它自己结束。
¡事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
回滚规则:
¡定义哪些异常引起事务回滚,哪些不引起。
¡默认情况下只在出现RuntimeException才会回滚,而在出现受检异常时不回滚。(跟EJB中的回滚行为一致)
¡你可以声明一个事务在出现特定的受检异常时能回滚。也可以声明一个事务在出现特定的非受检异常时不回滚。
配置事务参数
声明事务切入点
基于注解式的事务配置
在Spring配置文件中启用对Transactional注解的支持:
¡<tx:annotation-driven transaction-manager="txManager"/>
@Transactional 注解是用来指定接口、类或方法必须拥有事务语义的元数据,属性配置如下表说明:
示例
整合Hibernate
配置使用Spring提供的Hibernate SessionFactory:
¡如果使用XML做映射文件,应该使用Spring提供的LocalSessionFactoryBean。
如果使用注解做映射,应该使用Spring提供的AnnotationSessionFactoryBean
SPRING对HIBERNATE的支持
使用HibernateTemplate类。
继承自HibernateDaoSupport类。
为了解耦,可以只给DAO装配一个SessionFactory,使用基于Hibernate的原生API实现DAO。
邮件发送
Spring提供了邮件发送的内置支持类:
¡MailSender、MailSenderImpl、SimpleMailMessage
¡JavaMailSender、 JavaMailSenderImpl、MimeMessagePreparator
¡MimeMessageHelper
有如下邮件服务器信息
实例
定时调度服务
定时调度服务
Spring包含了对定时服务的内置支持类:
支持从JDK1.3开始内置的Timer类
开源的Quartz Scheduler
通过Trigger, Job以及JobDetail等对象来进行各种类型的任务调度
使用Quartz调度器
添加Quartz的jar包:quartz.jar
commons-beanutils.jar、commons-collections.jar、commons-digester.jar、commons-logging.jar
使用Spring提供的包装类:
JobDetailBean、MethodInvokingJobDetailFactoryBean
CronTriggerBean和SimpleTriggerBean
示例
QUARTZ CRON 表达式
Quartz cron表达式支持七个域
¡域之间用空格分隔
¡格式:秒 分 时 日 月 周 年
名称 |
是否必须 |
允许值 |
特殊字符 |
秒 |
是 |
0-59 |
, - * / |
分 |
是 |
0-59 |
, - * / |
时 |
是 |
0-23 |
, - * / |
日 |
是 |
1-31 |
, - * ? / L W C |
月 |
是 |
1-12 或 JAN-DEC |
, - * / |
周 |
是 |
1-7 或 SUN-SAT |
, - * ? / L C # |
年 |
否 |
空 或 1970-2099 |
, - * / |
CRON表达式中的特殊字符
特殊字符 |
说明 |
示例 |
* |
指示着你想在这个域上包含所有合法的值 |
0 * 17 * * ? |
? |
不为该域指定值 只能用在日或周域上。你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ? |
|
, |
给某个域上指定一个值列表 |
0 0,15,30,45 * * * ? |
/ |
用于表示时间表的递增量 |
0/15 0/30 * * * ? */15 */30 * * * ? |
- |
用于指定一个范围 |
0 45 3-8 * * * ? |
L |
指定为最后一个值 只能用在日(月最后一天)和周(周的最后一天)域 |
0 0 8 L * ? |
W |
代表平日(Mon-Fri、工作日) 只能用于日域 |
|
# |
指定月份中的第几周的哪一天 只能用在周域 |
0 15 10 ? * 6#3 第三周的周五 |
总结
数据持久化
¡配置和获取数据源
¡使用JDBC
¡整合Hibernate
事务管理
¡声明式事务
其它服务
¡发送电子邮件
¡定时调度服务