近日学习了SSM框架,并使用牛客网上的项目实战练了练手,为了方便日后学习,所以将SSM整合流程整理如下:
整体流程
编写实体类
注意事项:构造函数,get,set方法等,使用IDEA自带的generator选项生成
DAO层
编写Dao类
注意,要在dao类上方加入@Component注解。dao类的实现要写成接口类,贴合编程规范。
Spring整合Mybatis:
配置全局:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键的值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
编写Mapper文件:
id为dao函数名称,<insert></insert>
为插入类型操作,同理还有<select></select>
,<update></update>
操作,resultType为返回类型。
<insert id="insertAppointment"></insert>
<select id="queryAll" resultType="Book"></select>
Service层
编写Service类
编写Service类的接口,然后建同级包impl(编程规范),一定要注意要在web类上加上@Service注解。
编写Service配置文件
编写Aop类
Aop可以对Service层方法进行增强,即在基础功能的基础上,增加新的功能。
public class TransactionManagerImpl{
//确定切面类,连接点等
//第一个*代表,impl下的所有类
//第二个*代表,每个类中的所有方法
//(..)通配任何传入参数类型
@Pointcut("execution(* com.ykc.service.impl.*.*(..))")
public void pointCut(){}
// @Before("pointCut()")
public void before() {
System.out.println("前置通知");
}
// @AfterReturning("pointCut()")
public void afterReturning(){
System.out.println("后置通知");
}
// @AfterThrowing("pointCut()")
public void afterThrowing(){
System.out.println("异常通知");
}
// @After("pointCut()")
public void after(){
System.out.println("最终通知");
}
@Around("pointCut()")
public Object aroundPrintLog(ProceedingJoinPoint pjp){
//pjp即当前拦截的切点即方法
//ProceedingJoinPoint仅用在环绕通知中
Object rtValue = null;
try{
Object[] args=pjp.getArgs();//获取方法执行所需要的参数,即获取方法输入的参数
before();
rtValue=pjp.proceed(args);//执行切点方法并返回输出值
// System.out.println(args[0]+","+args[1]);
// System.out.println(rtValue);
afterReturning();
return rtValue;
}catch (Throwable e){
afterThrowing();
throw new RuntimeException(e);
}finally {
after();
}
}
}
Web层(Controller层)
编写web类
编写web类,一定要注意要在web类上加上@Controller注解。
整合Spring与SpringMVC
web类测试
使用MockMvc,进行测试,可以避开编写前端代码,实现快速测试。
@RunWith(SpringJUnit4ClassRunner.class)
//配置事务回滚
@TransactionConfiguration(transactionManager = "transactionManager",defaultRollback = true)
@Transactional
public class BookControllerTest extends AbstractContextControllerTests{
private MockMvc mockMvc;
private String listUrl="/book/list";
private String detailUrl="/book/{bookId}/detail";
private String appointUrl="/book/{bookId}/appoint";
private long bookId = 1000;
@Before
public void setup(){
this.mockMvc=webAppContextSetup(this.wac).alwaysExpect(status().isOk()).alwaysDo(print()).build();
}
@Test
//测试dao.getAllBook()
public void list() throws Exception {
this.mockMvc.perform(get(listUrl)).andExpect(view().name("list"));
}
@Test
public void existDetail() throws Exception {
this.mockMvc.perform(get(detailUrl,bookId)).andExpect(view().name("detail"))
.andExpect(model().attributeExists("book"));
}
@Test
public void notExistDetail() throws Exception{
this.mockMvc.perform(get(detailUrl,1100)).andExpect(forwardedUrl("/book/list"));
}
@Test
public void appointTest() throws Exception{
this.mockMvc.perform(post(appointUrl,bookId).param("studentId","1").accept(MediaType.APPLICATION_JSON))
.andExpect(content().contentType("application/json;charset=utf-8"));
}
}