行业知识
关于web学习的一些过程记录
Web开发基础知识
前端
HTML,CSS
JavaScript
基础语法
-
定义变量
-
let
-
-
处理字符串
-
在 字符串 中找 字符
-
let x = "ZoranSunburst";x[0];// x[0]=Z
-
在 字符串 中找 子字符串
-
一些方法:
-
.length:获取字符串长度
-
.indexOf("..."):获取子字符串的首个字符在字符串中的索引,不存在这个子字符串时,会返回-1
-
.slice()
-
.slice(x,y)
-
获取从x索引开始到索引为y的字符结束的子字符串
-
-
.slice(x)
-
获取从x索引开始到字符串结束的子字符串
-
-
-
.toLowerCase()
-
把字符串中所有字符转换为小写字母
-
-
.toUpperCase()
-
把字符串中所有字符转换成大写字母
-
-
.replace("xxx","yyy")
-
将字符串中xxx,替换成yyy
-
-
-
后端
SpringBoot入门
简述
-
世界上最流行的web框架技术
-
快速搭建一个web项目
idea中简单配置
-
创建工程勾选spring initializr
由于3.x的spring boot只支持Java17以上的版本,所以将Server URL改为阿里云,不使用官网
-
选择Java,Maven(Java版本根据需求选择)
如果需要修改坐标也可以一并修改
-
在依赖页中勾选Web --> Spring Web(在使用Java8、Java11时,选择2.x版本的spring boot)
http协议
这一块儿需要p60-p63多听几次,多记一下
-
http请求
-
GET 、POST 请求的区别
-
GET 请求有大小限制,参数放在请求行中
-
POST 无大小限制,参数在请求体中
-
-
请求行
-
请求方式(GET/POST),资源路径,协议
-
get请求的请求参数放在这里
-
-
请求头
-
格式:key : value
-
-
请求体
-
post请求特有,存放请求参数
-
-
-
http响应
-
相应结构
-
响应行
-
协议,状态码,描述
-
-
响应头
-
第二行开始,格式:key:value
-
-
响应体
-
最后一部分,存放响应数据
-
-
-
http 协议状态代码
-
最常用代码:
-
200 --> OK --> 正常运行
-
404 --> URL NO FOUND --> 找不到请求的地址
-
503 --> 服务器出现了一些问题
-
-
-
http协议解析
-
不懂
-
Tomcat
-
是web应用服务器
-
也被称之为Web容器,Servlet容器
使用tomcat
-
spring boot的起步依赖已经内嵌了tomcat服务器
原理是maven 依赖传递
请求
-
原始方法获取参数
-
Controller方法形参中声明HttpServletRequest对象
-
调用对象的getParameter(参数名)
-
-
SpringBoot请求简单参数
-
servlet方式请求响应
-
spring boot方式请求
-
-
@RquestParam 注解
-
方法形参名称与请求参数名称不匹配,通过该注解完成映射
-
该注解的required属性默认是true,代表请求参数必须传递
-
-
数组集合参数
-
数组:请求参数名与形参中数组变量名一致
-
集合:请求参数名与形参中集合变量名相同,通过@RquestParam 注解绑定参数关系
-
-
日期参数
-
json参数
-
POST请求
-
在请求体中
-
raw
-
一般使用实体对象接受json,key键名要和形参属性名一致
-
-
路径参数
-
使用@PathVariable接收参数,请求路径格式:"/path/{...}/{...}/..."
几种常见的HTTP请求的应用场景: Get:查看,具有幂等性,发起无论多少次get请求都不会改变服务器资源
Post:创建,非幂等,通常用于创建新资源,如注册用户,发布帖子,请求订单
Put:更新,具有幂等性,整体替换资源,而不是部分更新,请求正确执行的
Delete:删除
响应 p73
-
Controller的作用就是发出请求,设置响应数据
设置响应
-
return 设置响应的内容
-
可以返回字符串给浏览器
-
可以返回对象给浏览器(返回的结果会是一个json格式的数据 )
-
-
设置了注解为RespondBody的类的返回值都会是响应的数据
-
元注解是修饰注解的注解
-
-
@
响应实例
-
Springboot项目的静态资源(html,css,js....)默认存放目录是:classpath:/static、classpath:/public、classpath:/resources
-
classpath指的是类路径
分层解耦
-
三层架构
-
单一职责原则
-
什么是三层架构
-
控制层(Controller)
-
接收前端发送的请求,处理请求,响应数据
-
-
业务逻辑层(Service)
-
处理具体业务逻辑
-
-
数据访问层(持久层)(Dao)
-
负责数据访问操作,包括i增删改查
-
-
-
-
分层解耦
-
IOC & DI入门
-
控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器)
-
依赖注入(DI):容器为应用程序提供运行时,所依赖的资源,称之为依赖注入
-
Bean对象:IOC容器中创建,管理的对象,称之为bean
-
-
IOC详解
-
DI详解
听不懂听不进去哈哈哈完蛋了
Mybatis
-
持久层开发(Dao)框架,用于简化JDBC的开发(减少代码编写)
-
Mybatis可以写sql
案例 -> 使用Mybatis查询所有用户数据
-
步骤
-
创建springboot工程,数据库表uesr,实体类User
-
引入Mybatis依赖,配置Mybatis
-
编写sql(注解/XML)
-
在使用注解方式时,使用@Mapper注解标注为持久层接口(数据访问层DAO的接口,也叫Mapper接口),定义方法后也要在注解上标明执行的sql类型(查询语句的注解为@Select,并在注解后的括号内写入SQL语句),SQL执行结果会自动封装到方法返回值
-
只需要定义接口,不需要编写实现类,Mybatis会自动生成对应的实现类
-
-
-
在连接Mybatis时,和jdbc的连接逻辑一致,需要配置:
-
驱动
-
URL
-
用户名
-
密码
Lombok
简化实体类程序,省略编写getset方法,构造方法等方法,可以自动生成日志变量
最常用的注解是@Data(提供@Getter+@Setter+@ToString+@EqualsAndHashCode)
Mybatis基础操作(增删改查)
什么是pojo?po,vo是什么?
“Plain Old Java Object”“简单java对象”。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。
PO是指持久对象(persistant object持久对象)。
VO是指值对象或者View对象(Value Object、View Object)。View Object。
-
如果Mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如#{id},#{value},但是建议无论如何都保持两者一致
-
Mapper注解会为Mapper接口创建代理对象,并将代理对象放入IOC容器
SQL预编译
-
防止sql注入问题
-
在定义SQL的时候使用 #{} 占位符就可以生成预编译SQL
有两种参数占位符:#{}、${}
#{}:
-
执行SQL时会把#{...}替换成?,生成预编译SQL,自动设置参数值
-
使用时机:参数传递,都使用#{...}
${}:
-
拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入的问题
-
使用时机:如果对表名,列表进行动态设置时使用
-
相较于前者,它生成的不是预编译的SQL,性能会低,且存在SQL注入的风险
mybatis删除操作
-
Mapper接口类中:
//根据ID删除数据 @Delete("DELETE FROM emp.emp WHERE id = #{id}") //public int delete(Integer id); //参数占位符:#{参数} public void delete(Integer id); -
Test 测试类中:
@Autowired private EmpMapper empMapper; @Test public void testDelete() {// int delete = empMapper.delete(16);// System.out.println(delete); empMapper.delete(16); }
mybatis添加操作
-
Mapper接口类
@Insert("INSERT INTO emp.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")public void insert(Emp emp);-
Test类
@Testpublic void testInsert(){ //Construct Emp object Emp emp = new Emp(); emp.setUsername("Taylor"); emp.setName("斯威夫特"); emp.setImage("1.jpg"); emp.setGender((short)2); emp.setJob((short)1); emp.setEntrydate(LocalDate.of(2000,1,1)); emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); //Add new emp empMapper.insert(emp); //这个是调用empMapper接口类中的insert方法,向emp表插入了一个emp对象}-
主键返回
-
在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据
-
@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("INSERT INTO emp.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")public void insert(Emp emp);就是在方法的上面加上一个Option注解,指定两个属性:useGeneratedKeys ,keyProperty
mybatis更新
-
更新分为查询和更新两个部分
-
代码大体上跟插入操作一致,只是在Mapper接口类中要用@Update注解
@Update("UPDATE emp.emp SET username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId}, update_time = #{updateTime} WHERE id = 1;")public void update(Emp emp);// 测试类代码 @Test public void testUpdate(){ //Construct Emp object Emp emp = new Emp(); emp.setId(13); emp.setUsername("OldTaylorSwift"); emp.setName("旧泰勒斯威夫特"); emp.setImage("1.jpg"); emp.setGender((short)2); emp.setJob((short)1); emp.setEntrydate(LocalDate.of(2000,1,1)); emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); //Add new emp empMapper.update(emp); }mybatis查询(根据ID查询)
-
数据封装
-
表中字段名和实体类的属性名一致时,可以自动进行封装
-
不一致时无法封装
-
解决不能自动封装的方法:
-
给字段起别名,让别名和实体类属性名一致
-
使用@Results,@Result注解手动映射封装(只用对字段名和实体类的属性名不一致的字段单独标注)
-
开启mybatis的驼峰命名自动映射开关(最好用这个方法)
-
下划线命名会自动映射成驼峰命名
-
e.g. a_column --> aColumn
-
在application.properties文件中输入camel,会自动联想这个开关
-
-
mybatis查询(条件查询)
-
查询结果可能是多个对象,要用List集合进行对象的封装
-
接口方法:
@Select("SELECT * FROM emp.emp WHERE name LIKE '%${name}%' and gender = #{gender} and entrydate BETWEEN #{begin} AND #{end} ORDER BY update_time DESC ")public List list(@Param("name")String name, @Param("gender")Short gender, @Param("begin")LocalDate begin, @Param("end")LocalDate end);XML映射文件
-
作用是编写sql语句
-
三点规范
-
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
-
XML映射文件的namespace属性为Mapper接口全限定名一致
-
这个接口全限定名的获取方法:
-
-
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
-
当有返回值时,比如SELECT语句,就要额外加上“resultType”属性值,输入返回值的类型(要全限定名,获取方式跟上图一样)
-
-
-
遇到的问题与解决:mybatis常见异常:Invalid bound statement (not found): com.ruoyi.news.mapper.RuoyiNewsMapper.selectRuoyiNe_invalid bound statement (not found): com.ruoyi.sys-CSDN博客
总结:需要让xxxmapper.xml的层级结构和xxxmapper.class完全一致!否则在生成的target目录下就会发生错乱
动态SQL
-
随着用户输入或者外部条件而变化的SQL叫动态SQL
-
动态SQL的三个标签
-
-
使用test属性进行条件判断
-
条件成立时拼接sql,否则不拼接
where 标签作用
-
动态生成where关键字
-
自动去除条件前多余的or或者and
-
当where标签内所有条件都不成立时,连where子句都不会生成!
-
-
未完待续 : )
-
concat 函数 --> MySQL中字符串拼接函数
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-