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类
@Test public 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中字符串拼接函数