day03笔记
1.null是Object数据类型的一个值
2.数值类型异常NaN,NaN属于number数据类型
3.位运算符:没有无符号左移
4.undefined是未赋值时的默认值
5.整个页面属于window对象,window.alert()
6.利用LVHA原理来给链接应用样式 :如果你想展现不同状态的链接样式,一定要记住link-visited-hover-active的顺序,或者简写为LVHA。
day04笔记
1.笔记
replaceChild(修改后标签,修改前标签),不加引号
appendChild(标签名),不加引号
insertBefore(要插入的标签名,参考标签);不加引号
2.document.getElementsByClassName(“dd”);这几个的返回值是什么
- 根据id获取元素
document.getElementById(“id值”); 返回整个标签元素 - 根据class获取元素
document.getElementsByClassName(“class值”); 返回HTMLCollection - 根据标签名获取元素
document.getElementsByTagName(“标签名”);返回HTMLCollection - 根据标签的name属性 获取元素
document.getElementsByName(“name值”); 返回 NodeList
3.创建循环定时器
4.NodeList()和HTMLCollection()的区别(了解)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function change() {
/*在有搜索条件时,俩个没有区别*/
var input = document.getElementsByName("inputname");
console.log(input);
input[0].innerHTML
input[0].innerText
var dd=document.getElementsByTagName("p");
console.log(dd);
// dd[0].inn
// var v=document.getElementById("d1");
// v.style.color="red";
// console.log(v);
// var body1 = document.getElementsByTagName("body")[0];
// var l = body1.childNodes;
// var l2 = body1.childElementCount;
// console.log(l.length);/*NodeList 节点 包括换行、空文本、标签*/
// console.log(l2);/*HTMLCollection 只包含标签相关的*/
}
</script>
<style>
</style>
</head>
<body>
<p id="d1">锄禾日当午</p>
<p>汗滴禾下土</p>
<input type="button" value="修改div中文本的字体颜色" onclick="change()">
<input type="text" name="inputname">
day05笔记
jquery中int型默认11位
选择器gt()
在代码中 tr:even:gt(2)代表的意思是找tr为偶数的且是第三个往后。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="jquery-3.5.1.js"></script>
<script>
$(function () {
$("tr:even:gt(2)").css("backgroundColor", "red");
$("tr:odd").css("backgroundColor", "green");
})
</script>
</head>
<body>
<table border="1" cellspacing="0" width="400px" height="400px">
<caption>学生表</caption>
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>爱好</th>
</tr>
<tr>
<td>张三</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
<tr>
<td>李四</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
<tr>
<td>王五</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
<tr>
<td>赵六</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
<tr>
<td>张三</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
<tr>
<td>张三</td>
<td>男</td>
<td>23</td>
<td>男</td>
</tr>
</table>
</body>
</html>
day07笔记
DQL查询中只有order by可以使用别名
分组查询:分组前查询和分组后查询的区别
SELECT AVG(salary),department_id//分组后的字段
FROM employees
WHERE commission_pct
IS NOT NULL
GROUP BY department_id//分组
HAVING AVG(salary)> 5000;//分组后AVG(salary)字段; 分组前没有该字段,所以不能用(分组前比较)where AVG(salary)>5000;
数据库中什么时候用反引号什么时候用单引号??
反引号用于字段(反引号与不用任何符号等价)表示该字段下的整列值;单引号用于变量、字符串,具体的某一个字符串,比如DML在插入值时
主键与外键
数据库中表的字段 主键约束primary key 会生成索引。添加外键后也会生成索引。
mysql常见五个约束关于索引
primary key、unique、foreign key、not null、default五个约束中只有primary key、unique、foreign key会生成索引
day08笔记(重点DML、DQL、主键外键)
关于今天笔记中补充函数的说明
1.AVG()函数参数可以是字段也可以是表达式
2.length()函数求得是字符个数。utf-8中中文占三个字符
3.trim()只能删除字符两端的空格,不能删除字符之间的空格
例子:SELECT LENGTH(TRIM(“哈”));//结果为3,在utf-8中汉字占3个字符
4.sum()会自动忽略null值
5.补充函数:substr(str,起始索引,截取个数) 截取字符串
注意:数据库中的字符串索引是从1开始的
关于作业
作业1:分组后可以查到分组的字段和分组函数
作业2:别名的as字段可以省略
作业5:查询结果去重distinct
07作业第七题
关于分组查询
- 查询的数据只能是 分组字段和分组函数的结果 。 分组函数(聚合函数):传递多个值 返回一个结果,分别是avg() 平均值 max() min() sum() count()
关于多表查询
1.SQL92格式中的关键字顺序固定
2.SQL99内连接中表的顺序随意。外连接中表的顺序不能换,要分主表和从表
关于内外自连接
1.多表查询SQL92中几张表用存在外键关系吗
内连接和外连接与外键无关,另外外键只是为了保证数据的正确性
2.左外连接:以左侧为主表,查询主表中所有数据,有关系的显示数据,没有关系的 显示null
3.内连接查询有关系的数据。外连接查询没有关系的数据,有主从表之分。
4.自连接:数据来自同一个表。非等值连接和等值连接的区别?
关于子查询
- 任意all:和所有的比较。任一any:和最大值比较
day09笔记
关于事务
1.笔记中事务的四种隔离级别案例演示
案例演示注意事项:
select @@tx_isolation #查看当前数据库隔离级别,数据库隔离级别默认repeatable read 。
@@代表查看数据库全局变量对整个数据库都有作用 演示repeatable-read卖家提交之后再设置读已提交 。打开两个SQLyog,一个是买家一个是卖家,在卖家设置隔离级别set session transaction isolation level read uncommitted;。卖家开启手动事务查账show variables like ‘autocommit’; set autocommit=0;买家开启手动事务转账show variables like ‘autocommit’; set autocommit=0;卖家开启事务start transaction;和查询提交语句有格式要求:查询和提交缩进两格。另一个SQLyog中的买家start transaction ;和后面的更改表语句、提交、回滚语句有格式要求,缩进。
在演示下一个隔离级别时首先要提交,提交代表事务结束。
银行查账案例:只查看银行开启事务之前的信息。此时是设置隔离级别为repeatable read
演示幻读:
在银行开始事务之后在表中插入了一条数据,但在银行查不到事务开始之后的,令人觉得是表中没有该条数据,在银行事务中添加插入语句运行,此时报错“表中索引位置已存在数据”,叫做幻读
关于视图
1.一个表可以创建多个视图
关于存储过程
1.inout 只需要定义传出数据的类型
关于触发器
1.创建触发器
不能创建相同的触发器,报错:
This version of MySQL doesn’t yet support ‘multiple triggers with the same action time and event for one table’
一个表不能具有相同操作时间和事件的多个触发器”
面试题
触发器和存储过程的区别:触发过程手动调用,触发器自动调用(某一时刻)
关于存储引擎
某个表的存储引擎ENGINE:
数据库数据的存储地址:
1.innerDB
innerDB存储方式
day10笔记
需复习
1.Mysql中sql命令DML命令
复习
1.@’%’。
@'localhost’代表是本地连接
2.查询有关系的数据用内连接,查询没有关系的数据用外连接
3.接口作用:提供一种规范,降低耦合度
4.线程池的好处/为什么使用线程池?
①统一管理线程,包括线程的创建和销毁
②提高线程对象的复用性
③减少了线程创建和销毁的时间。程序一加载(编译时)就创建好线程,不用等待
5.关于DML命令
增删改返回值:insert、delete、update返回受影响条数即增删改的条数。
select查返回表数据
今日笔记
6.关于JDBC的CRUD操作中ResultSet接口问题
注意点:
①resultSet.next()指针开始时指向列名这一行,获取不了值,直接获取报错Before start of result set 。
②resultSet 是和resultSet.next()指针一块动的。
private static void queryMore() throws SQLException {
// 1. 加载驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2. 建立连接
Connection connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/0301db", "root", "root");
// System.out.println(connection==null?"连接失败":"连接成功");
// 3. 创建命令对象和SQL命令
Statement statement = connection.createStatement();
String sql = "select * from users";
// 4. 执行sql命令
ResultSet resultSet = statement.executeQuery(sql);
// 5. 处理结果
/*代码段一
//此时没有调用 resultSet.next();next()默认指向表头(字段行)
//此时resultSet的next()指针指向表头,获取不了表中数据报错Before start of result set
int uid = resultSet.getInt("uid");
String username = resultSet.getString("username");
float money = resultSet.getFloat("money");
System.out.println("uid:"+uid+"\t username:"+username+"\t money:"+money);
*/
/*代码段二
boolean next = resultSet.next();
System.out.println("next:"+next();
//resultSet 是和resultSet.next()指针一块动的
//因为有了 boolean next = resultSet.next();此时next()指向第一行数据
//此时是获取的第一行数据的uid、sername、money
int uid = resultSet.getInt("uid");
String username = resultSet.getString("username");
float money = resultSet.getFloat("money");
System.out.println("uid:"+uid+"\t username:"+username+"\t money:"+money);*/
//代码段三
//resultSet 是和resultSet.next()指针一块动的
//遍历表中的数据,并输出打印
while(resultSet.next()){
int uid = resultSet.getInt("uid");
String username = resultSet.getString("username");
float money = resultSet.getFloat("money");
System.out.println("uid:"+uid+"\t username:"+username+"\t money:"+money);
}
// 6. 释放资源 {【()】}
resultSet.close();
statement.close();
connection.close();
}
7.关于连接池
1.c3p0和dbcp(不常用了)的区别:
dbcp没有自动回收空闲连接功能。c3p0有自动回收空闲连接功能。c3p0是阿帕奇开源的
2…c3p0和druid的区别:
druid连接池是阿里开源的,监控性好,在连接过程中可以检测信息。
c3p0比druid效率高。
3. c3p0
百度搜素c3p0
https://www.mchange.com/projects/c3p0/#quickstart 快速入门
https://www.mchange.com/projects/c3p0/#configuration 查看配置信息
8.关于单元测试
1.单元测试相当于mian方法,并且可以创建多个
day14笔记
1. Cookie有效路径和访问路径的区别:
有效路径和访问路径没有关系。有效路径为了保护数据安全。有效路径的作用比如区分百度和京东的cookie
以下如何访问Servlet
package web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//urlPatterns访问路径
@WebServlet(name = "Servlet003" ,urlPatterns = "/servlet/cookie003")
public class Servlet003 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("xx", "这是Servlet003中的cookies");
//修改有效路径
cookie.setPath("/javaWeb004");
}
}
day16笔记
1.xml中配置默认首页,欢迎页的代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>(servlet路径或者jsp文件名)welcome.html</welcome-file>
</welcome-file-list>
</web-app>
day17笔记
1.IDEA中重新加载静态资源步骤:
Build->Rebuild Project->Build Artifacts->项目名->Rebuild
Build->Rebuild Project->Build Artifacts->项目名->Build
(项目下的out文件夹中是各个模块的静态资源。)
2.在IDEA zouye模块下的web->WEB-INF->index.jsp中引入web->jq->jquery-3.5.1.min.js文件
通过语句
<script src="${WEB-INF}/jq/jquery-3.5.1.min.js"></script>
或者
<script src="${pageContext.request.contextPath }/jq/jquery-3.5.1.min.js"></script>
其中 ${pageContext.request.contextPath } 表示获取项目名
引入
补充笔记:EL表达式
理解:
获取共享域中的数据
格式:
${name }
原理
以get方法的方式获取
day18笔记
1.三个共享域对象的创建销毁时机:
可以通过Listener测试共享域对象创建销毁时机。
- ServletContext是在项目运行时服务器就为每一个工程创建了一个ServletContext对象;服务器关闭时销毁。
- HttpSession是在访问.jsp、servlet时创建;session默认30分钟后销毁或者调用session.invalidate()方法手动销毁
在jsp文件中
<body>
<%
session.invalidate();
%>
</body>
- ServletRequest对象请求时创建,请求结束销毁
day19笔记
1.通过ajax的GET方式用户名唯一校验时报状态码500错误
ajax的GET方式:
具体错误信息:
错误原因:
xmlHttp.send()报错,路径问题。
解决:
xmlHttp.open(“GET”,“login?name=”+inp.value,true)中的路径login有问题,改成了loginServlet
day21笔记
1.案例:左侧导航栏点击在右侧显示相应信息
功能实现用到了a标签和iframe标签。
<a href=“stu.html” target="right"></a>
a标签的target=“frame名称”,其中href链接的是要显示在右侧的页面。
<iframe name="right"></iframe>
iframe标签作用是在一个页面中嵌套另一个页面
iframe的属性:frameborder="0"去除iframe的边框;width,height设置宽高
day24笔记
1.Method对象中invoke方法中第一个参数表示
invoke方法的第一个参数是一个对象。
此对象可以为:①方法持有者;②方法持有者的继承者。
例子:父类有方法
public class Father {
public void say(String name){
System.out.println("我是father叫"+name);
}
}
子类有方法
public class Son extends Father {
@Override
public void say(String name){
System.out.println("我是son我叫"+name);
}
}
测试类
public class TestInvoke {
public void test() throws Exception {
Class clazz = Class.forName("CloneObject.Father");//反射父类
Father father = new Father();//实例化父类
Son son = new Son();//实例化子类
Object object=clazz.newInstance();//获得一个新的父类对象
Method method = clazz.getMethod("say",String.class);
method.invoke(father,"爸爸");
method.invoke(son,"孩子");
method.invoke(object,"新的父亲");
}
public static void main(String[] args) throws Exception {
new TestInvoke().test();
}
}
结果
我是father叫爸爸
我是son我叫孩子
我是father叫新的父亲