`
dev_liu
  • 浏览: 112479 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

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>

分享到:
评论
2 楼 gougou8180 2007-06-05  
i agree with you
1 楼 dev_liu 2007-01-09  
看了是网页不支持xml?总之,我建议jms不用spring集成,因为在你需要简便的时候很简便,但是需要重新去连接或者是提供一些多线程消息处理的时候,你需要大量的使用反射,那就比较复杂了,所以简单的时候很简单,复杂的时候很复杂,感觉没必要用spring,当然这是我的个人意见,刚入门.只是参考.

相关推荐

    基于Hibernate和Spring的数据持久层设计与开发(软件工程课程设计).pdf

    3.2-3.7章节主要介绍如何设置开发环境,构建持久化对象,配置映射文件,理解Hibernate的查询语法,整合Hibernate与Spring,以及最终实现一个原型系统,演示数据持久层的功能。 总结,本课程设计通过学习和实践,...

    Spring持久层(PDF)

    事务管理是Spring持久层的关键特性之一,它提供了两种事务管理方式: 1. **编程式事务管理**:开发者需在代码中显式地管理事务的开启、提交和回滚,适用于需要精细控制事务边界的情况。 2. **声明式事务管理**:...

    轻量级Java持久层框架MiniDAO:基于SpringJDBC与FreeMarker的源码实现

    项目名称:轻量级Java持久层框架MiniDAO...MiniDAO致力于简化数据访问层代码,通过FreeMarker模板提供灵活的SQL管理方式,同时继承了Spring JDBC的易用性和高效性,为Java开发者提供了一个简洁、高效的持久层解决方案。

    ssh集成jar包,支持spring集成Hibernate,spring集成struts2等

    - Spring与Hibernate集成,通常使用Spring的HibernateTemplate或HibernateDaoSupport,提供事务管理和数据访问抽象,使得代码更简洁,事务控制更方便。 - Spring与Struts2集成,Spring可以作为Struts2的Action的...

    spring和数据库层的结合

    3. **自动注入与便利获取**:Spring同样提供了`HibernateDaoSupport`等支持类,这些类可以自动注入数据源和SessionFactory,并且提供了一个便捷的方法来获取`HibernateTemplate`对象。这使得开发过程更加高效。 ###...

    Spring与WebLogic Server的集成

    Spring 提供了对数据访问对象(DAO)的抽象,简化了与各种持久化技术(如JDBC、Hibernate、JPA等)的交互。它提供了一组模板类和回调接口,减少了重复的DAO代码。 **WebLogic Server 简介** BEA WebLogic Server...

    Spring之Spring2.5集成Hibernate3.6

    这篇博客“Spring之Spring2.5集成Hibernate3.6”主要探讨了如何将两个经典的开源框架——Spring 2.5和Hibernate 3.6进行整合,以实现数据持久化的高效管理。 Spring 2.5版本是Spring框架的一个重要里程碑,它引入了...

    Spring与iBATIS的集成示例代码

    Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)等功能,而iBATIS则是一个持久层框架,用于简化数据库操作。本示例代码旨在展示如何将两者有效地结合在一起,以实现高效的数据访问层。 首先...

    struts1+spring+hibernate+ibatis集成

    Spring还提供了数据访问抽象,包括JDBC模板和ORM支持,使得与数据库交互变得更加简单。在本集成中,Spring作为“胶水”将其他框架紧密连接起来。 Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用...

    struts2 spring hibernate集成

    此外,Spring还提供了数据访问抽象,包括JDBC模板和ORM支持,如Hibernate,以及事务管理功能。Spring的AOP模块使得我们可以编写切面代码,实现跨切面的关注点,如日志、性能监控等。 **Hibernate** 是一个流行的ORM...

    spring动态数据源+mybatis分库分表

    2. **MyBatis分库分表**:MyBatis是一个轻量级的持久层框架,它允许开发者编写自定义的SQL语句,这为分库分表提供了便利。分库分表通常通过在Mapper XML文件中添加特定的逻辑,比如使用不同的SQL语句或者配置不同的...

    使用Spring进行数据访问

    1. **JDBC模板**:Spring JDBC模块提供了一个抽象层,简化了JDBC编码,避免了常见的错误和资源管理问题。`JdbcTemplate`和`NamedParameterJdbcTemplate`是两个主要的工具,它们封装了SQL执行和结果处理,使代码更...

    spring 集成ibatis

    而 iBatis(现在称为 MyBatis)是一个轻量级的持久层框架,它简化了数据库访问,通过 SQL 映射文件将 SQL 语句与 Java 代码解耦。 当我们将 Spring 与 iBatis 集成时,我们可以利用 Spring 的强大管理能力来控制 ...

    spring+mybatis模板

    Spring 是一个全面的后端开发框架,提供了依赖注入、面向切面编程、事务管理等功能,而 MyBatis 是一个轻量级的持久层框架,专注于数据库操作。将两者结合使用,可以构建出高效且灵活的 Java Web 应用。 Spring ...

    spring-boot和Mybatis集成,并配置多数据源、事务和连接池的demo。.zip

    总结起来,这个项目为我们提供了一个完整的示例,演示了如何在Spring Boot中集成Mybatis,配置多数据源、事务管理和连接池,同时展示了JPA和SqlSessionTemplate两种不同的数据库访问方式。对于想要学习和理解这些...

    Struts+Spring+Hibernate+WebService集成架构

    Hibernate是一个持久层框架,主要用于简化Java应用程序与数据库之间的交互。它提供了一种对象关系映射(Object-Relational Mapping, ORM)机制,使得开发者可以通过Java对象操作数据库记录,无需直接编写SQL语句。...

    spring_mvc + spring + mybaist 集成

    Spring MVC是Spring框架的一部分,用于构建Web应用程序的前端控制器,Spring则提供了全面的依赖注入(DI)和面向切面编程(AOP)支持,而MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...

    JPA+spring3+tile集成项目模板。

    这个模板旨在为开发者提供一个快速启动新项目的基础结构,使他们能够便捷地构建具有数据持久化、依赖注入和视图布局功能的应用程序。 **JPA知识点:** Java Persistence API (JPA) 是Java平台上的一个标准,用于...

    webwork+ibatis+spring oracle c3p0 集成框架

    2. iBatis:iBatis 是一个持久层框架,它允许开发者将SQL语句直接写在配置文件或者Java代码中,提供了一种灵活的映射机制,将数据库操作与业务逻辑解耦。iBatis 的优点在于它的动态SQL支持,可以根据条件动态生成SQL...

Global site tag (gtag.js) - Google Analytics