程序员操守:1.路径中不要有
SpringMVC负责实现前后端交互,媒介:http(不安全)https(安全)密钥:证书(公钥私钥) 协议:TCP/IP协议(3次握手规则)速度是很快的
1.clean清空项目中的target文件目录的.xxx.class文件信息
2.install将项目打包处理,每次打包会在target文件目录中和本地仓库中生成具体的jar包文件,该文件可以被其它项目依赖。
3.打包类型
3.1、jar包文件springboot项目/工具API项目/框架的项目
3.2、war包文件动态web项目/JSP类型/tomcat服务器
3.3、pom类型(标识符)POM类型表示聚合工程,微服务架构设计一般采用pom
A.jar 依赖 B.jar, B.jar 依赖 C.jar 如果只导入A.jar 则自动依赖B/C
当maben扫描依赖信息时,会根据左表找到对应的jar包文件,之后扫描当前目录下的xxx.pom文件,之后根据pom文件中的依赖项dependdency再次查找其他的依赖jar包,知道所有jar包依赖完成为止
关于hash基本常识:
1.数据相同,hash算法相同,hash值必定相同
2.数据不同,hash算法相同,hash值可能相同
build标签作用:当springboot需要打包时,springBoot中的build标签会起作用,将springBoot按照可执行的方式打成jar包文件,如果没有build会报错------>>xxxx.jar中没有主清单属性
properties语法:
1)数据结构 key=value
2)value中前后不要有空格
3)properties文件 程序默认读取采用ISO-8859-1编码格式,中文会出现乱码
4)pro文件中的key名称不能重用
yml语法:
1)key:空格value
2)key的关键字有层级缩进效果,注意缩进
3)YML文件默认采用UTF-8编码格式
4)value中不能出现多余的空格
yml文件中key的前缀可以复用,但是有层级
动态赋值:因yml为核心配置文件所以一般不会选择在yml中定义动态属性,会在properties中定义
1)在配置文件.properties中定义属性并为其赋值例如 sname=张三
2)需要加载指定配置文件,并且设定字符集编码格式
@PropertySource(value = "classpath:/name.properties",encoding = "UTF-8")
3)使用时需要在类中定义的属性上添加@Value注解例如:@Value("${sname}")
概念:是一款优秀的持久层框架,利用ORM思想实现了数据库持久化操作,也称之为半自动化的ORM映射框架
ORM思想:对象关系映射,是一种程序设计技术。以对象的方式操作数据库。
使用说明:
1)需要导入mabatis依赖包mabatis-spring-boot-starter包和jdbc的依赖包mysql-connector-java
1)映射文件采用标签的形式例如
#接口方法
User findUserById(Integer id);
#根据id查询用户数据
2)转移标签
大于 > >
小于 < <
与号 & &
转义标签
3)模糊查询时需要在映射文件xml中的查询语句中的%号,用双引号引上例如:
注意:resultType中的属性(即为实体类所在位置的全路径)每次都需要添加全路径繁琐,可以使用别名包com.jt.pojo.User
例:在Mybatis的核心配置文件中配置
注:在Mybatis的核心配置文件有顺序的
properties?,settings?,typeAliases?,typeHandlers?,objectFactor
#配置完别名包后,以后的ResultType属性就可以直接使用User了
4)参数传递:1.基本类型的数一个
2.可以将多个参数封装为POJO对象,不能有重名属性
3.更加通用的是封装为Map集合@Param("key")
5)如果遇到集合参数传递,需要将集合遍历,使用foreach标签进行循环遍历集合
标签属性说明:
1.collection 表示遍历的集合类型
1.1数组 关键字array
1.2List集合 关键字list
1.3Map集合 关键字Map中的key
2.open 循环开始标签
close 循环结束标签 包裹循环体
3.separator 分隔符
4.item 当前循环遍历的数据的变量
int[] ids={1,2,3,5,7};
Integer[] ids = {1,2,3,5,7};
List list = Arrays.asList(ids);
Mapper接口
List findIn(int[] ids);
注意:数组转化为集合时需要使用包装类型进行定义。
6)多值封装为Map集合需要添加@Param("字段名")
List findInMap(@Param(ids) int[] ids, @Param("sex" String sex));
#Xml文件
1)动态sql-where-if
核心思想:自动判断是否为null,如果该字段为null,该字段不参与sql
规则如下:
2)set标签用法
用法:去除set条件中多余的,号
#修改操作
update demo_user
name=#{name},
age =#{age}
sex =#{sex}
3)sql-分支结构语法
resultType:
要求:对象的属性名称与表中的字段一一对应。
对象:User(id,name,age,sex)
表: demo_user(id,name,age,sex)
总结:resultType适合单表映射,并且属性名称一致
resultMap:
要求:如果发现表中的字段与属性名称不一致时,使用resultMap
对象:Dog(dogId,dogName)
表:dog(dog_id,dog_name)属性不匹配,所以映射失败
1.1通过注解:@Select@Update@Insert@Delete标识接口方法,直接注解内容
1.2注解将查询的结果集,根据方法的返回值类型动态映射
1.3使用注解时,mybatis需要管理mapper的接口
1.4注解开发只适用于单表CURD操作,多表操作一定出问题
1.5如果设计到复杂标签时where/set/foreach等标签时,不可以使用注解
1.6所以应该熟练掌握xml映射文件的写法,注解开发只是辅助的作用
@Select("select * from demo_user")
List findAll();
一对一关联查询:完成一对一封装
固定用法:
1.association: 将结果集封装为单独的对象 dept
2.property 需要封装的属性名称
3.javaType 固定写法: 属性的类型
一对多关系封装
子查询用法
select开始二次查询
column将字段的值作为参数传递给子查询,子查询通过#{字段名称}动态接收
十一、驼峰映射
框架提供了自动映射功能,工作中使用驼峰映射的场景比较多
需要设置settings
驼峰映射说明
1.Mybatis中有2级缓存
2.一级缓存SqlSession在同一个SqlSession内部,执行多次查询,缓存有效,一级缓存默认开启状态
3.二级缓存SqlSessionFactory级别,利用同一个工厂,创建的不同的SqlSession可以实现数据的共享(缓存机制),二级缓存默认也是开启的
4.使用一级、二级缓存,则POJO对象必须实现序列化接口(Serializable),否则数据不可被缓存
#配置端口号
server:
port: 8090
#管理数据源
spring:
datasource:
#高版本驱动使用
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
#设定用户名和密码
username: root
password: root
#SpringBoot整合Mybatis
mybatis:
#指定别名包
type-aliases-package: com.jt.pojo
#扫描指定路径下的映射文件
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
1)当参数为多个时,并且参数名称与属性名称一致,可以使用对象接收
2)RestFul参数传递
例子:请求路径http://localhost:8090/updateById/1/黑熊精/3000/男
/**
* URL: http://localhost:8090/updateById/1/黑熊精/3000/男
* 参数: 4个
* 返回值: "修改成功!!!!"
* restFul结构 参数分析 {属性名称}
* 参数接收:
* 1. 单个参数使用 @PathVariable Integer id接收
* 2. 如果多个参数接收 使用对象 mvc自动提供的功能.
*/
@RequestMapping("/updateById/{id}/{name}/{age}/{sex}")
public String updateById(User user){
userService.updateById(user);
return "用户修改成功";
}
1)生命周期函数的目的:控制整个vue对象的,在各个阶段都可以对VUE进行控制
2)配置了生命周期方法后,生命周期函数都是自动调用
3)生命周期函数分类
第一类:对象初始化阶段
1.beforeCrete:创建一个VUE对象,没有加载其中的属性,是一个空对象
2.created:Vue对象开始填充数据,表示配置完成
3.beforeMount:对象根据已经配置的内容,在指定区域开始加载数据(属性的值,保存到内存中)
4.mounted:在指定的区域中,渲染页面(为页面填充数据),页面初始化完成
第二类:数据修改阶段
1.beforeDestroy:数据跟新时调用,发生在虚拟DOM打补丁之前
2.updated:由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子
第三类:对象的销毁阶段
1.beforeDestroy:实例销毁之前调用
2.destroyed:实例销毁后调用
跨域:浏览器解析Ajax时,要求浏览器的网址,与Ajax请求的网址,必须满足三要素
要素:协议相同、域名相同、端口号相同
三要素都同时满足时,叫做同域访问,有一项不满足,则称为跨域访问
注意:http端口默认为80 https端口默认443
交互的媒介:HTTP协议,协议中要求传递字符串
//多参数的Get请求. 如果是多个参数可以考虑封装为对象
let user3 = {age: 18, sex: "女"}
let url3 = "http://localhost:8090/findUserByAS"
// GET请求传递对象 使用 {params: 对象参数}
axios.get(url3,{params: user3})
.then(function(promise){
console.log(promise.data)
})
完成用户入库操作
用法: axios.post(url地址,对象名称)
axios.put(url地址, 对象名称)
axios.get(url地址,{params: 对象名称})
axios.delete(url地址,{params: 对象名称})
@RestController
@CrossOrigin
@RequestMapping("/axios") //抽取前缀
public class AxiosController {
@Autowired
private AxiosService axiosService;
/**
* 实现用户入库操作
* url地址: http://localhost:8090/axios/saveUser
* 参数: JSON串 {"name":"tomcat","age":18,"sex":"女"}
* 返回值: 成功消息
* 难点: 前端传递的是JSON,后端不可以直接使用User对象接收.
* 解决方案:
* 1.对象可以转化为JSON串 @ResponseBody
* 2.JSON串转化为对象 @RequestBody
*/
@PostMapping("/saveUser")
public String saveUser(@RequestBody User user){
axiosService.saveUser(user);
return "用户新增成功!!";
}
}
说明:缺点嵌套太深不便于维护,解决方案:将ajax的两层嵌套封装到一层中
/**
* 1.定义一个方法
* 关键字:
* 1. async 标识函数
* 2. await 标识ajax请求
*/
async function saveUser(){
let user2 = {name: "axios",age: 18, sex: "男"}
//let {conf: confv,data: datav,status: statusv} = await axios.post("/axios/saveUser",user2)
let {data: result} = await axios.post("/axios/saveUser",user2)
console.log(result)
}
目录结构
1、ajax局部刷新,异步访问,通过核心组件Ajax引擎,相当于代理机制,用户将请求给Ajax引擎,再由引擎交给服务器,服务器将数据返回给引擎,Ajax引擎将回调函数返回给用户。
2、组件之间的嵌套问题,children[内部组件]
1)定义路由url地址
2)定义路由填充位(占位符)
3)定义组件
4)定义路由策略
3、多值封装使用@Param("")
4、映射文件
<!–一堆多封装子集菜单List集合–>
@Transactional //事务的注解
增删改中需要加事务控制,查询不用。为了保证事务的一致性
规则:
1)Spring事务的注解在默认的条件下只处理运行时异常,当遇到检查异常(编译异常)事务的控制没有效果
2)@Transactional(robackFor=?)?遇到某种异常,实现事务回滚
@Transactional(noRollbackFor=?)?遇到某种异常,实现事务不回滚
readOnly=true 该操作是只读的,不能修改,公告/合同等
说明:面向切面编程AOP
作用:在代码结构中实现了业务的松耦合(解耦)
通知类型:
1)before
2)afterReturning
3)afterTrowing
4)after
5)around 环绕通知 控制程序执行前后
步骤:
1)添加一个配置类
2)添加@RestControllerAdvice注解,标识Controller层,返回值JSON串
3)添加@ExceptionHandler()注解,用来拦截指定类型的异常信息
4)输出异常e.printStackTrace();
5)返回vo对象
mp:自动生成sql语句
对比Mybatis:只做增强,损耗小,强大的CRUD,通过少量的配置实现单表的CRUD操作,全自动自动化映射(适用于单表)。
Mybatis特点:
1)半自动化的ORM映射框架
1.结果集可以实现自动化的映射例如resultMap、resultType 自动
2.Sql语句需要自己手动完成 手动
/* 向vue对象中添加全局对象 以后发送ajax请求使用$http对象 */
/* 父组件将参数传递给子组件 需要声明 prototype.key= xxx */
Vue.prototype.$http = axios
注意:
1、@RequestMapping("/使用绝对路径").
2、为解决后期维护问题,赋值时最好采用动态赋值
3、使用Lombok插件的坏处:代码可调式性降低、影响版本升级(JDK更新快而Lombok更新慢,如果低版本的Lombok不兼容新版本的JDK就会导致无法升级)、强破队友一起使用此插件、可能会破坏代码封装性
3.1、Lombok自动的set/get构造方法
4、关于单元测试方法,单元测试方法需要在测试类中并且添加@SpringBootTest,在测试方法上加@Test注解,测试方法会自动加载主类。
5、打包后出现两个包一个大一个小,大的是带依赖运行环境的,小的是纯代码,如果上传选择大的。
6、组件的好处:封装CSS样式/封装JS样式HTML代码片段xxx.vue命名
父子组件参数参数传递:需要使用Vue.prototype.http=axios以后使用http.xxx发起Ajax请求
7、重载的参数范围不能耦合
8、登录认证都会返回秘钥,用来作为用户登录的凭证
密钥特点:独一无二,唯一性
注意:MD5基本不用,采用UUID
String uuid = UUID.randomUUID().toString().replace("-","" );
进行持久化token信息,用来保存密钥,防止token在系统请求响应后直接销毁
采用Session:会话控制技术,生命周期会话结束对象销毁,数据存储在内存中,只可以临时存储,不能永久保存。
位置:f12中Application-Session Stirage
采用Cookie:小型的文本文件(真实文件),文件通常是加密的,可以临时或永久存储。
9、vue ui 脚手架的可视化工具,post请求需要用@RequestBody
10、路由导航守卫,相当于拦截器
/**
* 参数说明:
* 1.to 到哪里去
* 2.from 从哪里来
* 3.next 请求放行
* 拦截器策略:
* 1.如果用户访问/login登录页面 直接放行
* 2.如果访问其它页面,则校验是否有token
* 有token 放行
* 没有token 跳转到登录页面
*/
router.beforeEach((to,from,next) => {
if(to.path === '/login') return next()
//获取token数据信息
let token = window.sessionStorage.getItem('token')
if(token === null || token === ''){
return next("/login")
}
//放行请求
next()
})
11.查询所有一级菜单和一级菜单所对应的二级菜单,关联查询,利用万能左连接
SELECT p.id,p.name,p.parent_id,p.path,p.level,p.created,p.updated,
c.id c_id,c.name c_name,c.parent_id c_parent_id,c.path c_path,c.level c_level,c.created c_created,c.updated c_updated
FROM rights p
LEFT JOIN rights c ON c.parent_id = p.id WHERE p.parent_id=0;
12.如果出现找不到配置文件的问题,可以看下包路径,可能是没有层级关系直接用的.
13、作用域插槽:获取当前行元素信息scope.row
14、数据不支持并发执行,为顺序执行
15、常见运行时异常:
ArrayIndexOutofBoundsException 数组越界异常
ClassCastException 类型转换异常
NullPointerException 空指针异常
IllegalAccessException 非法的参数异常
InputMismatchException 输入不匹配异常
16、常见编译时异常:
IOException 输入输出流异常
FileNotFoundException 文件找不到的异常
ClassNotFoundException 类找不到异常
DataFormatException 数据格式化异常
NoSuchFieldException 没有匹配的属性异常
NoSuchMethodException 没有匹配的方法异常
SQLException 数据库操作异常
TimeoutException 执行超时异常