SSH整合终结版(二)

本文为SSH整合第二部分内容,主要演示业务层的开发(通过Spring对DAO层的实体Bean进行操作),并使用JUnit对业务方法进行单元测试。

第一步,创建com.lyk.service.PersonService接口,内容如下:

文件名:com.lyk.service.PersonService.java

package com.lyk.service;

import java.util.List;

import com.lyk.bean.Person;

public interface PersonService {

 public abstract void save(Person person);

 public abstract void update(Person person);

 public abstract Person getPerson(Integer personId) ;

 public abstract void  delete(Integer personId);

 public abstract List<Person> getPersons();

}

第二步,创建PersonService接口的实现类com.lyk.service.imp.PersonServiceBean,内容如下:

文件名:com.lyk.service.imp.PersonServiceBean

package com.lyk.service.imp;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.lyk.bean.Person;
import com.lyk.service.PersonService;
 //采用注解方式声明事务
@Transactional
public class PersonServiceBean implements PersonService {
  /* 采用注解方式注入sessionFactory,默认按名称注入,当对象注入字段时,就可以通过字段获得该对象了
   这样spring容器对session进行管理,所以我们可以采用getCurrentSession()获得当前spring管理的session
 而不是采用openSession()方法。我们也无需对事务进行管理,spring承担了这个职责*/
 
   @Resource private SessionFactory sessionFactory;      //注入sessionFactory
 public void save(Person person) {
  sessionFactory.getCurrentSession().persist(person);
 }
 
 public void update(Person person) {
  sessionFactory.getCurrentSession().merge(person);   //把对游离对象的更新同步到数据库
 }
 
 @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) //不需要事务,提高效率
 public Person getPerson(Integer personId) {
  return (Person)sessionFactory.getCurrentSession().get(Person.class, personId);
 }
 
 public void  delete(Integer personId){
  sessionFactory.getCurrentSession().delete(
    sessionFactory.getCurrentSession().load(Person.class, personId));//load()方法效率较get()方法高,除去了装配过程
 }
 
 @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)   //不需要事务,提高效率
    @SuppressWarnings("unchecked")
 public List<Person> getPersons(){
     return sessionFactory.getCurrentSession().createQuery("from Person").list();
    }
}

第三步,在与控制层进行整合之前,必须对业务方法进行单元测试,这是个很好且很重要的步骤。创建junit.test.PersonServiceTest.java内容如下:

package junit.test;


import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lyk.bean.Person;
import com.lyk.service.PersonService;

public class PersonServiceTest {
    private static PersonService personService;
 @BeforeClass
 public static voidsetUpBeforeClass() throws Exception {
   try {
   ApplicationContext applicationContext= new ClassPathXmlApplicationContext("beans.xml");
    personService = (PersonService)applicationContext.getBean("personService");
    } catch (RuntimeException e) {
    e.printStackTrace();
  }
   }
 @Test
 public void testSave(){
  personService.save(new Person("大P"));
  personService.save(new Person("小S"));
  }
 @Test
 public void testUpdate(){
  Person person = personService.getPerson(1);
  person.setName("小P");
  personService.update(person);
 }
 @Test
 public void testGetPerson(){
  System.out.println(
    personService.getPerson(2).getName()
    );
 }
 @Test
 public void testDelete(){
  try {
   personService.delete(2);
  } catch (RuntimeException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
 }
 @Test
 public void testGetPersons(){
  List<Person> persons = personService.getPersons();
  for (Person person : persons) {
   System.out.println(
     "id="+person.getId()+",name="+person.getName());
  }
 }
}

注意:在测试前必须导入数据库驱动jar文件。
 至此,我们完成了MVC模式中M层(即model层)的开发,且验证无误。下一步我们就可以对Strut进行集成了。

你可能感兴趣的:(spring,bean,JUnit,单元测试,ssh)