一、配置DataSource
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/myDatasource</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="mappingResources">
<list>
<value>com/springinaction/training/model/Course.hbm.xml</value>
<value>com/springinaction/training/model/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>
二、使用JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(
"UPDATE user SET age = ? WHERE id = ?",
new PreparedStatementSetter() {
public void setValues(PreparedStatementSetter ps)
throws SQLException {
ps.setInt(1, 18);
ps.setString(2, "erica");
}
}
);
在Spring中使用方法:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
<bean id="studentDao" class="StudentDaoJdbc">
<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
</bean>
在DAO类中定义
public class StudentDaoJdbc implements StudentDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
…
}
三、以Batch方式批量插入数据
public int[] updatePersons(final List persons) {
String sql = "insert into person (id, firstName, lastName) " +"values (?, ?, ?)";
BatchPreparedStatementSetter setter = null;
setter = new BatchPreparedStatementSetter() {
public int getBatchSize() {
return persons.size();
}
public void setValues(PreparedStatement ps, int index)
throws SQLException {
Person person = (Person) persons.get(index);
ps.setInt(0, person.getId().intValue());
ps.setString(1, person.getFirstName());
ps.setString(2, person.getLastName());
}
};
return jdbcTemplate.batchUpdate(sql, setter);
}
四、Spring中查询数据
返回单条记录
public Person getPerson(final Integer id) {
String sql = "select id, first_name, last_name from person " + "where id = ?";
final Person person = new Person();
final Object[] params = new Object[] { id };
jdbcTemplate.query(sql, params, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
person.setId(new Integer(rs.getInt("id")));
person.setFirstName(rs.getString("first_name"));
person.setLastName(rs.getString("last_name"));
}
});
return person;
}
返回多条记录
class PersonRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int index)
throws SQLException {
Person person = new Person();
person.setId(new Integer(rs.getInt("id")));
person.setFirstName(rs.getString("first_name"));
person.setLastName(rs.getString("last_name"));
return person;
}
}
public List getAllPersons() {
String sql = "select id, first_name, last_name from person";
return jdbcTemplate.query(
sql, new RowMapperResultReader(new PersonRowMapper()));
}
调用存储过程:
public void archiveStudentData() {
CallableStatementCallback cb = new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException{
cs.execute();
return null;
}
};
jdbcTemplate.execute("{ ARCHIVE_STUDENTS }", cb);
}
五、在Spring中集成Hibernate
配置文件:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/trainingDatasource</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="mappingResources">
<list>
<value>com/tongking/model/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="studentDao" class="com.springinaction.training.dao.hibernate.StudentDaoHibernate">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate"/>
</property>
</bean>
代码:
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO {
public List getUsers() {
return getHibernateTemplate().find("from User");
}
public User getUser(Long id) {
User user = (User) getHibernateTemplate().get(User.class, id);
if (user == null) {
throw new ObjectRetrievalFailureException(User.class, id);
}
return user;
}
public void saveUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
public void removeUser(Long id) {
getHibernateTemplate().delete(getUser(id));
}
}
三、在Spring中进行事务管理
TransactionProxyFactoryBean consults a method’s transaction attributes to determine
how to administer transaction policies on that method
The getTransactionAttribute() method is called to find the transaction
attributes for a particular method, given the target class and method.
<bean id="courseService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>
com.springinaction.training.service.CourseService
</value>
</list>
</property>
<property name="target">
<ref bean="courseServiceTarget"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="attributeSource"/>
</property>
</bean>
<bean id="myTransactionAttribute" class="org.springframework.transaction.interceptor.DefaultTransactionAttribute">
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRES_NEW</value>
</property>
<property name="isolationLevelName">
<value>ISOLATION_REPEATABLE_READ</value>
</property>
</bean>
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute">
<ref bean="myTransactionAttribute"/>
</property>
</bean>
CourseService course=context.getBean("courseService");
六、在Spring中访问DataSource
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" singleton="true">
<property name="jndiName">
<value>java:comp/env/jdbc/myDatasource</value>
</property>
</bean>
七、在Spring中实现JavaMail服务
<bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/mail/Session</value>
</property>
</bean>
<bean id="mailSender" class="org.springrframework.mail.javamail.JavaMailSenderImpl">
<property name="session">
<ref bean="mailSession"/>
</property>
</bean>
实现代码:
public void sendCourseEnrollmentReport() {
Set courseList = courseDao.findAll();
SimpleMailMessage message = new SimpleMailMessage(this.mailMessage);
StringBuffer messageText = new StringBuffer();//定义用于存入邮件内容
messageText.append("Current enrollment data is as follows:\n\n");
for(Iterator iter = courseList.iterator(); iter.hasNext(); ) {
Course course = (Course) iter.next();
messageText.append(course.getId() + " ");
messageText.append(course.getName() + " ");
int enrollment = courseDao.getEnrollment(course);
messageText.append(enrollment);
}//将从数据库中取得内容放至邮件中
message.setText(messageText.toString());
try {
mailSender.send(message);//发送邮件
} catch (MailException e) {
LOGGER.error(e.getMessage());
}
}
八、定时功能:
1.creating a job
public class EmailReportJob extends QuartzJobBean {
public EmailReportJob() {}
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
courseService.sendCourseEnrollmentReport();
}
private CourseService courseService;
public void setCourseService(CourseService courseService) {
this.courseService = courseService;
}
}
2.在配置文件中定义:
<bean id="reportJob"class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.springinaction.training.schedule.EmailReportJob</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="courseService">
<ref bean="courseService"/>
</entry>
</map>
</property>
</bean>
3.Scheduling the job
<bean id="simpleReportTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="startDelay">
<value>3600000</value>
</property>
<property name="repeatInterval">
<value>86400000</value>
</property>
</bean>
以上方法不能用于具体的时间点定时功能,但下面的方法可以
<bean id="cronReportTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="cronExpression">
<value>0 0 6 * * ?</value>
</property>
</bean> //6:00 a.m. every day.
直接通过配置文件声明定时执行方法
<bean id="courseServiceInvokingJobDetail">
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="courseService"/>
</property>
<property name="targetMethod">
<value>sendCourseEnrollmentReport</value>
</property>
</bean>
九、在Spring中使用JMS
1、发送消息:
public void sendSettlementMessage(final PaySettlement settlement) {
jmsTemplate.send(
new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
MapMessage message = session.createMapMessage();
message.setString("authCode",
settlement.getAuthCode());
message.setString("customerName",
settlement.getCustomerName());
message.setString("creditCardNumber",
settlement.getCreditCardNumber());
message.setInt("expirationMonth",
settlement.getExpirationMonth());
message.setInt("expirationYear",
settlement.getExpirationYear());
return message;
}
}
);
}
配置文件:
bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="jmsConnectionFactory"/>
</property>
<property name="defaultDestination">
<ref bean="destination"/>
</property>
</bean>
<bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>connectionFactory</value>
</property>
</bean>
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>creditCardQueue</value>
</property>
</bean>
2、消费消息
public PaySettlement processSettlementMessages() {
Message msg = jmsTemplate.receive("creditCardQueue");
try {
MapMessage mapMessage = (MapMessage) msg;
PaySettlement paySettlement = new PaySettlement();
paySettlement.setAuthCode(mapMessage.getString("authCode"));
paySettlement.setCreditCardNumber(
mapMessage.getString("creditCardNumber"));
paySettlement.setCustomerName(
mapMessage.getString("customerName"));
paySettlement.setExpirationMonth(
mapMessage.getInt("expirationMonth"));
paySettlement.setExpirationYear(
mapMessage.getInt("expirationYear"));
return paySettlement;
} catch (JMSException e) {
throw JmsUtils.convertJmsAccessException(e);
}
}
配置文件:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="receiveTimeout">
<value>10000</value>
</property>
</bean>