框架的概念
- 框架( Framework )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节
- 框架和设计模式
- 框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。构件通常是代码重用,而设计模式是设计重用,框架则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。
- 框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识
- 类比:
买的毛坯房相当于有了个基本骨架(框架),而我们要想入住,还需要进行装修,装修完成后才能入住
不同人装修风格不同:简约风格,田园风格,北欧风格…(相当于业务逻辑),无论怎么装修都要基于这个骨架
JavaEE三层结构中常用的框架
- dao层:负责与数据库交互
JDBC、Mybatis框架(常用)、DBUtils、Spring jdbcTemplate、Hibernate,Spring Data JPA - web层:处理用户的请求和响应
servlet(JavaEE规范其中之一)、SpringMVC框架、struts(不用) - service层:处理业务逻辑,事务管理
SpringAOP、Spring事务管理
SSM框架概念
- SSM框架由三个框架整合而成
Spring框架、Mybatis框架、SpringMVC框架
SSM框架常作为数据源较简单的web项目的框架
Spring框架
概念
- Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
- Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地
new
一个对象,而是让Spring框架帮你来完成这一切。 - Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
IOC概述
- IoC(控制反转): Inverse of Control,是一种设计思想,Spring框架运用这个思想
- 控制的理解
- 以前:应用程序控制着所需要资源(对象,对象中的属性,配置文件,…)例如:应用程序需要某个对象,我们要创建一个类然后通过new来创建
- 现在:Spring框架控制所有资源 例如:Spring管理项目中所需要的资源(对象,配置文件)
- 反转的理解
- 反转前:由应用程序来主动调用所需要资源
- 反转后:由Spring来提供应用程序所需要的资源(应用程序需要什么资源去找Spring要)
- 反转指的是控制权反转:由原先的应用程序控制转变为Spring统一控制着所有资源
- 反转的优点
所有的资源由Spring统一管理,统一调度,使资源控制更加集中,提高资源利用率
现实例子:
反转前:找女盆友,需要我们自己区主动找符合自己心目中理想另一半
反转后:找相亲平台(收集了大量单身男女资料),我们只需要将自己对另一半要求(年龄,身高,学历,…)告诉相亲平台,让相亲平台帮我们推荐
IOC引入
需要的依赖
<!--Spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
配置文件
- 新建一个applicationContext.xml
<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">
<!--
Spring中Bean的配置:Spring中的资源都是以Bean形式的体现的
bean标签
id:Spring资源唯一标识符
class:Spring对应的java类的完全限定名
-->
<bean id="helloService" class="com.myspring.service.HelloService"/>
</beans>
DI概述
- DI(依赖注入):Dependency Injection
- 依赖注入指的是应用程序依赖Spring为其提供运行时所需要的资源,将提供资源(对象,对象中属性值,各种配置…)的过程称为注入
- 控制反转是一种思想,通过依赖注入实现了控制反转思想
Spring的注入方式
- 构造器注入
- setter方法注入
- 数组&集合注入
Spring中的Bean
Bean的作用域范围
<!--
Bean的作用域范围:
Singleton:默认值 单例
Prototype:多例
request:创建一个Bean,将Bean对象放入到Request域中 request.setAttribute(Bean的
id,Bean对象)
session:创建一个Bean,将Bean对象放入到Session域中 session.setAttribute(Bean的
id,Bean对象)
application:创建一个Bean,将Bean对象放入到application(ServletContext)域中
servletContext.setAttribute(Bean的id,Bean对象)
-->
Bean的生命周期
<!--
Bean的生命周期
init-method:绑定初始化方法
destroy-method:绑定销毁方法
如果这个Bean是单例,那么当Spring容器被销毁的时候,Spring中的Bean也被销毁
如果这个Bean是多例(scope="prototype"),那么这个Bean的销毁就交给JVM的GC(垃圾回
收器)来负责销毁
-->
<bean class="com.myspring.service.BeanLifecycleService"
id="beanLifecycleService"
init-method="init"
destroy-method="destroy"/>
Spring中的注解式配置
注解配置与XML配置对比
- XML配置
优点:所有的配置都写在XML配置文件,让配置更加集中,方便统一管理
缺点:如果配置非常多导致XML文件非常长,可读性变差 - 注解配置
实现思想:将XML中的配置转换成各种注解
优点:使XML配置更短,更加简洁
缺点:注解与Java代码高度耦合,而且配置分散到各个类或各个方法或各个接口,导致配置难以统一管理 - 总结:我们在实际开发中可以采用注解+XML配置方式,让两种方式互补
常用注解
实例化相关的注解
@Component:将某个类进行实例化,然后放入Spring容器
通过@Component的value属性值指定Bean的id,如果没有指定value值,默认使用类名的首字母小写作为Bean的id
- 控制层的实例化就用@Controller
- 业务层的实例化就用@Service
- 数据访问层的实例化就用@Repository
以上三个注解都是由 @Component演变来的,本质上仅仅是注解名称的变化,用法和功能与@Component相同
注入属性值的相关注解
@Value:注入基本类型和String类型的值,类似与配置文件中的value属性
例如:@value(“123”) @value(“abc”)
@Autowired:注入引用类型(Spring中其它Bean类型)
默认按照类型去装配(匹配Bean+注入)
1.如果注入的属性是类类型
@Autowired
private UserDaoImpl userDaoImpl;
如果类只有一个,注入成功
如果不同包下出现同名类,此时注入失败
***2.如果注入的属性是接口类型
a.如果接口只有一个实现类,注入成功
b.如果不存在接口的实现类,注入失败
**c.接口的实现类有多个,Spring不知道该用哪个类注入,导致注入失败
解决方案:
通过@Qualifier来通过Bean的id指定使用哪一个实现类的对象注入
3.@resuorce:注入引用类型
@Resource默认按照Bean的id去装配,如果找到Bean注入成功,找不到再按照类型去匹配,如果匹配多个类型,通过name属性指定注入哪个Bean
@Autowired是Spring提供的注解
@Resource是JDK提供的注解
AOP思想
概述
- 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
- AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
- 研究同一层面(Dao层、service层)不同方法之间的共性行为的思想称为AOP思想=>切面编程
- 我们想要实现AOP思想要使用动态代理技术实现
Spring操作DAO层的技术
Spring也为我们提供了DAO层操作的支持,其实就是将其它操作数据库的技术(例如:JDBC)融合到Spring中来,对这些技术进一步封装
我们在开发过程中可以直接调用模板来进行操作数据库
- JdbcTemplate:通过JDBC操作关系(全部由表结构构成)型数据库
- HibernateTemplate:通过Hibernate的API去操作数据库
- RedisTemplate:redis是一种非关系型数据库(key-value),可以通过RedisTemplate操作Redis
- JmsTemplate:操作消息队列的,例如:RabbitMQ
事务操作的注解配置
@Transactional:
定义在方法上:将该方法加入事务管理
定义在类上:将该类所有的方法加入事务管理
定义在接口:将该接口所有的实现类加入事务管理
Mybatis框架
ORM概述
对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化 。
利用ORM技术实现了对象持久化
Mybatis框架概述
- Mybatis是一个持久层的框架,Mybatis框架和关系型(表)数据进行交互,将数据持久化到数据库中
- Mybatis是一种半自动化(我们依然需要写SQL,但是Mybatis也帮我们完成了一些数据的封装)ORM映射框架
- SQL语句可以控制,后期可以对SQL语句进行优化,Mybatis框架使我们更侧重于SQL语句的编写,其他工作(注册驱动,创建数据库连接,封装参数…)都交给Mybatis框架完成
Mybatis框架的引入
<-- Mybatis相关依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--连接mysql数据库需要的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
使用Mybatis框架的优点
- Mybatis中在sqlMapConfig.xml(全局配置文件)中配置数据库连接池,交给连接池管理连接
- Mybatis将java代码与SQL语句进行分离,SQL语句统一配置在mapper.xml映射文件,实现统一管理SQL语句
- Mybatis通过动态SQL来解决不同的拼接条件问题,在mapper.xml映射配置文件中,只需要配置parameterType输入类型映射,即可让Mybatis底层自动设置参数值
- Mybatis在mapper.xml映射配置文件中对每个statement配置了resultType,可以让Mybatis按照结果集类型自动封装
Mybatis开发DAO层理解
- 需要定义DAO接口(约束,规范)以及DAO实现类
- 名词术语:
- PO(Persistent Object):持久化对象,一个PO对象对应表中一条数据,符合ORM映射,也就是一个Java实体类
- VO(Value Object):值对象,用来封装View层传递的过来参数或者封装页面展示的参数
Mapper代理开发概述
- Mybatis框架可以利用动态代理技术自动生成接口的代理类和代理对象
- 需要在mapper映射文件中将命名空间指定成对应的接口名,这样就实现了接口和映射文件进行绑定,当使用接口中的方法的时候就会找对应得mapper映射文件中的配置
- 接口中的方法名必须是映射文件中的statement id,实现接口中的方法和statement绑定,将来调用方法的时候,就知道找那个statement,去执行statement中sql语句
小结:也就是我们在调用SQL语句的时候,要指定号mapper文件的名称作为接口名,SQL语句的id作为方法名,这样才能对应起来,底层才会生成对应的代理类
代码展示
ProductMapper.xml:
<mapper namespace="com.mybatis.mapper.ProductMapper">
<!--id值和dao接口中的方法名保持一致-->
<select id="selectByPid" parameterType="int"
resultType="com.mybatis.po.Product">
SELECT * FROM mybatis.product WHERE pid=#{pid}
</select>
</mapper>
对应的dao接口
public interface ProductMapper {
/*
* @param pid 商品编号
* @return 查询到商品信息
*/
Product selectByPid(int pid);
}
动态SQL语句
if标签和where标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace属性:代表命名空间,区分相同的id的sql语句
-->
<mapper namespace="com.mybatis.mapper.StudentMapper">
<select id="seletcConditionByPid" parameterType="QuryVO" resultType="Student">
SELECT * FROM mybatis.students
<!--
if标签用于判空
test属性:里面指定一个布尔表达式
如果不为空的时候才拼接sql
where标签:
替代where关键字,还可以自动把第一个条件中的and去除
-->
<where>
<if test="student!=null">
<if test="student.sgander!=null and student.sgander!=''">
AND sgander = #{student.sgander}
</if>
<if test="student.sname!=null and student.sname!=''">
AND snameLIKE '%${student.sname}%'
</if>
</if>
</where>
</select>
</mapper>
foreach标签
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace属性:代表命名空间,区分相同的id的sql语句
-->
<mapper namespace="com.mybatis.mapper.StudentMapper">
<select id="seletcConditionByPid" parameterType="QuryVO" resultType="Student">
SELECT * FROM mybatis.students
<!--
foreach标签:遍历集合中的元素
collection属性:遍历的目标集合
item属性:存储每次遍历元素的变量
open属性:开始循环前拼接的sql语句
close属性:循环结束后拼接的sql语句
separator属性:遍历的元素与元素之间的分隔符
-->
<where>
<if test="sons!=null and sons.size()>0">
son in
<foreach collection="sons" item="son" open="(" close=")" separator=",">
#{son}
</foreach>
</if>
</where>
</select>
</mapper>
SQL片段重用
<mapper>
<sql id="where_condition">
<if test="student!=null">
<if test="student.sno!=0">
AND sno = #{student.sno}
</if>
<if test="student.sname!=null and student.sname!=''">
AND sname LIKE '%${student.sname}%'
</if>
<if test="student.sgender!=null and student.sgender!=''">
AND sgender = #{student.sgender}
</if>
<if test="student.sbirthday!=null">
AND sbirthday= #{student.sbirthday}
</if>
</if>
</sql>
<select id="selectCount" parameterType="QueryVO" resultType="int">
SELECT count(*) FROM mybatis.student
<where>
<!--
include标签:可以用来包含sql片段
refid:指定sql片段的id
-->
<include refid="where_condition"/>
</where>
</select>
</mapper>
Mybatis缓存
- 缓存概述
首次通过SQL语句访问数据时候,会将查询的结果集缓存到内存或硬盘上,第二次开始以后每次如果查询相同的数据,就不再与数据库交互
目的:为了减少与数据库的交互,提高访问效率 - 一级缓存:SqlSession级别的缓存
每个SqlSession对应一个一级缓存,因此一级缓存之间相互独立
如果销毁/关闭其中一个SqlSession,对应的一级缓存也会被销毁,但是其他的SqlSession对象的一级缓存依然存在 - 二级缓存:Mapper(nameSpace)级别的缓存
由于不同的SqlSession对象可以操作同一个Mapper(对应同一个namespace)下的sql语句,那么不同的SqlSession对象可以操作同一块
如果SqlSession对象被销毁,二级缓存依然存在 - 一级缓存原理
- 二级缓存原理
Mybatis逆向工程
新建一个mybatis-generator的maven工程
在resource目录下引入generatorConfig.xml
使用mybatis逆向生成对应的类和配置类
- 点击这个逆向生成
- 目录如下
SpringMVC框架
SpringMVC,MVC,JavaEE三层架构关系
- JavaEE三层架构:
- web:负责接收用户的请求以及向客户端响应数据
- service:存放业务逻辑相关的代码
- dao:负责数据库的访问
- MVC设计模式:
- C(Controller):负责接收用户的请求,委托相应的模型去处理数据,委派相应的view 去展示数据
- M(Model):数据模型(service+dao+model)
- V(View):负责数据展示 例如:JSP页面
- 各层之间的执行顺序
View(页面)<---->Controller(控制层)<---->Service(业务层)<—>DAO(数据访问层)<---->Database - Mybatis:应用在Dao层
- Spring:横跨所有层 例如:在Service可以用Spring的AOP和事务管理,在Dao层可以用Spring jdbcTemplate
注
: SpringMVC:应用在web层(View+Controller),负责接收用户的请求以及向客户端响应数据
SpringMVC概述
- Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称(spring-webmvc),但它通常被称为“ Spring MVC”。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。 - Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。
执行原理(流程)
引入/使用SpringMVC
相关依赖
<!--引入依赖-->
<dependencies>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--JSP依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
- DispatcherServlet本质上就是一个Servlet,符合Servlet特性,从浏览器发出的请求最终交给doDispatch()处理
SpringMVC注解式开发
@RequestMapping注解
- 常用属性:
path(value)属性:可以绑定一个或多个url到同一个handler上
method属性:通过method属性限定Handler处理的请求方式,例如:如果指定为POST,那么这个Handler只处理POST请求,不处理GET请求
@GetMapping("/list.do"):等效于@RequestMapping(path="/list.do",method = RequestMethod.GET)
@PostMapping("/list.do"):等效于@RequestMapping(path="/list.do",method = RequestMethod.POST)
- 窄化请求映射
为了避免不同的Controller中的url映射冲突,我们一般在类上加上@RequestMapping指定一个根路径最终的访问路径 类上配置的路径+方法上的路径
窄化i请求映射类似命名空间的思想
Handler中方法的返回值类型
返回值类型为ModelAndView
- 通过ModelAndView对象可以这是视图名称也可以设置业务数据
返回值类型为void(不推荐)
- 一旦返回void类型,类似原始servlet开发方式
返回值类型为String类型(推荐)
- 返回一个视图
@Controller
@RequestMapping("/order")
public class OrderController {
/*直接转发到orderList.jsp*/
@RequestMapping("/list02.do")
public String list02() {
return "orderList";
}
}
- 返回转发字符串
@Controller
@RequestMapping("/order")
public class OrderController {
@RequestMapping("/update02.do")
public String update02(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("更新数据库的订单信息");
return "forward:list.do";
}
}
- 返回重定向字符串
@Controller
@RequestMapping("/order")
public class OrderController {
@RequestMapping("/update02.do")
public String update02(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("更新数据库的订单信息");
return "redirect:list.do";
}
}
SpringMVC处理JSON数据
概述
我们日常开发中经常选用轻量级的json作为数据的请求和响应的格式
SpringMVC提供两个注解来完成JSON数据的请求和JSON数据响应:
@RequestBody:将客户端请求过来的json数据直接转换成java对象
@ResponseBody:将java对象转换成JSON数据格式去响应给客户端
相关依赖
<!--引入依赖-->
<dependencies>
<!--处理json数据相关依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
</dependencies>
SpringMVC实现RESTful的编程风格
RESTful架构设计风格的概述
- RESTful:Representational State Transfer (表现层状态转换),指的是资源的表现层状态转换
- 1.资源:
资源指的是互联网上的资源,例如有:图片、视频、文本、某个服务等
我们可以为每个资源绑定一个URI(统一资源定位符),通过URI获取资源
例如:下载王者、下载微信,这俩个都绑定着对应的下载地址,这个下载地址就可以称为URI -
- 表现层:
资源是一种数据载体,可以有很多表现形式,我们把资源具体呈现出来的形式叫做表现层
例如:
文本表现形式:.txt,.html,.json,.xml,.vue,…
图片表现方式:.jpg,.png,.bmp等待都是图片格式
- 表现层:
- 3.状态转换
客户端通过操作服务器,使服务器状态发生转换。而这种转换建立在表现层(资源的某种表现形式)上的,所以称作表现层状态转换。
HTTP协议里面,规定四个操作方式的动词:GET POST PUT DELETE
READ GET:获取资源
CREATE POST:新建资源
UPDATE PUT:更新资源
DELETE DELETE :删除资源 - 4.RESTful编程风格
- 1.资源:
功能 旧的风格 RESTful风格
根据id查询用户 GET /user/findById?id=3 GET /user/3
保存一个用户 POST /user/save(请求体携带参数) POST /user (请求体中携带参数)
根据id更新一个用户 POST /user/update(请求体中携带参数) PUT /user (请求体中携带参数)
根据id删除用户 GET /user/delete?id=3 DELETE /user/3
SpringMVC实现文件上传
- 1.引入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
- 2.配置multipart解析器
- 3.编写upload.jsp页面
- 4.新建UploadCOntroller
SSM(Spring+Mybatis+SpringMVC)整合
引入相关框架依赖
<dependencies>
<!--引入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!--数据源(连接池)-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!--Spring相关的依赖-->
<!--Spring的核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--事务相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--aop切面相关-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--Spring5+Junit5结合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
<!--Spring整合Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!--SpringMVC相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!--JSTL标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--log4j2依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.1</version>
</dependency>
</dependencies>
- 引入mybatis逆向工程插件
- 引入generatorConfig.xml文件
- mybatis逆向生成PO,Mapper接口和Mapper映射文件
- Spring整合mybatis(DAO层)
- Spring整合service层(Spring AOP+Spring 事务管理)
- Spring整合SpringMVC(web层)