目录
一、前言
在企业级开放时,会用到框架,ssm框架就是最常用的(框架其中之一)。
框架在狭义的层面,就是引入依赖包(如jackson :json字符串与java对象相互转换的库),在广义的层面,他能够实现多个强大的功能,更利于代码的设计与开发。
二、spring(点击详解)
1.普通使用
spring是springFramework框架,是IoC(控制反转)容器,可以实现DI(依赖注入,下级注入上级),能够直接运行,有自己的web容器不用Tomcat。
springBoot与springMVC的框架都是基于spring理念来实现的。
存操作:创建一个Bean并注入到配置文件中(spring_config.xml)
取操作:获取spring上下文,获取bean对象,使用bean对象。
获取spring上下文有两个接口可供选择:ApplicationContext和BeanFectory,前者属于饿汉操作是后者的子类。
2.加入注解
当我们每次创建bean都需要往配置文件中注入,这个方式太麻烦了。如果给Bean添加注解,就节省了很多时间。
在创建某个bean需要用到其他类的对象时,使用三种注入方法并结合两种注解来使用更简单。
如果两个对象同时应用了bean对象,中途bean修改了变量,这种情况系统会报错,因为系统默认的bean作用域为单例模式。当然,作用域有6种我们可以自己需要修改。
同时需要了解bean的生命周期。
三、springBoot
springboot实现了质的飞跃,可以实现和浏览器及用户的交互。特点:约定大于配置
同时,springBoot抛弃了xml文件,使用注解和配置来开发,支持了更多监控的指标。
1.springboot配置文件
与spring不同的是,springboot没有了xml文件,而采用了配置文件。配置文件中可以设置很多东西,比如数据库连接,关键日志的保存,项目启动的端口等
配置文件有两种:
①application.properties 采用键值对(key=value形式),如果两种配置文件都存在,优先读取.properties 相较于.yml文件会产生很多冗余信息。
②application.yml 同样是键值对方式(key: value)空格不能省略 类似json格式的树形配置方式 字符串默认不用加上单引号或者双引号
如果在类中读取配置文件的信息添加@Value注解,读取配置对象@ConfigurationProperties。
2.springboot日志文件
springboot默认有日志打印(内置了日志框架slf4j),但是没有办法保存。解决这个问题就是先获取日志对象输出在控制台然后保存到指定文件目录中。
1.获取日志对象方法
方法一:使用日志工厂 LoggerFactory,打印到控制台。
方法二:添加 lombok 框架支持,使用 @slf4j 注解输出日志。
然后在想要打印日志文件的类上添加@slf4j注解就可以了。
2.保存到指定文件目录
3.日志级别
上面两个步骤就算把日志文件保存成功了,还记得吗,我们使用方法一打印时用的是logger.info方法,info属于日志级别之一,是系统默认的日志级别。对于企业中维护软件的不同岗位来说,日志打印出的有些内容不关他们的事,所以我们可以通过日志级别的设置来输入不同问题。
- trace:微量,少许的意思,级别最低;
- info:普通的打印信息;debug:需要调试时候的关键信息打印;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
越往下级别越高,设定了某个级别打印时也包含下级的内容,打印的内容也就越多。
四、springMVC
springMVC是web框架,基于ServletAPI。MVC是思想,springMVC是实现。
springMVC的功能:
1.能够将用户(浏览器)和 Java 程序连接起来,访问一个地址能够调用到我们的 Spring程序。
2.用户访问时会带参数,我们需要获取到用户传进来的参数
3.执行了业务逻辑之后,要把程序执行的结果返回给用户。
1.普通注解
@ResponseBody注解 把后端数据传给前端。 接收json对象
@RequestParam 设置参数必传 可以修改为非必传
@PathVariable 获取URL参数
@RequestPart 上传文件
@RequestHeader 获取Header
@Cookiesvalue 获取cookie
@SessionAttribute 获取session
如果直接返回静态页面,在static中创建index.xml配置文件,在类中RestMapping("/index").
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>hello,spring mvc</title>
<script src="index.js"></script>
</head>
<body>
<h1>Hello,Spring MVC.</h1>
</body>
</html>
2.转发和重定向
forward:请求转发 服务器帮转 地址不发生变化 有可能造成原外部资源不能访问。
redirect:重定向 浏览器重新请求新的地址 地址发生变化。
五、Mybatis
mybatis是便于数据库处理的持久层框架。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
之前我们使用JDBC来操作数据库,从而实现与后端程序的连接,但是JDBC操作太复杂了,mybatis框架更简单灵活。
Mybatis==>ORM框架(object Relational Mapping) 实现了数据库数据与对象的映射关系。
上图是基本的流程,那么我们实现代码的过程也要遵循这样的连接。我们传递给用户的信息,通过controller输出,controller依靠service,service依靠mapper,mapper依靠的则是我们xml文件中存放的查询数据库的sql语句。
1.创建项目
1添加引用
2.配置连接
①在配置文件中与数据库建立连接
②xml文件中是保存sql操作
2.业务代码
1.添加实体类
src下创建包model,每张表表单独一个类存放,类中则是表里的相关字段。
2.添加Mapper接口
src下创建包Mapper,为了连接不同的表,每一个mapper接口对应的是不同的表(也就是controller包中的不同的类),接口中存放的是操作方法名。
3.添加mapper.xml文件
在resource下创建mapper包,包下的每一个.xml文件对应的是每一个类,存放的是mapper接口中的方法sql语句。使用resultType设置返回值的类型。
4.添加Service
src下创建包Service,每一个service类对应不同实体类,使用属性注入将关联的Mapper接口注入。
5.添加Controller
src下创建包Controller,每一个controller类对应不同的实体类,类中使用属性注入将service注入,添加路径注解以及具体方法返回的内容。
3.占位符
mybatis在mapper.xml中写的sql语句中占位符有两种:${} #{}
${}:直接替换内容 会产生sql注入问题 比如:替换字符'or 1='1 ${sort}可以实现排序查询
#{}:替换内容并加单引号 提倡使用的方式
另外 mybatis还提供内置函数concat()可以实现字符串拼接。
4.标签
<if>:判断非必填 主要是判断传入是否为空
<trim>:设定多个值 添加前缀prefix 添加后缀suffix 去除前缀prefixOverrides 去除后缀suffixOverrider
<where>:多个条件查询,and连接
<set>:添加多个更新的信息
<foreach>:遍历每一个对象
六、SpringAOP
SpringAOP是面向切面编程。同样的,AOP是思想,springAOP是实现,主要是实现对一类事物的集中处理。(统一日志处理、异常处理、事务有关的处理)
切点:要增强的方法(因为我们是在原方法中加入其他功能,所以就说原方法增强了)
通知:新增强的内容,要完成的工作。在方法上加入注解@Before 前置通知 @After 后置通知 返回或者抛出异常时通知 @AfterReturning 返回时通知 @AfterThrowing 抛出异常后通知 @Around 环绕通知
1.统一处理实现
①添加AOP框架支持
②定义切面和切点
切面在某个类上使用注解@Aspect
切点使用注解@pointcut()括号中用AspectJ语法写出要增强的类有哪些。
切点方法无方法体
2.AspectJ语法
- * :匹配任意字符,只匹配一个元素(包,类,或方法,方法参数)。
- * .. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使用。
- + :表示按照类型匹配指定类的所有类,必须跟在类名后面,如 com.cad.Car+ ,表示继承该类的所有子类包括本身。
3.实现原理
4.解决部分拦截
5.统一异常处理
@ControllerAdvice+@ExceptionHandler(Exception.class)
6.统一数据返回格式
@ControllerAdvice+ResponseBodyAdvice接口
七、Spring事务
如果把一组事物封装成一个执行单元,就要保证多个事务都要执行成功或者都要执行失败,就要把这一组操作开启事务。这和数据库的事务没有区别。
1.添加为事务
①手动操作事务
SpringBoot内置了获取提交回滚以及事务属性,获取之后开启事务。
②自动事务
在事务上(一定是public修饰符)添加注解@Transactional,类执行自动开启事务,执行完毕自动关闭事务,异常回滚。如果异常处理后不会回滚就再次抛出异常可以解决。
2.保证多事务并发
事务的四大特性(ACID):原子性、持久性、一致性、隔离性(只有隔离性可以设置)
事务的隔离级别:读未提交(存在脏读)、读已提交(存在不可重复读)、不可重复读(存在幻读)、串行化(效率低)
为了保证多事务并发,可以给事务设置隔离级别的设置(通过注解@Transactional(isolation= )来设置)。
3.保证一个事务的可控
某个事务可能会调用不同的方法,为了保证每个事务的可控性,我们添加了事务传播机制。