一、基础环境
1、Windows10、Java17、Maven3.8.8、Tomcat9.0.76、IDEA2022.3.3
2、已通过配置文件的方式实现SSH集成
二、框架版本
struts2:2.5.31
spring:5.3.27
hibernate:5.6.15.Final
三、对持久化的类使用Hibernate注解实现ORM映射并进行配置
使用注解定义bean:通过注解形式将bean以及相应的属性值放入ioc容器。
1、对持久化类使用注解实现orm映射
完成注解添加后即可删除employee.hbm.xml实体类映射文件。
@Entity注解:
@Entity注解和@Table注解都是Java Persistence API中定义的一种注解。
@Entity说明这个class是实体类,并且使用默认的orm规则,即class类名就是数据库中表名,class属性名即表中字段名。@Entity注解指明这是一个实体Bean。
- @Entity注解表示该类是个实体类,在项目启动时会根据该类自动生成一张表,表的名称即@Entity注解中name的值,如果不配置name,默认表名为类名。
- 所有的实体类都要有主键,@Id注解表示该属性是一个主键,@GeneratedValue注解表示主键自动生成,strategy则表示主键的生成策略。
- 默认情况下,生成的表中字段的名称就是实体类中属性的名称,通过@Column注解可以定制生成的字段属性,name表示该属性对应的数据表中字段的名称,nullable表示该字段非空。
- @Transient注解表示在生成数据库中的表时,该属性被忽略,即不生成对应的字段。
@Table注解:
@Table注解默认情况下只会完成表和实体之间的映射,声明该对象映射到数据库的数据表,通过它可以为实体指定表(table)。
- 常用属性:name 指定表
- @Table(name = "book")
@Table注解是一个非必须的注解,@Table注解指定了Entity所要映射的数据库表,其中@Table.name()用来指定映射表的表名。
如果同时使用了@Entity(name="student")和@Table(name="book"),最终对应的表名是book,这说明优先级:@Table>@Entity。
2、配置spring配置文件,注释掉先前配置的实体类映射文件配置,添加扫描实体类注解的配置
添加扫描实体类注解:
<!-- 到指定的包中扫描带有hibernate注解的实体类,并形成orm关系映射 -->
<property name="packagesToScan" value="demo.employee.entity" />
四、改造DAO层,使用注解的方式简化配置文件
1、在实现类中使用@Repository注解
@Repository注解:
- @Repository是属于Spring的注解,用来表示一个持久层bean,即数据访问层DAO组件。
- @Repository是@Component注解的一个派生品,用以在类上实例化bean,并把当前类对象的实现类交给Spring容器进行管理。
- @Repository作为Spring的注解,他还能把所标注的类中抛出的数据访问异常封装为Spring的数据访问异常类型。
2、使用构造方法在实现类中注入sessionFactory
@autowired 注解:
@Autowired将被注解的对象或者类自动装配(注入)到当前类中。
3、配置Spring配置文件,注释掉bean注入到Spring容器的配置(含sessionFactory注入到dao中的配置)
五、改造业务层
1、在业务层实现类中使用@Service注解
@Service注解:
- @Service注解用于类上,标记当前类是一个service类。
- @Service注解会将当前类自动注入到Spring容器中,不需要再在applicationContext.xml文件定义bean。
2、在业务层实现类中使用@Autowired注解
使用@Autowired注解自动注入employeeDao对象方式后,将原手动注入的方式注释掉。
3、配置Spring配置文件,注释掉bean注入到Spring容器的配置(含dao注入到service中的配置)
4、开启关于Spring注解的扫描
<!-- 为了使得service层以及dao层的注解能起作用,需要开启关于Spring注解的扫描 -->
<context:component-scan base-package="demo.employee" />
六、改造Action
1、在Action中使用@Controller注解和@Scope注解
@Controller注解:
- @Controller注解用于类上,标记当前类是一个Controller层。
- @Controller注解会将当前类自动注入到Spring容器中,不需要再在applicationContext.xml文件定义bean。即@Controller注解负责注册一个bean到spring上下文中,bean的ID默认为类名称开头字母小写,也可以自己指定。
@Scope注解:
- @Scope注解是Spring IOC容器中的一个作用域,在Spring IOC容器中,他用来配置Bean实例的作用域对象。
- @Scope 具有以下几种作用域:
singleton:单实例的(单例)(默认)——全局有且仅有一个实例
prototype:多实例的(多例)——每次获取Bean的时候会有一个新的实例
reqeust:同一次请求——request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:同一个会话级别——session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
2、在Action中使用@Autowired注解
3、配置Spring配置文件,注释掉bean注入到Spring容器的配置(含service注入到action中的配置)
七、使用注解简化事务管理规则及AOP
1、配置Spring配置文件,开启关于事务管理规则注解的扫描
<!-- 开启关于事务管理规则注解的扫描 -->
<tx:annotation-driven transaction-manager="transactionManager" />
2、注释掉手动配置的事务管理规则和手动配置的AOP
3、找到相关service的实现类加上关于事务管理的注解@Transactional
@Transactional注解:
- 声明式事务有两种方式:一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional注解的方式。
- 使用@Transactional注解的类或者方法表示该类里面的所有方法或者这个方法的事务由spring处理,来保证事务的原子性,即是方法里面对数据库操作,如果失败则spring负责回滚操作,成功则提交操作。
- @Transactional注解可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
- @Transactional注解应该只被应用到public方法上,如果你在protected、private或者默认可见性的方法上使用@Transactional注解,这将被忽略,也不会抛出任何异常。
八、测试service层方法
九、启动项目测试查询、添加
省略。
附1、框架搭建总结
实现思路:
1、添加3个框架所需要的依赖(或者JAR文件)
2、在Spring中配置数据源对象和会话工厂
3、实现并配置DAO
4、实现并配置Service
5、为业务层添加事务管理
6、实现并配置Action
7、创建JSP测试页面