本篇笔记仅供学习使用
SQL简单查询
-
select DISTINCT 属性 from 表名; //查询并去除重复记录
-
select NAME as 姓名,math as 数学成绩,english as 英语成绩 FROM stu; //起别名展示查询的数据
-
select id,name,age,sex,address,math,english,hire_date from stu WHERE age BETWEEN 20 and 30; //查询年龄20到30之间
-
select id,name,age,sex,address,math,english,hire_date from stu WHERE age in (18, 20, 22); //查询年龄为18或20或22的数据
-
select id,name,age,sex,address,math,english,hire_date from stu WHERE english IS null; //SQL语句中与null值比较要用is和is not
-
select id,name,age,sex,address,math,english,hire_date from stu WHERE name like ‘马%’; //模糊查询中 "_"代表一个字符 "%"代表随意个字符
-
排序查询格式 : select 字段列表 from 表名 order by 排序字段 排序方式1, 排序方式2
// asc升序 desc降序, 如果有多个排序条件,当前面条件一样才会根据后面的条件进行排序
select id,name,age,sex,address,math,english,hire_date from stu GROUP BY age DESC; -
聚合函数 : count(列名) //求数量 max(列名) //求最大值 min(列名) //求最小值 sum(列名) //求和 avg(列名) //求平均值
注意 : null值不参与任何聚合函数的计算 -
分组查询语法 : select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]
select sex,avg(math),count() as 人数 from stu WHERE math > 70 GROUP BY sex desc HAVING count() > 2; //按性别分组查询分组后人数大于2的数学分数大于70的人的平均分和各组人数. -
分页查询语法 : select 字段列表 from 表名 limit 起始索引, 查询条目数;
计算公式 : 起始索引 = (当前页码 - 1) * 每页显示的条数
约束
- NOT NULL 非空约束
- UNIQUE 唯一约束
- PRIMARY KEY 主键约束
- CHECK 检查约束
- DEFAULT 默认约束 //不传值才生效
- FOREIGN KEY 外键约束 //语法格式 : CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
- PRIMARY KEY auto_increment 主键自增长 //不传值或传NULL才生效
多表查询
- 隐式内连接 : select 字段列表 from 表1,表2 where 条件;
- 显示内连接 : select 字段列表 from 表1 [inner] join 表2 on 条件
- 左外连接查询 : SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
- 右外连接查询 : SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
子查询
- 即查询中嵌套查询
- 子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断
- 子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断
- 子查询语句结果是多行多列,子查询语句作为虚拟表
事务
- 开启事务 : BEGIN
- 提交事务 : COMMIT
- 回滚事务 : ROLLBACK
Connection API 功能
- 获取执行SQL的对象
- 管理事务 ① setAutoCommit(false) //开启事务
② rollback() //事务回滚 ③ commit() //事务提交
PreparedStatement API
- 防止SQL注入
- 预编译, 默认关闭, 开启需要在SQL连接的URL中加入useServerPrepStmts=true
Mapper.xml中实体类与数据库字段名称不一致
- 使用resultMap标签映射数据库属性到实体类的属性
<resultMap id="BrandReslutMap" type="Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
// colum 数据库列 property 实体类属性
- 在xml文件中写数据库语言,占位符有两种,一为 #{}, 作用是替换为 ? , 二为 ${}, 作用是直接拼接字符串
- CDATA区用以转义字符, 例如<, 在xml中会识别为标签起始符, 会报错, 用区可有效化解
动态SQL
- if 标签
<if test="status != null">
status = #{status}
</if>
<if test="companyName != null and companyName !=''">
and company_name like #{companyName}
</if>
<if test="brandName != null and brandName != ''">
and brand_name like #{brandName};
</if>
/*存在问题: 第一个条件为空时报错
解决方法: where 后加入 1 = 1 恒等式拼接and
使用<where>标签*/
- chose(when, otherwise) : 相当于Java的switch
<where>
<choose>
<when test="status != null">
status = #{status}
</when>
<when test="companyName != null and companyName !=''">
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != ''">
brand_name like #{brandName}
</when>
</choose>
</where>
- 主键返回 :
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
- update修改 使用set标签达到动态SQL效果
<update id="updateAll">
update tb_brand
<set>
<if test="brandName != null and brandName != ''">
brand_name = #{brandName},
</if>
<if test="companyName != null and companyName != ''">
company_name = #{companyName},
</if>
<if test="ordered != null">
ordered = #{ordered},
</if>
<if test="description != null and description != ''">
description = #{description},
</if>
<if test="status != null">
status = #{status}
</if>
</set>
where id = #{id};
</update>
- 多条数据删除
<update id="updateAll"> //Mybatis会将集合数据封装为Map集合对象,所以要传递array
<delete id="deleteByIdAll">
delete from tb_brand
where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
- @Param注解 : 参数指向mapper.xml文件中传递的值的名称
- @Param注解的作用是修改Map集合中的键值
Mybatis 使用
- 首先获取SqlSessionFactory对象
- 第二步获取SqlSession对象
- 第三步获取Mapper
- 第四步使用Mapper调用方法
- 第五步释放资源
//第一步
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//第二步
SqlSession sqlSession = sqlSessionFactory.openSession();
//第三步
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//第四步
User user = userMapper.selectUser(username,password);
//第五步
sqlSession.close();
form表单
- 单选框 redio 提交要设置value属性, 才能将我们设置的值提交上去
Javascript语言
- var定义变量特点 : ①全局有效 ②可以重复定义
- let定义变量特点 : ①局部代码块有效 ②不可重复定义
- const : 用来申明常量
五种原始数据类型 (类似Java基本数据类型)
- number:数字(整数、小数、NaN(Not a Number))
- string:字符、字符串,单双引皆可
- boolean:布尔。true,false
- null:对象为空
- undefined:当声明的变量未初始化时,该变量的默认值是 undefined
- == 判断进行类型转换 ===判断不进行类型转换
Javascript中的 String字符串
- trim()方法可以清除字符串两端的空白字符
DOM获取Element对象
- getElementById() :根据id属性值获取,返回单个Element对象
- getElementsByTagName() :根据标签名称获取,返回Element对象数组
- getElementsByName() :根据name属性值获取,返回Element对象数组
- getElementsByClassName() :根据class属性值获取,返回Element对象数组
Servlet生命周期
- Servlet方法实例化后,首先调用init()方法, 初始化该对象
- 每次请求Servlet后, Servlet服务器会调用service()方法, 没请求一次就调用一次
- 对象终止或服务终断后, 调用distroy()方法,仅调用一次
- @WebServlet( loadOnStartup = x) 设置x的值可以设置Servlet对象创建的时机, 设置为负数则在第一次创建Servlet对象的时候创建, 设置为0或正数则在服务器启动的时候创建, 数字越小优先级越高
想要提取出局部变量, 只需在成员变量声明一个同类型变量, 然后将局部变量赋值给成员变量就行
GET 和 POST 获取传递参数
- GET会携带参数到URL, 直接用方法getQureyString()获取请求参数
- POST参数在请求体中, 所以获取POST请求的参数要用获取字节输入流或者字符输入流
- POST请求获取参数乱码采用先编码再解码的方式, 如下:
//获取请求参数username
String username = req.getParameter("username");
System.out.println(username);
//将username编码, 表现为二进制存入byte数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//将编码后的username再进行utf-8格式的解码
username = new String(bytes, StandardCharsets.UTF_8);
System.out.println(username);
- GET请求获取参数, 直接设置输入流的格式, 即 : req.setCharacterEncoding(“UTF-8”);
Java 提供的URL编码 解码
Request请求资源转发
Response重定向
Response响应字节数据
Response响应字符数据
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("你好啊宝");
JSP页面
- Tomcat内部会将JSP页面转换成一个类在编译展示出来
-
JSP三种脚本
- ①<%… %>内容放在_jspService方法中
- ②<%=… %>内容放到out.print中, 作为其参数输出
- ③<%!.. %>内容放到类的成员位置
三层架构
Cookie使用
- setMaxAge()方法, 设置cookie的存活时间
- cookie存储中文要使用URL编码和解码
- cookie存储在浏览器中
Session使用
- session存储在服务端中
- sesion在服务端正常关闭的情况下会保存其中数据, 但默认保存时间为半小时
Session使用细节及自动销毁设置
Cookie和Session区别
Filter拦截器
- 拦截资源路径设置
- 拦截器拦截代码分为放行前代码和放行后代码, 服务器提起请求执行放行前代码, 客户端给出响应执行放行后
所以对request数据处在在放行前代码处理, 对response数据处理在放行后处理 - 放行代码 : chain.doFilter(request, response)
- 过滤器链没用在xml文件中配置,将按照类名排序决定先后执行顺序
拦截器设置未登录拦截时, 使用request获取URL会获取整个路径, 在进行放行资源时, 要用contains比对是佛出现在字符串中, 而不是用equal比对, 代码如下:
String[] utls = {"/css/","/login.jsp","/imgs/","/loginServlet","/register.jsp"
,"/registerUserServlet", "/yanzhenServlet"};
String url = res.getRequestURL().toString();
System.out.println(url);
for (String u : utls) {
if (url.contains(u)) {
chain.doFilter(request, response);
return;
}
}
Ajax 快速入门使用
//1. 创建对象
var name = document.getElementById("username").value;
var xhttp;
if (window.XMLHttpRequest) {
xhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//2. 发送请求
xhttp.open("GET", "http://localhost:8080/brand-demo/selectUserServlet?username=" + name);//发送请求到对应URL
xhttp.send();
//3. 获取响应
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
if(this.responseText == "true"){//this.responseText即Servlet返回参数, 判断参数做出相应操作 Servlet用response.getWriter().write()方法返回参数
document.getElementById("username_re").style.display = "";
}else{
document.getElementById("username_re").style.display = "none";
}
}
};
Axios 快速入门使用
JSON 基础语法
JSON 和 Java对象转换
response响axios传递json数据流要设置中文, 使用response.setContentType(“text/json;charset=utf-8”);设置, 才能识别json数据流
Servlet获取前端发来的JSON数据, 因为JSON数据在request请求体中, 所以Servlet可以通过request获取字符输入流, 再读取一行数据即可得到JSON数据
// 获取请求体数据
BufferedReader br = request.getReader();
String params = br.readLine();
Vue的快速入门
Vue常用指令
- v - bind
- v - on
- v - if // v - elese - if // v - else // v - show
- v - for 在标签上加了for循环, 所以div标签也会遍历多次
- vue生命周期
Vue中 v - on 绑定方法, 在new Vue中的JSON数据的键值为 methods, 而不是method
ELement快速入门
- 官网: https://element.eleme.cn/
- 而prop对应的status属性,在mabtis中查询的时候对应getStatus方法,同样改为statusStr则对应GetStatusStr方法