spring与数据持久层的集成(提供一个模版)

一、配置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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值