本文为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进行集成了。