1.轉發(forward)和重定向(redirect)的區別?
1).效率上
轉發(forward) > 重定向(redirect)
2).顯示上地址欄
重定向(redirect): 顯示新的URL
轉發(forward): 地址欄不變
3).數據上
轉發(forward): 可以共享request裏面的數據
重定向(redirect): 不能
4).請求次數
重定向(redirect): 兩次
轉發(forward): 一次
重定向是客戶端行爲,轉發是服務器行爲
重定向可以訪問自己的web應用以外的資源,在重定向過程中傳輸的信息會丟失.
請求轉發是服務器內部把一個request/response的處理權移交給另一個,對客戶而言,只知道最早的請求A,而不知道B,甚至C,D. 傳輸的信息不會丟失
2.CSS選擇器類型?
1)標籤選擇器(如: body div p ul li)
用戶點擊按鈕之後,所有<p> 元素全都隱藏
$(document).ready(function(){
$("button").click(function{
$("p").hide();
});
});
2) #id選擇器
當用戶點擊按鈕之後,有 id = "test" 屬性的元素將被隱藏
$(document).ready(function(){
$("button").click(function(){
$("#test").hide();
});
});
3) .class選擇器
用戶點擊按鈕之後帶有 class = "test" 屬性的元素隱藏
$(document).ready(function(){
$("button").click(function(){
$(".test").hide();
});
});
3. HTML和JSP的區別?
HTML: 靜態頁面
不需要指定編譯工具,只需要在TXT文檔中寫上HTML標記就就行
JSP: 動態頁面
需要經過JDK編譯之後後把內容發給客戶端去顯示
把JSP轉譯成一個servlet文件,然後在編譯成class文件,
當用戶訪問JSP文件時就執行class文件.
區別:
1.HTML能直接打開,JSP只能發佈到Tomact等服務器上才能打開
2.HTML頁面是靜態頁面,可以直接運行,
JSP頁面是動態頁面它運行時需要轉化爲Servlet
3.JSP在表頭中有編碼格式和導入包等
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 導入spring標籤庫 -->
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
4.JSP<%%>就可以寫java代碼了,而HTML沒有<%%>
4.Mysql和Oracle的區別?
1.Oracle是大型數據庫而Mysql是小型數據庫,
Oracle的市場佔有率達40%,Mysql只有20%左右.
Mysql是開源的,Oracle價格非常高
2.Oracle支持大併發,大訪問量
3.安裝所用的空間差別很大:
Mysql安裝完後才152M,而Oracle有3G左右,
且使用Oracle佔用特別大的內存空間和其它機器性能
4.Mysql和Oracle在操作上的區別:
(1)創建表:
Mysql有 create table if not exist 方式創建表,
對於在程序中自動實現表創建的情況很方便
Oracle不支持if not exist 和 drop table if exists 語句
(2)主鍵
Mysql一般使用自動增長類型,在創建表時,只需指定表的主鍵爲auto_increment,
插入記錄時,不需要指定該記錄的主鍵值.Mysql將自動增長.
Oracle不能使用auto_increment
Oracle的主鍵一般默認是4個字節,Mysql沒有要求
(3)單引號的處理
Mysql可以使用雙引號包起字符串
Oracle只能用單引號包起字符串
(4)Mysql和Oracle分頁處理
Oracle分頁:
Oracle分頁標準計算公式: page: 當前頁碼, pageSize: 每頁顯示個數
select * from (select rownum rn, zhou.*from zhou)
where rn between (page-1)*pagePage + 1 and page*pageSize;
Oracle分頁注意事項:
在使用rownum時,不能對rownum進行大於0的某一數的判斷,
因爲rownum必須從0開始遞增
---查詢第三條以後的記錄
錯誤的:select rownum,id,name ,salary from zhou where rownum > 3;
正確的: select * from (select rownum rn,zhou.* from zhou) where rn >3;
Mysql分頁查詢:
select * from 表名 limit 起始行號,行數
起始的行號從0開始,如果和order by連用,order by 在前
---列出總成績並且按照降序排列,只打印三行
select name,sum(score) from score group by name order by sum(score) desc limit 3;
(5) 字符串的模糊查詢
Mysql:
select * from 表名 where 字段名 like '%條件%';
%C: 以C結尾. C%: 以C開頭
Oracle: 不能使用索引,速度不快
---查詢名字中第二個字母是A的員工信息
select id,name from zhou where name like '_A%';
%:任意0到多個字符, _:任意一個字符
5.Servlet聲明週期?
通過調用 init( ) 方法進行初始化
調用 service( ) 方法來處理客戶端的請求
通過調用 destory( ) 方法終止(結束)
Servlet是由 JVM的垃圾回收器進行垃圾回收的
6.Resful風格?
Resful: 符合REST約束風格和原則的應用程序或設計
Http的請求動作一般分爲四種:
1) POST增加資源
2)GET獲取資源
3)PUT修改資源
4)DELETE刪除資源
前端的請求參數只能是GET或者POST,所以需要將POST請求轉化爲PUT/DELETE.
通過此過濾器HiddenHttpMethodFilter進行轉換,在前端發起請求時,
添加一個_method將,此參數的值指定爲請求類型PUT或者DELETE
PUT/DELETE不能設置一級路徑
@Controller
public class SecondController {
@RequestMapping(value="/testGET/{name}", method=RequestMethod.GET)
public String testGET(@PathVariable("name") String name){
System.out.println("查詢某個學生的信息");
return "hello";
}
@RequestMapping(value="/testPOST",method=RequestMethod.POST)
public String testPOST(){
System.out.println("添加某個學生");
return "hello";
}
@RequestMapping(value="/testPUT",method=RequestMethod.PUT)
public String testPUT(){
System.out.println("修改某個學生的信息");
return "redirect:hello.jsp";
}
@RequestMapping(value="/testDELETE",method=RequestMethod.DELETE)
public String testDELETE(){
System.out.println("刪除某個學生的信息");
return "redirect:hello.jsp";
}
}
//(2) hello.jsp
<h1>hello</h1>
//(3)index.jsp
<h1>REST風格架構</h1>
<form action="testGET/李白" method="get">
<input type="submit" value="get">
</form>
<br>
<form action="testPOST" method="post">
<input type="submit" value="post">
</form>
<br>
<form action="testPUT" method="post">
<input type="hidden" name="_method" value="put">
<input type="submit" value="put">
</form>
<br>
<form action="testDELETE" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="delete">
</form>
7. 存儲過程?
數據庫系統中一組提前編譯的PL/SQL語句程序語句集,其中可以封裝一些通用操作,
當我們需要執行這些通用操作時,可以通過制定存儲過程名和參數名來調用儲存過程
作用:
1.只需編譯一次,以後每次執行不需要重複編譯
2.可以對數據一些通用複雜操作進行封裝
3.可以反覆調用,減少工作量
存儲過程實例:
傳入員工id,給指定員工漲100元薪水,並且打印漲前和漲後薪水
set serveroutput on;
create or replace procedure raisesalary(empid IN number)
AS
--定義變量保存漲前和員工姓名
pname zhou.name%type;
psal zhou.salary%type;
begin
--獲取員工的漲前薪水,賦值給變量psal
select name,salary INTO pname,psal from zhou where id = empid;
--將指定員工薪資漲100
update zhou SET salary = salary + 100 where id = empid;
--打印漲前和漲後薪水
dbms_output.put_line('id:' || empid || ',' || 'name:' || pname || ',' || '漲前:' || psal || ',' || '漲後:' || (psal + 100) );
end;
/
--調用存儲過程
begin
raisesalary(1002);
raisesalay(1003);
end;
/
8. 觸發器? 觸發器的使用場景?
概念: (可以看成是監聽器)
數據庫中一個用於表相關的,存儲一段PL/SQL程序,主要作用是用監聽表中DML(data manipulation language數據操縱語言)操作,
當指定表上執行了insert update delete這些操作的語句時,
就會自動觸發存儲在觸發器中的PL/SQL語句
觸發器類型
(1)語句集觸發器(針對表)
在指定操作語句執行之前或之後會執行一次觸發器中的PL/SQL,無論這個操作影響了多少數據(一般是insert delete)
(2)行級觸發器(針對行)
觸發器語句作用的每一行記錄都會備被觸發,可以使用
:new和 :old兩個變量來記錄這一行數據被影響之前和之後的狀態(一般是update)
(3)創建觸發器語法
create[or replace] trigger trigger_name(觸發器名)
{berore | after}
{insert | delete | update[of column]}
on 表名
[for each row [where(條件)]]
declare
begin
PL/SQL程序
end;
/
(4)觸發器的使用場景:
1.複雜的安全性檢查
---禁止在非工作時間往數據表中插入數據(上午9點之前,下午18點之後)
create or replace trigger trigger_securityemp
before
insert on myemp
declare
begin
--判斷當前時間如果不是在9點到18點之間拋出異常,禁止插入
if extract(hour from systimestamp) + 8
not between 9 and 18 then raise_application_error(-20001,'禁止在非工作時間插入數據');
end if;
end;
/
insert into myemp (name, salary,obj) values ('碧瑤',6000,'銷售');
2.數據的確定
3.數據庫審計
4.數據的備份和同步
9.聯查(https://www.cnblogs.com/assasion/p/7768931.html)
inner join(等值連接) :只返回兩個表中聯結字段相等的行
select chinese.name from chinese inner join math on chinese.name = math.name;
left join(左聯接) :返回包括左表中的所有記錄和右表中聯結字段相等的記錄 :
select chinese.name,chinese.job,math.obj,math.score from chinese left join math on chinese.name = math.name;
right join(右聯接): 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
union去重:
union不會去重,union可以連接多個查詢語句,每個表的結構必須一致
select name from chinese union select name from math;
10.聚合函數, 分組
聚合函數:
1)平均成績: as:給字段起別名
select avg(age) as '平均成績' from student;
2)最大年齡
select max(age) as '最大年齡' from student;
3) select * from student where age = (select max(age) from student);
4)找出比平均年齡小的
select * from student where age < (select avg(age) from student);
5)該字段的記錄數
select count(sid) from student;
6)張三的平均成績
select avg(score) from score where name = '張三';
分組:
select 字段名 聚合函數 from 表名 group by 字段名[having 篩選條件]
注意:
1.前面已經執行完了,纔會執行having
2.select 後面出現的字段名必須是 group by 後面的字段名
1)列出每個人的平均成績和總成績
select name,avg(score) as '平均成績',sum(score) as '總成績' from score group by name;
2)列出平均成績大於70的人名和成績
select name,avg(score) as '平均成績' from score group by name having avg(acore) > 70;
3)列出平均成績 > 70 總成績 > 180的人
select name,avg(acore) as '平均成績', sum(score) as '總成績' from score
group by name having avg(score) > 70 or sum(score) > 180;
4)列出總成績並且按照升序排列 desc 降序
select name,sum(score) from score group by name order by sum(score);
5)列出每科的平均成績
select obj,avg(score) as '平均成績' from score group by obj;
6)列出總成績並且按照降序排列,並且只打印3行
select name,sum(score) from score group by name order by sum(score) desc limit 3;
11.外鍵
(1)作用: 可以爲兩張表後者多張表建立關聯,保證了數據之間的一致性,完整性等
一個表的外鍵肯定是另一張表的主鍵
主鍵所在的表稱之爲主表,外鍵所在的表稱之爲從表
一張表雖然只有一個主鍵,但可以有多個外鍵
目前只有mysql引擎爲innoDB時才支持外鍵(默認是innoDB)
(2)外鍵的約束模式:
1.set null: 閒置模式
主表記錄被刪除或者更改,從表相關記錄的外鍵置爲null;
2.cascade: 級聯操作
主表中刪除或者更新了某條信息,從表中與該表記錄有關的記錄也發生改變
3.district: 嚴格模式 no action: 和district一樣
當從表中有外鍵數據和主表關聯,主表中該條記錄就不能刪除或者更新
(父表不能刪除或者更新一個被子表引用的記錄)
(3)添加外鍵:
constraint: 約束
references: 參考
foreign key:外鍵約束
cascade: 主變從變 set null: 主變從爲空(null)
alter table st add constraint te_fy_st
foreign key(tid) references te(tid)
on delete set null on update set null;
(4)刪除外鍵
alter table st drop foreign key te_fy_st;
12.索引
(1)作用:
當某個表中某個字段經常作爲查詢條件(where 後面),並且表中有大量的數據,
該表經常作爲查詢條件,這時就可以將該字段作爲索引,提高查詢效率,
但是降低了增刪改的效率
(2)索引的創建
2.1單例索引: 基於表中某一經常查詢列來創建索引
create [unique] index 索引名 on 表名(字段名); unique:創建唯一索引
2.2複合索引:
基於多列來創建的索引,比如經常需要根據某兩列來進行order by排序時會使用到
---基於myemp表的deptno salary 兩列來創建複合索引
create index idx_myemp_deptno_salary on myemp(depton,salary);
---在執行以下查詢時,會自動調用上面的索引
保證order by 列的順序和創建索引時,列的順序一致,複合索引纔會起作用
select id,name,deptno,salary from myemp order by deptno ASC, salary DESC;
(3)索引的重建和刪除
3.1更新索引
如果表的索引列上經常執行DML操作,就需要對索引執行更新重建
語法: atler index 索引名 REBULLD;
3.2刪除索引
索引表中索引類列中有不合理的索引,會導致操作性能下降
語法: drop index 索引名
(4)索引的使用場景:
1.爲經常出現在where子句中列建立索引
2.爲經常出現在order by, distinct(關鍵字去重)後面的列建立索引
如果是複合索引,索引後面的列順序要和這些關鍵字後面列順序一致
3.爲經常出現做表連接的連接條件列上建立索引
4.不要在經常DML操作的列上建立索引
5.不要在數據量少的表上建立索引
6.限制表的索引數目,索引不是越多越好
7.刪除很少被使用,不合理的索引
13.MySql常用的?
DDL(數據庫定義語言)
1.創建數據庫:
create database if not exists 庫名 character set utf8 collate utf8_general_ci;
2.創建表:
create table if not exists 表名
(字段名 字段類型 字段約束,字段名 字段類型 字段約束....) character set utf8;
3.增加列:
alter table 表名 add (列1,列2.....)
4.修改列:
4.1修改字段名及其類型:
alter table 表名 change 舊列名 新列名 新列名類型
4.2修改字段類型
alter table 表名 modify 列名 新數據類型
5.刪除列:
alter table 表名 drop 列名,列名.....;
6.修改表名
rename table 舊錶名 to 新表名
7.複製表結構
create table if not exists 新表名 like 舊錶名;
DML:數據操縱語言:
1.增加行:
insert into 表名(字段1,字段2....) values (值1,值2....)....
2.刪除行:
delete from 表名 where 字段名 in (值1,值2....);
delete from 表名 [where 字段名 = 值1,字段名 = 值2];
3.修改行:
update 表名 set 字段名 = 值1, 字段名 = 值2....[where id = ?];
DQL數據庫查詢語言:
1.select 字段1,字段2......from 表名 [where 檢索條件];
2.select * from 表名
3.按照某個字段排序:
select * from 表名 order by 字段名[asc/desc];
4.模糊查詢: %C:以C結尾, C%: 以C開頭
select * from 表名 where 字段名 like '%條件%';
5.分頁查詢:
select * from 表名 limit 起始行號,行數;
起始的行號從0開始,如果和order by 連用,order by在前
6.聚合函數
avg(字段名): 該字段的平均數
max(字段名): 該字段的最大值
min(字段名): 該字段的最小值
count(字段名):該字段的記錄數
sum(字段名): 該字段的總和
聚合函數不能直接在where後面使用
---找出班級中年齡低於平均年齡的學員
select * from student where age < (select avg(age) from student);
運算符:
邏輯: not(非) or(或) and(與)
1.範圍查詢
select * from 表名 where 字段名 [not] between 值1 and 值2;
2.在一組值中匹配
select * from 表名 where 字段名 [not] in (值1,值2.......)
3.將null作爲索引的條件
select * from 表名 where name is [not] null;
14.數據庫的還原備份?
數據庫備份步驟:
1)新開一個終端
2) mysqldump -u root -p12345678 數據庫名字1 > 新路徑/數據庫名字2.sql;
3)回到之前的終端,刪除舊的數據庫: drop database 數據庫名字1;
4)新建一個數據庫, 起名爲: 數據庫名字2;
5)選擇數據庫: use 數據庫名字2;
6)解析數據: source 新路徑/數據庫名字2.sql;
15.Mysql優化?
(1) in 和 not in 要慎用,否則會導致全表掃描
select id from zhou where number in (1,2,3);
修改爲: select id from zhou where number between 1 and 3;
(2) 應儘量避免在where子句中使用or來連接條件,
否則會導致引擎放棄使用索引而進行全表掃描
select id from zhou where num = 10 or num = 20;
修改爲: select id from zhou where num = 10
union all
select id from zhou where num = 20;
(3) 如果在where子句中使用參數,也會導致全表掃描
select id from zhou num = @num;
修改爲強制查詢使用索引: select id from zhou with(index(索引名)) where num = @num;
(4)儘量避免在where子句中對字段進行表達式操作,將導致引擎放棄使用索引而全表掃描
select id from zhou where num/2 = 100;
修改爲: select id from zhou where num = 100 * 2;
(5)任何時候都不要使用select * from zhou,用具體的字段代替 * ,不要返回不需要的字段
(6)如果使用到臨時表,在存儲過程的最後務必將所有的臨時顯示刪除.
先 truncate table 然後 drop table
這樣可以避免系統表的較長時間鎖定