自用学习总结第二篇

程序员操守:1.路径中不要有

一、SpringBoot核心是Spring,简化框架的开发。

SpringMVC负责实现前后端交互,媒介:http(不安全)https(安全)密钥:证书(公钥私钥) 协议:TCP/IP协议(3次握手规则)速度是很快的

二、maven命令

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

三、Jar传递性的实现原理

当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}")

五、Mybatis

概念:是一款优秀的持久层框架,利用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文件

七、动态sql

1)动态sql-where-if

核心思想:自动判断是否为null,如果该字段为null,该字段不参与sql

规则如下:

2)set标签用法

用法:去除set条件中多余的,号

#修改操作

    update demo_user 
        
            name=#{name},
            age =#{age}
            sex =#{sex}
        

3)sql-分支结构语法

八、resultType与resultMap区别

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

  
    
        
        
    
    
    
        
        

        
        
    

驼峰映射说明

 
    
    
        
        
        
        
            
        
    

十二、Mybatis提供缓存机制

1.Mybatis中有2级缓存

2.一级缓存SqlSession在同一个SqlSession内部,执行多次查询,缓存有效,一级缓存默认开启状态

3.二级缓存SqlSessionFactory级别,利用同一个工厂,创建的不同的SqlSession可以实现数据的共享(缓存机制),二级缓存默认也是开启的

4.使用一级、二级缓存,则POJO对象必须实现序列化接口(Serializable),否则数据不可被缓存

十三、SpringBoot整合Mybatis

#配置端口号
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 "用户修改成功";
    }

十四、Vue生命周期函数

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协议,协议中要求传递字符串

十六、前端JS

//多参数的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的两层嵌套封装到一层中

十八、简化promise对象写法

/**
				 * 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)
				}

十九、安装脚手架09

目录结构

自用学习总结第二篇_第1张图片

二十、 开始项目操作

1、ajax局部刷新,异步访问,通过核心组件Ajax引擎,相当于代理机制,用户将请求给Ajax引擎,再由引擎交给服务器,服务器将数据返回给引擎,Ajax引擎将回调函数返回给用户。

2、组件之间的嵌套问题,children[内部组件]

        1)定义路由url地址

        2)定义路由填充位(占位符)

        3)定义组件

        4)定义路由策略

自用学习总结第二篇_第2张图片

 3、多值封装使用@Param("")

4、映射文件


    
        
        <!–一堆多封装子集菜单List集合–>
        
            
            
            
            
            
            
            
        
    



    
    
        
        
    
    

二十一、Springboot中提供控制事务

@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对象

自用学习总结第二篇_第3张图片

二十三、Mybatis-Plus框架 

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.如果出现找不到配置文件的问题,可以看下包路径,可能是没有层级关系直接用的.

自用学习总结第二篇_第4张图片自用学习总结第二篇_第5张图片

13、作用域插槽:获取当前行元素信息scope.row

14、数据不支持并发执行,为顺序执行

15、常见运行时异常:

ArrayIndexOutofBoundsException     数组越界异常 
ClassCastException                           类型转换异常 
NullPointerException                          空指针异常   
IllegalAccessException                      非法的参数异常 
InputMismatchException                    输入不匹配异常

16、常见编译时异常:

IOException                            输入输出流异常 
FileNotFoundException          文件找不到的异常 
ClassNotFoundException       类找不到异常 
DataFormatException             数据格式化异常 
NoSuchFieldException           没有匹配的属性异常 
NoSuchMethodException       没有匹配的方法异常 
SQLException                         数据库操作异常 
TimeoutException                   执行超时异常
 

你可能感兴趣的:(知识总结,spring,boot,java,spring,ajax,前端)