SSH框架学习之旅(二):增删改查操作和事务

1.继承hibernatetemplet实现简单增删改查

(1)dao层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

public class StudentInfoDAOImpl extends HibernateTemplate implements StudentInfoDAO{

@SuppressWarnings("unchecked")
public List<StudentInfo> studentList() {
return find("from StudentInfo");
}

public void add(StudentInfo student) {
saveOrUpdate(student);
}

public void deleteStudent(StudentInfo student) {
delete(student);
}

public StudentInfo getStudentByName(String name) {
return get(StudentInfo.class, name);
}

@SuppressWarnings("unchecked")
public List<StudentInfo> findByName(String name) {
return find("from StudentInfo where name = ?",name);
}
}

(2)xml配置注入sessionFactory

1
2
3
4

<bean name="studentInfoDAOImpl" class="com.lee.dao.StudentInfoDAOImpl">
<property name="sessionFactory" ref="sf"></property>
</bean>

HibernateTemplet的增删改查方法底层还是调用session的api实现的,session的获得是通过向dao层注入sessionFactory。

事务

(1)概念

事务是一系列数据库操作,这些操作要么成功,如果失败就全部失败,并回滚到最开始的状态。事务的四个特性:原子性,一致性,持久性,隔离性。

(2)spring声明式事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sf"></property>
</bean>
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut expression="execution(* com.lee.service.*.*(..))" id="serviceMethod"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="serviceMethod"/>
</aop:config>

SSH的配置事务管理是非侵入式的,所谓的非侵入式,就不是需要修改一行java代码,只需要进行applicationContext.xml的配置,即可达到事务管理的效果。

这里面的add*,表示对于这些名词开头的方法,进行事务管理。
这里使用了AOP切面编程的配置手段,让前面配置的事务管理bean,去和业务方法编织在一起。
哪些业务方法呢?

execution(* com.lee.service.*.*(..))

*表示返回任意类型。

com.lee.service.* 包名以com.lee.service 开头的类的任意方法
(..) 任意的参数类型。

这样就达到了对ProductServiceImpl的list()方法,进行事务管理的效果。

(3)编程式事务

通过在类添加@Transaction(propagation=Progatation.REQUIRED,rollbackForClassName(“Exception”))注解实现。
配置文件中要添加

<tx:annotion-driven transaction-manager="treanscationManager"/>

用于进行注解扫描。