首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

SSH调整终结版(二)

2012-12-27 
SSH整合终结版(二)本文为SSH整合第二部分内容,主要演示业务层的开发(通过Spring对DAO层的实体Bean进行操作

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

热点排行