目录
HTML+CSS+JS学习
选择器优先级:id > 类 > 标签
JS
js中定义变量有三种方式:
- var:相当于定义一个全局变量,可重复声明,反复赋值
- let:相当于定义一个局部变量,不可重复声明
- const:相当于常量,值不可修改
- js中的数组
- js中的数组定义有两种方式
var a = new Array(1,2,3,..)
var a = [1, 2, 3, ..]
- js中数组是可变长,并且类型可变的
- 数组访问方法
字符串对象String
- DOM文档对象
- 事件绑定和监听
VUE框架学习
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
{{message}} - {{age}} <!-- 视图层 -->
</div>
<script>
const app = new Vue({ //创建一个Vue对象
el:"#app", //#id
data:{ //数据模型层
message:"Lani",
age:10
}
});
</script>
</body>
</html>
Ajax--异步JavaScript和XML
作用
- 数据交换:通过Ajax给服务器发送请求并获取服务器响应的数据
- 异步交互:不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术
1, 原生Ajax
2, 封装后的Axios
Axios入门
- 引入Axios的js文件
- 使用Axios发送请求,并获取响应结果
Vue项目结构
vue的特点:
- 热部署:当后台代码或数据模型变化后,页面会自动更新
- 在Vue中使用Element UI组件
1, 首先npm安装Element至本项目中
2, 在main.js入口文件中导入相关文件
4, 新增xxx.vue文件,按照'template' 'script' 'style'的格式编写该组件代码
5, 在App.vue中导入xxx.vue文件并将其显示
Maven
Maven的作用----管理和构建Java项目的工具
- 依赖管理:方便快捷的管理项目依赖的资源jar包,避免版本冲突问题
- 统一项目结构:提供标准、统一的项目结构
- 项目构建:标准化的项目构建流程
- Maven的配置
https://cloud.tencent.com/developer/article/2389319
IDEA配置Maven
Maven坐标
Maven坐标是资源的唯一标识,通过坐标来唯一定位资源的位置
使用坐标来定义项目或引入项目所需的依赖
依赖管理
引入依赖:
- 在pom.xml中编写
<dependencies>
标签- 在
<dependencies>
中编写<dependency>
标签,创建一个依赖配置- 定义坐标的
groupId
,artifactId
,version
- 点击刷新依赖,引入所需的依赖
传递依赖&排除依赖
在Maven中,如果一个项目直接依赖于另一个项目,那么这个项目也会间接依赖于另一个项目的依赖,这种机制叫做传递依赖
- 排除依赖:可以通过
<exclusions>
标签主动排除指定坐标的依赖,不用指明版本
依赖范围
默认下依赖的jar包可以在任何地方使用,但可以通过
<scope>
标签设置其作用范围
生命周期
Maven的生命周期主要有三套:1、clean 2、default 3、site
主要的生命周期:
在生命周期中,执行同一种生命周期中某一周期,默认都会执行前面的生命周期,可以禁止。
主要有两种执行生命周期的方式:
- 在cmd中打开项目,执行mvn clean等命令
- 在IDEA中直接点击对应生命周期的脚本,执行对应的插件
Web入门
springboot快速入门
- 创建springboot工程,填写模块信息,勾选Web相关依赖
- 新增请求处理类和方法,打上请求处理注解
@RestController
和请求匹配@RequestMapping("/hello")
注解- 运行
SpringApplication.run
方法,在浏览器访问localhost:8080/hello
注意:如果不在springboot项目启动的类上加入
@SpringBootApplication
注解,将会报以下错误:Check your application's dependencies for a supported servlet web server. Check the configured web application type.
HTTP协议
HTTP请求数据格式
主要分为三个部分:
- 请求行:请求数据第一行(请求方式、资源路径、协议)
- 请求头:第二行开始(格式:key-value键值对)
- 请求体:一般是POST请求,存放请求参数
请求方式:
- GET:请求参数直接放在请求行,没有请求体,有长度限制
- POST:请求参数放在请求体
HTTP响应数据格式
- 响应行:响应数据的第一行(协议、状态码、描述)
- 响应头:第二行开始(格式:key-value键值对)
- 响应体:存放响应的数据
响应状态码:
Tomcat
Tomcat是一个开源免费的轻量级Web服务器,支持少量JavaEE规范
将要部署的应用程序放在
webapps/
目录下,即可在浏览器中进行访问,springboot的Web依赖中已经内嵌了Tomcat
请求响应
DispatcherServrlet——前端控制器
1、请求
- postman
一款功能强大的网页调试与发送网页HTTP请求的插件,常用于进行接口测试
请求参数设置
- 原始方式(了解)
Controller方法形参中声明
HttpServletRequest
对象通过
getParameter
方法获取对应参数
- springboot简单参数方式
请求参数名与请求方法形参名一致,不一致会获取到
null
值当两者不一致时,可通过
@RequestParam(name = "请求参数名")
注解来完成映射,该注解有个required
参数,表示该请求参数是否必须传递,false可表明为非必须传递参数@RequestMapping("/simpleParam") public String simpleParam(@RequestParam(name = "name", required = false) String uname, Integer age){ System.out.println(uname+":"+age); return "OK~"; }
- 实体参数
当请求传递的参数较多时,可以使用一个实体对象作为请求函数的形参,然后将请求传递的参数一一对应的添加到实体对象的属性中,添加get/set方法
@RequestMapping("/simpleParam") public String simpleParam(User user){ System.out.println(user); return "OK~"; }
当实体对象A中又包含一个实体对象B时,浏览器请求传递的参数可写为
B.param1&B.param2&...
,springboot会自动接收这些参数
- 数组集合参数
当传递的参数为同一名字多个值的列表时,形参声明如下:
- 数组:请求参数名与形参变量名一致
- 列表:请求参数名与形参变量名一致,并且需加上
@RequestParam
注解@RequestMapping("/listParam") public String listParam(@RequestParam List<String> hobby){ System.out.println(hobby); return "OK~"; }
- 日期参数
请求参数名与形参变量名一致,并加入
@DateTimeFormat
注解格式化接收请求参数@RequestMapping("/dateParam") public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){ System.out.println(updateTime); return "OK~"; }
- JSON参数
前端使用post请求方式
后端使用一个POJO的类型对象即可接收JSON格式参数,JSON数据
key名
与形参对象的属性名
相同,定义POJO对象类型形参即可接收参数,形参需使用@RequestBody
注解标识@RequestMapping("/jsonParam") public String jsonParam(@RequestBody User user){ System.out.println(user); return "OK~"; }
- 路径参数
路径参数http://localhost:8080/path/1/herry中的部分子串也可以接收,主要涉及两处修改:
- @RequestMapping("/path/{id}/{name}")注解:
{}
括住的参数为可变参数,形参变量名要与其一致- @PathVariable注解:在形参列表中,每个参数都要加上这个注解,表示接收一个路径变量
@RequestMapping("/path/{id}/{name}") public String pathParam(@PathVariable Integer id, @PathVariable String name){ System.out.println(id + ":" + name); return "OK~"; }
2、响应
响应通常用到
@ResbonseBody
注解,可添加与类或方法上可直接返回结果,如果返回的类型是对象/集合,则自动转换为JSON格式返回
@RestController
注解中默认包含了该注解统一响应结果
Result对象
3、案例
Springboot项目的静态资源(html, css, js等前段资源)默认存放路径为:
classpath:/static、classpath:/public、classpath:/resources.
src下的resources
就是一个classpath
4、分层解耦
三层架构
分层解耦
控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想叫做控制反转
依赖注入:Dependency Injection,简称DI。容器为程序提供运行时,所依赖的资源,称为依赖注入
Bean对象:IOC容器中创建、管理的对象
步骤:
- Service层及Dao层的实现类,交给IOC容器管理
- 为Controller及Service注入运行时,依赖的对象
将对象的创建交给容器,使用@Component注解来标识一个类,代表将此类的对象创建交由容器来管理——"控制反转"
在对象声明的地方加上@Autowired注解,表明在此对象由容器动态创建,不需要自己new——"依赖注入"
在Springboot中还衍生了具体的控制反转注解,推荐使用衍生注解
声明bean时,可以通过注解的value属性指定bean的名字,默认为类名首字母小写
在springboot集成web开发中,声明控制器bean只能用@Controller
声明了bean后并未立刻生效,需要配置
@ComponentScan
扫描注解扫描后才生效,而@SpringBootApplication
默认包含该注解,默认扫描当前包及子包
MySQL
MyBatis
Mybatis快速入门
- 创建springboot工程,数据库表user和对应实体类User,其中User的属性要与表user字段相同
- 引入Mybatis依赖,springboot创建时勾选后会自动添加Mybatis的相关依赖。接着配置Mybatis数据库连接信息
//路径:resources/application.properties
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
- 编写SQL语句,在mapper包中新增UserMapper接口,并添加
@Mapper
注解将该接口交给IOC容器管理。接着再添加对应接口方法,并在方法上添加@Select("sql语句")
等注解,最后通过依赖注入
通过对象调用对应方法执行相应SQL语句
@Mapper //在运行时会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
//查询全部用户信息
@Select("select * from user")
public List<User> list();
}
数据库连接池
就是一个容器,用于管理多个连接对象,用户在执行sql语句的时候,从连接池中获取一个连接对象,执行完后再释放该连接对象
- 切换数据库连接池:直接引入相应的数据库连接池
坐标
lombok
lombok是一个实用的java类库,能通过注解的形式自动生成构造器,get/set方法,equals/hashcode方法,toString等方法,并可以自动生成日志变量,简化java开发,提高效率
注解 | 作用 |
---|---|
@Getter/@Setter | 为所有属性提供get/set方法 |
@ToString | 给类自动生成易阅读的toString方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写equaks和hashCode方法 |
@Data | 提供更综合的代码生成功能(包含以上三个注解) |
@NoArgsConstructor | 为实体类生成无参的构造器方法 |
@AllArgsConstructor | 生成除static修饰的字段之外带有各参数的构造器方法 |
CRUD
- 删除
//mybatis语法中,可使用'#{name}'占位符来标识函数的形参,从而动态的执行SQL语句
@Mapper
public interface EmpMapper {
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);
}
- 插入
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into emp(username,name,gender,image,job,dept_id,entrydate,create_time,update_time)" +
"values(#{username},#{name},#{gender},#{image},#{job},#{deptId},#{entrydate},#{createTime},#{updateTime})")
public void insert(Emp emp); //新增插入方法,由于参数较多,因此形参使用实体对象封装,Mybatis会自动匹配该形参对象的属性
/*
1. 占位符#{}中的为对象的属性名
2. 使用@Options注解可以返回主键值
useGeneratedKeys = true代表要返回主键值
keyProperty = "id"代表将其封装到Emp对象的'id'属性中
*/
- 更新
@Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id}")
public void update(Emp emp);
- 查询
/*1、精确查询*/
@Select("select * from emp where id=#{id}")
public Emp select(Integer id); //Mybatis会将查询返回的字段自动封装到方法的返回类型实体类Emp的对象的属性中,一一对应
/*模糊查询*/
//在模糊查询时,由于参数占位符#{}不能直接写在''中,因此必须得用SQL中的concat(str1,str2,...)--字符串拼接函数来拼接,若直接使用${}占位符则会有"性能和安全"问题
@Select("select * from emp where name like concat('%',#{name},'%') " +
"and gender=#{gender} and + entrydate between #{begin} and #{end}" +
"order by update_time desc " +
"limit 10;")
public List<Emp> select(String name, Short gender, LocalDate begin, LocalDate end);
但只有字段名=属性名时,Mybatis才会将字段值封装到对应的属性
如果字段名与属性名不同,可以使用如下三种方式解决:
总结
总的来说,Mybatis极大得简化了持久层的操作
- 可以通过注解来指定某种类型的DAO操作,代码简洁
- 安全性高(通过
预编译
防SQL注入)自动封装
,可将函数的形参通过占位符#{形参名/形参对象属性名}封装为SQL语句参数中的字段值,或将SQL返回的字段值自动封装到对应的返回实体类对象的属性中
XML文件映射
在Mybatis中,除了使用注解方式执行SQL语句,还可以配置XML映射文件来执行一些比较复杂的SQL语句
- XML映射文件定义规范
- XML文件的名称与Mapper接口名称一致,并且放置在相同包下(同包同名)
- XML文件的namespace属性为Mapper接口全限定名一致
- XML文件中sql语句的id与Mapper接口中的方法名一致
<!-- xml文件标准头 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- `<mapper>`标签绑定一个mapper接口,要求使用接口全限定名并且与对应Mapper接口名一致 --> <mapper namespace="com.itheima.mapper.EmpMapper"> <!-- `<select>`标签声明一个SQL查询的事务 --> <!-- 通过`id`绑定接口中的同名方法 `resultType`绑定返回值单个元素类型 --> <select id="select" resultType="com.itheima.pojo.Emp"> <!-- 编写SQL语句 --> select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc limit 10 </select> </mapper>
Mybatis动态SQL
- 动态插入——
<if>
标签
使用<if>
标签进行SQL语句拼接的控制,根据test
属性封装的条件进行判断,如果test为true则拼接该SQL语句
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<select id="select" resultType="com.itheima.pojo.Emp">
select * from emp where
<if test="name != null">name like concat('%',#{name},'%')</if>
<if test="gender != null">and gender=#{gender} </if>
<if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>
order by update_time desc
limit 10
</select>
</mapper>
- 条件语句——
<where>
标签
<where>
标签表示当有条件子标签
为true时,会自动生成where条件SQL语句,并且会自动去除无效的开头 and/or
<mapper namespace="com.itheima.mapper.EmpMapper">
<select id="select" resultType="com.itheima.pojo.Emp">
select * from emp
<where>
<if test="name != null">name like concat('%',#{name},'%')</if>
<if test="gender != null">and gender=#{gender} </if>
<if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>
</where>
order by update_time desc
limit 10
</select>
</mapper>
update
语句——<set>
标签
<set>
会动态的在行首插入SET
关键字,并且会自动删除行首或行尾无效的逗号
<update id="update">
update emp
<set>
<if test="username != null">username=#{username}</if>
<if test="name != null">,name=#{name}</if>
<if test="gender != null">,gender=#{gender}</if>
<if test="image != null">,image=#{image}</if>
<if test="job != null">,job=#{job}</if>
<if test="entrydate != null">,entrydate=#{entrydate}</if>
<if test="deptId != null">,dept_id=#{deptId}</if>
<if test="updateTime != null">,update_time=#{updateTime}</if>
</set>
where id=#{id}
</update>
- 遍历列表参数——
<foreach>
标签
如果我们要进行批量删除delete
操作,而接口函数的参数是一个集合类型时,我们可以使用foreach标签来动态拼接sql语句
<!--
语法格式:<foreach collection="" item="" separator="" open="" close="">
collection:要遍历的集合名
item:遍历出来的元素名
separator:元素之间使用的分割符
open:遍历开始前拼接的字段
close:遍历开始后拼接的字段
-->
<delete id="delete">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<sql>
与<include>
标签
<sql>
标签用于包含可重用的SQL代码段,而<include>
标签用于根据其属性id
来引用并拼接<sql>
代码段
<sql id="selectAllFiled">
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp
</sql>
<select id="select1" resultType="com.itheima.pojo.Emp">
<include refid="selectAllFiled"/>
where id=#{id}
</select>
标签:依赖,JavaWeb,name,第一天,参数,注解,id,请求
From: https://www.cnblogs.com/six-years/p/18323302