一、知识储备
ssm整合是以spring为基础去整合spring Mvc和mybatis,又因为spring Mvc是spring家族中的一员,所以重点和难点是关于spring和mybatis和以及spring mvc和mybatis中的整合。本次整合使用注解+xml的方式。
1.1 spring担任的角色
超级管理,工作主要就是管理mvc和mybatis,涉及的MVC模型是service和dao,其利用控制反转(IOC/DI)和面向切面的思想(AOP),核心是Bean工厂(Bean Factory)来构造我们需要的Model。IOC/DI是把dao依赖注入给service层,service反转给Controller层,spring的顶级容器是BenaFactory。AOP是运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程,是OOP的补充。比如Aspect。
1.2 springmvc担任的角色
页面管理员,是ssm中的基础性框架,前端发送请求到DispacherServlet(前端控制器),由DispacherServlet控制器查询HanderMapping(处理器映射器),找到处理请求的Controller,Controller调用业务逻辑处理后,返回ModelAndView(控制器层写的代码),DispacherSerclet查询InternalResourceViewResolver(视图解析器的具体实现),找到ModelAndView指定的视图,视图负责将结果显示到客户端。
1.3 mybatis担任的角色
数据库管理员,工作在持久层。mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。 属于orm持久层框架,将业务实体与数据表联合起来,实现数据库的增删改查。
二、单个技术点
2.1 spring
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="" class=""></bean>
<!--把用工厂的bean.properties创建对象交给bean来管理 一个id对应它的service和dao的实现类-->
</beans>
1.1创建bena的三种方式
a:使用默认构造函数创建
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,注意:此时如果类中没有默认构造函数,则对象无法创建。
<bean id="accountService" class="com.springioc.service.AccountImpl">
b: 使用普通工厂的普通方法创建对象
<bean id="accountService" class="com.springioc.service.AccountImpl"></bean> <bean id="saveAccount" factory-bean="accountService" factory-method="saveAccount"></bean>
c:使用工厂中的静态方法创建对象,
<bean id="saveAccount" class="com.springioc.service.AccountImpl" factory-method="aspectOf"></bean>
1.2bean对象的作用范围,给bean标签加scope属性
a: singleton:是单例,也是默认值。
b: prototype:是多例。
c: request:作用于web应用的请求范围
d: session:作用于web应用的会话氛围
e: global-session:作用于集群环境的会话范围(全局会话),非集群就是session
1.3bean对象的生命周期
a: 单例对象
出生:当容器创建对象出生。init-method
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡。destory-method
总结:单例对象的生命周期和容器相同。
b: 多例对象
出生:当我们使用对象的时候,spring为我们创建。
活着:对象只要是在使用过程就一直活着。
死亡:当对象长时间不用且没有别的对象引用,就java的GC回收期回收
1.4依赖注入的三类数据和三种方式
三种类型
1、基本类型和string
构造函数或者set注入的方式其属性:value或者ref
2、其他bean类型(在配置文件中或者注解中配置过的bena)
构造函数或者set注入的方式其属性:value或者ref
3、复杂\集合
String[]: 使用set的时候,需要在property内写array子标签,然后进value子标签赋值。
三种方式
1、构造函数
在类中书写是哪个构造函数的传值,在配置中的bean内部写上constructor-arg标签,同时constructor-arg拥有五个属性,其是3+2模式,3是指定给构造函数中哪个参数赋值。2是给其赋具体的值。所以,3中常用的是name,2中的value常用基本类型和string。ref引用其他的bean类型
他的优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
他的弊端:改变了bean对象的实例化方式,使我们创建对象时,如果不用这些数据,也必须提供。实际开发以set居多
2、set方法
在类中书写set方式,在配置中的bean内部写上property标签。拥有三个属性,其为1+2模式。
优势:创建对象的时候,没有明确的限制,可以直接使用默认构造函数。
弊端:如果有某个成员必须有值,则获取对象的时候set方法无法保证。
3、注解提供
2.2 springmvc
2.3 mybatis
三、整合之路
3.0 pom以及数据库
创建数据库
CREATE TABLE `account` (
`ID` int(11) NOT NULL COMMENT '编号',
`UID` int(11) default NULL COMMENT '用户编号',
`MONEY` double default NULL COMMENT '金额',
PRIMARY KEY (`ID`),
KEY `FK_Reference_8` (`UID`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
导入pom依赖的坐标:分为spring类别、mybatis类别、springmvc类别、连接池类别、测试类别、web类别。
3.0.1 spring类别
spring-context、spring-aop、spring-tx、aspectjweaver
3.0.2 springmvc类别
spring-webmvc、spring-web
3.0.3 mybatis类别
mybatis、spring-mybatis
3.0.4 连接池类别
c3p0、slf4j-log4j12、mysql-connector-java、spring-jdbc
3.0.5 测试类别
junit、log4j、spring-test
3.0.6 web类别
jstl、jsp-api、servlet-api
3.1 搭建spring的开发环境并spring调试通过
3.1.1目录结构
并且在domain下编写数据库字段对应的javabean。
3.1.2 在service层代码编写
接口:
import cn.com.dao.Account;
import java.util.List;
public interface AccountSerivce {
public List<Account> findall();
public void saveAccount(Account account);
}
实现类
package cn.com.service;
import cn.com.dao.Account;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("AccountService")
public class AccountServiceimpl implements AccountSerivce {
@Override
public List<Account> findall() {
System.out.println("service.....findall执行");
return null;
}
@Override
public void saveAccount(Account account) {
System.out.println("service....."