项目结构与数据库设计
- 项目结构
- 数据库设计
注意:员工的所属部门属性是部门属性的外键,要会写:
alter table staff add constraint foreign key(did) references department(id);
项目搭建
1.先创建一个maven类无模板的父moudle 因为父moudle中无代码,所以删除src文件夹。
2.在父moudle中创建两个子moudle
3.在sm_service中引入依赖。Mybatis依赖和spring依赖,以及事务依赖
- mybatis依赖
mysql-connector-java、mybatis - spring依赖
spring-core、spring-beans、spring-context、spring-aop、aspectjweaver - 事务依赖
spring-jdbc、spring-tx、mybatis-spring
4.在sm_web中引入依赖
- 引入sm_service依赖
- 引入javax.servlet-api、jstl
5.在sm_web创建具体的包
由于maven生成的文件中,没有java包,所以在main中新建一个文件夹并设置为resource文件夹.
在java中创建com.imooc.sm包下,分别创建controller(用于放置处理页面请求类)和global(用于放置过滤器类)将素材放置在webapp文件夹中,
在sm_service创建具体的包
在java中创建com.imooc.sm包下,创建service(业务层)、dao(持久层)、entity(实体类)
spring全局配置
- spring整合mybatis
- 将spring.xml引入到sm_service的resources文件夹中,在spring.xml中,将 sqlsessionfactory和持久化操作对象交给spring进行管理。
<!--spring整合mybatis--> <!--数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/sm?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!--session工厂 --> <!--typeAliasesPackage 可以简化名称生成别名--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.imooc.sm.entity"/> </bean> <!--持久化对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.imooc.sm.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
声明式事务
有三个部分:(1)事务管理器(2)通知(3)植入<!--声明式事务--> <!--事务管理器--> <bean id="transcationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--通知--> <tx:advice id="txAdvice" transaction-manager="transcationManager"> <!--将get.find.search方法全部设置为只读。然后其他方法事务都为required,有事务时使用当前事务,无事务创建一个事务--> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="search*" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--植入--> <aop:config> <!--任意返回值 com.imooc.sm.service.任意包下的.任意方法(任意输入值)--> <aop:pointcut id="txPointcut" expression="execution(* com.imooc.sm.service.*.*(..))"/> <!--将通知和植入关联起来--> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config>
全局扫描
<!--自动扫描--> <context:component-scan base-package="com.imooc.sm"/> <aop:aspectj-autoproxy/>