Spring
一个轻量级开源的java框架,是一个管理项目中对象的容器,同时也是其他框架的粘合器,目的就是对项目进行解耦。
类上加的注解
@Component
当一个类不好归纳时。定义为普通组件
@Controller
定义一个类为控制层组件
@Service
定义一个类为业务层组件
@Repository
定义一个类为持久层组件
AOP
Aspect Oriented Propramming 面向切面编程AOP
AOP不是OOP和POP的替代,而是增强、拓展和延伸。
AOP就是将不同位置中重复出现的一些事情拦截到一处进行统一处理。
MVC
MVC设计思想并不是某个语言特有的设计思想,而是一种通用的模式。
是将一个应用分为三个组成部分:Model模型,View视图,Controller控制器
这样会降低系统耦合性,提高它的可扩展性和维护性。
SpringMVC
SpringMVC可以替换Servlet,SpringMVC是Spring框架中位于Web开发中的一个模块,是Spring基于MVC设计模式设计的轻量级Web框架。
原理:配置SpringMVC中的DispatcherServlet,将其映射设置为/或*.do。
如果是/表示一切请求先经过它,如果是*.do表示以.do结尾的请求先经过它,
它对该请求进行解析,指定某个Controller中的某个方法,这些方法通常返回一个字符串,
这个字符串是一个页面的名称,再通过视图解析器,将该字符串解析为某个视图的名称,跳转到该视图页面。
SpringMVC相关注解
@Controller
只能写在类上,表示该类属于一个控制器
@RequestMapping("/请求映射名") 或 @RequestMapping(value="/请求映射名") 或 @RequestMapping(path="/请求映射名")
该注解可以写在类或方法上,通常在类上添加@RequestMapping用于区分不同模块
默认一个属性或value或path后的值,都表示访问该类或该方法时的请求
@RequestMapping(value="/请求映射名",method=RequestMethod.GET/POST/PUT/DELETE)
method属性表示使用哪种请求方式访问该类或该方法
如果注解中不止一个属性,每个属性都需要指定属性名
@GetMapping("/请求映射名")相当于@RequestMapping(value="/请求映射名",method=RequestMethod.GET)
post、put、delete同理
@GetMapping只能写在方法上
@PathVariable
该注解写在某个方法的某个形参上
通常配合@RequestMapping("/{path}")获取请求时传递的参数
@RequestParam(value="传递的参数名",defaultValue="没有传递参数时的默认值")
该注解写在某个方法的某个参数上
用于获取提交的数据,可以设置默认值在没有提交数据时使用
ORM
Object Relational Mapping 对象关系映射
创建java类的对象,将其属性和数据库表中的字段名之间构建映射关系。
这样通过操作该类创建的一个对象,就能操作数据库中对应的数据表。
ORM框架就是对象关系映射框架,用于简化JDBC。
主流的ORM框架有Hibernate、JPA、MyBatis、MyBatisPlus等
MyBatis
一个半自动化的ORM框架,原本叫做ibatis,后来升级改名为MyBatis。
MyBatis免去了几乎所有的JDBC中的模板代码以及设置参数获取结果集的工作。
使用XML文件或注解的形式,将SQL语句映射为持久层(dao层)中的方法。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
特点
方便
解除SQL语句与业务代码的耦合
支持动态SQL
主流
SSM项目搭建
整体流程
创建基于Maven的webapp项目
修改web.xml版本为4.0,创建java、resources目录、项目包结构、web-inf下的页面目录
导入依赖
spring-webmvc
mybatis
mybatis-spring
mysql
druid
spring-jdbc
jstl
配置Spring
创建application.xml
扫描项目根包
配置web.xml
设置全局参数:<context-param>,读取application.xml文件
设置全局监听器:ContextLoaderListener,初始化Spring容器
配置SpringMVC
创建springmvc.xml
扫描控制层所在包
设置内部资源视图解析器:InternalResourceViewResolver,设置前后缀
配置web.xml
设置请求分发器:DispatcherServlet,在其中读取springmvc.xml配置文件
过滤器请求解决中文乱码:CharacterEncodingFilter
配置MyBatis
创建mybatis-config.xml
在application.xml中注入
数据库链接池Druid:DruidDataSource
SQL会话工厂:SqlSessionFactoryBean
映射扫码配置器:MapperScannerConfigurer
执行sql语句
创建dao层接口,定义方法
在resoureces下创建mapper目录sql映射文件xx.xml,在其中定义sql语句
拦截器
自定义一个类,实现拦截器HandlerInterceptor接口,其中有三个default方法可以重写
preHandle
在发送请求后,DispatcherServlet解析控制器中某个RequestMapping执行之前的方法
该方法返回true时,请求才能继续
postHandle
在preHandle方法返回值为true后执行
在DispatcherServlet解析控制器中某个RequestMapping之后执行
afterCompletion
在preHandle方法返回true后执行
在解析视图后执行的方法
SpringBoot
Spring推出的一个Spring框架的脚手架。
不是一个新的框架,而是搭建Spring相关内容框架的平台。
它省去了Spring、SpringMVC项目繁琐的配置过程,让开发变的更简单。
本质还是Spring+SpringMVC,可以搭配其他的ORM框架,如MyBatis、MyBatisPlus、JPA、Hibernate等。
特点
内置了Tomcat服务器,不需要部署项目到Tomcat中
内置了数据源Hikari
减少了jar文件依赖的配置
SpringBoot中的配置文件可以使用yml格式文件,代替了properties或xml
问题1
在运行时出现了8080端口被占用的问题。
解决方法1:修改resources下创建的application.propertis文件,在其中输入
server.port=8000
修改端口号为8000。
解决方法2:进入cmd,输入 netstat -ano|findstr 8080 命令 + 回车,查看 tomcat 正在使用的端口。
![](https://i-blog.csdnimg.cn/blog_migrate/b8351c82574bb16daef79299df73b32e.png)
再输入 taskkill /pid 正在使用的端口 /f 强制关闭正在使用的端口。
![](https://i-blog.csdnimg.cn/blog_migrate/1aa1b8ffd3729d77fb3d7e0b6386d6de.png)
问题2
出现错误java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: No)
百度出来的问题基本是java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)
后面发现是datasource打成了rabbitmq
![](https://i-blog.csdnimg.cn/blog_migrate/4f7526eb49358674dce0ba781f6ad379.png)
MyBatisPlus
是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发而生
MyBatisPlus中的逻辑删除与物理删除
物理删除:将数据真正删除。delete from 表 where id=值
逻辑删除:数据不删除,而是打个"被删除"的标记。额外添加一个是否被删除的字段"deleted",其值为0或1,0表示未删除,1表示已删除。当删除某条数据时,执行修改update表set deleted=1 where id=值 添加了"deleted"字段后,查询更改为select * from 表 where deleted=1 where id=值
条件构造器Wrapper
BaseMapper和Service接口中有很多方法都有这个参数,表示一个条件构造器对象。
如果该参数实际传递的值为null,表示没有任何条件,
这个Wrapper是一个抽象类,如果想要带条件,就要创建一个该类的子类对象。
常用子类为QueryWrapper和UpdateWrapper,
查询是创建QueryWrapper对象,更新时创建UpdateWrapper,实际使用无区别。
![](https://i-blog.csdnimg.cn/blog_migrate/a3910eeba250281ad93a95829c39fc94.png)
RESTFul风格
用不同的请求方式去访问同一个URL地址时,执行不同的操作。
特点
通过URL就能知道当前在哪个模块
通过不同的请求方式决定执行什么操作
通过返回的状态码得到操作结果
具体使用
在controller的方法上,设置访问请求的方式如下:
@GetMapping("路径") 查询
@PostMapping("路径") 添加
@PutMapping("路径") 修改
@DeleteMapping("路径") 删除
@RequestMapping(value="路径",method=RequestMethod.GET/POST/PUT/DELETE)
在同一个controller中,不能出现两个请求方式和路径都一致的方法
如果请求不匹配会报405异常
访问时如果要传参,使用"/模块名/参数"方式,配合controller中的@PathVariable获取