SSM框架知识简单整合
1、基本概念
SSM(SpringMVC+Spring+MyBatis)初步的整合
SpringMVC:MVC的解耦
Spring:IOC,AOP
MyBaits:ORM (MyBaits不是ORM框架)
1.1、Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2、SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
1.3、MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1.4、3者是一个完美的结合体,但是整合的时候有点啰嗦,不过不影响写代码。
为了简化这个整合的复杂过程,有3种办法。
1、 多练(推荐)【效果:自由切换,不需要看任何笔记】
2、 复制粘贴
3、 可以采用Spring boot 【近年来有上升的趋势】
2、前端:MVVM
现阶段:SSH(Struts2+Spring+Hibernate)以SSM(SpringMVC+Spring+MyBatis)为主
一、创建项目(小公司有可能不划分module,甚至不使用maven,直接Eclipse)
1.通过maven创建一个根层项目(root),名字myweb01,把根层src目录删除。
2.创建5个module
entity,dao,service,action (打成jar包 默认就是)
web-view(放前端页面以及打成war包,依赖上面4个模块,最后war文件是交付给客户),把src删除
3.添加module之间的依赖
daoà entity (因为代码有关联)
serviceàdao, entity(因为代码有关联)
actionà service,entity(因为代码有关联)
web-viewà entity,dao,service,action(因为打包需要,跟代码没有联系)
4.配置web-view打成war包
在POM.XML中添加
<packaging>war</packaging>
建立2个目录:webapp/WEB-INF
Resources
把web.xml文件复制到webapp/WEB-INF下
在POM.XML中添加
<build>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webResources>
<resource>
<directory>webapp</directory>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
二、配置Maven第三方依赖包
Spring |
beans,context,core |
在根层POM.xml |
SpringMVC |
web, webmvc |
在web-view下POM.xml |
3个jackson或FastJSON(在根层下POM.xml) |
||
Java web(JSP) |
JSTL(在根层下POM.xml) |
|
MyBatis |
mybatis |
在根层下POM.xml |
mybatis-spring (融合的核心) |
||
c3p0、spring-jdbc (支持者) |
||
Spring-tx(@Transactional要用) |
||
log4j(非必需) |
slf4j、log4j |
在根层下POM.xml |
其它 |
mysql-connector-java |
在根层下POM.xml |
Junit |
在根层下POM.xml |
三、配置SSM
1、 配置jdbc.properties
在war包中module(web-view-module)的resources目录,添加jdbc.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/batis?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=123456
2、 配置Spring的配置文件applicationContext.xml(包含融入mybatis相关内容)
在war包中module(web-view-module)的resources目录,添加applicationContext.xml
- 配置自动扫描<context:component-scan>
- 配置引入jdbc.properties文件(context:property-placeholder)
- 配置c3p0的DataSource(数据库连接)
- 配置sqlSessionFactory
- 配置MapperScannerConfigurer
- 配置transactionManager
- 配置<tx:annotation-driven>实现使用注解来执行事务
补充说明:在老项目中,可能见到aop的方式处理事务,这种方法已经不流行。但大家还是要看懂。
3、 配置SpringMVC的配置文件springmvc.xml
在war包中module(web-view-module)的resources目录,添加springmvc.xml
a. 配置自动扫描包<context:component-scan>
添加一个
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
否则@Transactional不会回滚
b. 配置注解驱动<mvc:annotation-driven> (@ResponseBody需要用上)
默认使用jackson
c. 配置试图解释器<bean class=”… InternalResourceViewResolver”>
4、 配置web容器一启动,就启动SpringMVC
在web.xml添加1个Servelt(DispatcherServlet,关联上springmvc.xml)
启动tomcat可以见到这一句话:
initServletBean FrameworkServlet 'springmvc': initialization started
5、 配置web容器一启动, 就启动Spring。
- 配置<context-param>contextConfigLocation定义applicationContext.xml
- 配置一个ContextLoaderListener(就是WebApplicationContext)
四、编码
- 编写实体类(entity)
- 实体类的属性要跟数据库表的字段要一一对应。(详细的对应在Mapper.xml描述)
- 一对多的关系(主实体类中要定义从表实体的List)
private List<Book> bookList = new ArrayList();
一对一的关系(主实体类中定义一个从表的属性)
private Notebook notebook;
- 编写Dao层的类(dao),此层只做数据库读和写,不参与任何的业务逻辑
- 根据实体类的名字,写一个接口(interface)StudentMapper,记录有多少个操作数据库的方法,例如getAll…,getXxxById,getXxxByName,queryXxxFor..,非常注意返回的类型到底是1个实体,还是多个实体
- 编写XxxMapper.xml
1、注意:<mapper namespace="com.nf.dao.StudentMapper">
2、<resultMap id="accountMap" type="com.nf.entity.Account">
<id property="id" column="id"></id>
<result property="userName"column="user_name"></result>
<result property="password" column="password"></result>
<result property="cardNo" column="card_no"></result>
<result property="balance" column="balance"></result>
<result property="validDate" column="valid_date"></result>
</resultMap>
这个namespace就是上一步的接口
在mapper文件中,每一个id项,就是对应接口的方法名
特别说明:Dao层实现是不需要手动写代码,12.4章中的mybatis-spring中的.MapperScannerConfigurer会自动读取XxxMapper.xml和对应的接口(interface),在内存中自动创建一个实现类,并且new一个实例,放在ioc容器中,等待service的@Autowired接收。
- 编写Service层代码
- 新建一个接口(interface),例如:StudentService,定义好各个方法(根据需求)。
- 新建一个接口的实现类StudentServiceImpl,实现接口所有的方法。注意,还需要在StudentServiceImpl实现类中写一个注解@Service,把这个组件申明托管在ioc容器中。
- 而且每个包含事务的方法,前面要添加一个@Transactional
- 在Service实现类,如果要取数据库数据,绝对不能直接访问数据库,只可以调用dao层来间接访问。2行代码。声明一个dao层的实例
private StudentMapper studentMapper;
第2行@Autowired
- 编写Action层代码
- 此层不用写接口,直接创建一个普通的java类,不用继承任何东西(struts的Action要继承ActionSupport),显得SpringMVC简单很多,就是一个普普通通的java类。
- 在Action前添加一个注解@Controller
- 编写我们响应方法
(方法1:返回jsp界面,方法返回类型是String,return jsp文件名)
(方法2:返回JSON数据,没有界面,添加一个@ResponseBody注解)
5.如果前后端分离,开始前端。