日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

Java面试宝典 HTML、js、ajax、数据库

發(fā)布時間:2023/12/8 HTML 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java面试宝典 HTML、js、ajax、数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

html&JavaScript&ajax部分

?

1. 判斷第二個日期比第一個日期大

如何用腳本判斷用戶輸入的的字符串是下面的時間格式2004-11-21必須要保證用戶的輸入是此格式,并且是時間,比如說月份不大于12等等,另外我需要用戶輸入兩個,并且后一個要比前一個晚,只允許用JAVASCRIPT,請詳細幫助作答,,

//這里可用正則表達式判斷提前判斷一下格式,然后按下提取各時間字段內(nèi)容

<script type="text/javascript">

window.onload =function()

{

//這么寫是為了實現(xiàn)js代碼與html代碼的分離,當(dāng)我修改js時,不能影響html代碼。

document.getElementById("frm1").οnsubmit=

function(){

vard1 = this.d1.value;

vard2 = this.d2.value;

if(!verifyDate(d1)) {alert("第一個日期格式不對");return false;}

if(!verifyDate(d2)) {alert("第二個日期格式不對");return false;}

if(!compareDate(d1,d2)){alert("第二個日期比第一日期小");return false;}

};

}

?

functioncompareDate(d1,d2)

{

var arrayD1= d1.split("-");

var date1 =new Date(arrayD1[0],arrayD1[1],arrayD1[2]);

var arrayD2= d2.split("-");

var date2 =new Date(arrayD2[0],arrayD2[1],arrayD2[2]);

if(date1> date2) return false;

return true;

}

?

functionverifyDate(d)

{

vardatePattern = /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;

returndatePattern.test(d);

}

</script>

?

<form id="frm1" action="xxx.html">

<input type="text" name="d1" />

<input type="text" name="d2" />

<input type="submit"/>

</form>

?

2. 用table顯示n條記錄,每3行換一次顏色,即1,2,3用紅色字體,4,5,6用綠色字體,7,8,9用紅顏色字體。

<body>

<table id="tbl">

<tr><td>1</td></tr>

<tr><td>2</td></tr>

<tr><td>3</td></tr>

<tr><td>4</td></tr>

<tr><td>5</td></tr>

<tr><td>6</td></tr>

<tr><td>7</td></tr>

<tr><td>8</td></tr>

<tr><td>9</td></tr>

<tr><td>10</td></tr>

</table>

</body>

<script type="text/javascript">

window.οnlοad=function()

{

var tbl =document.getElementById("tbl");

rows =tbl.getElementsByTagName("tr");

for(i=0;i<rows.length;i++)

{

var j= parseInt(i/3);

if(j%2==0)rows[i].style.backgroundColor="#f00";

else rows[i].style.backgroundColor="#0f0";

}

}

</script>

?

3、HTML的?form提交之前如何驗證數(shù)值文本框的內(nèi)容全部為數(shù)字?否則的話提示用戶并終止提交?

<form οnsubmit=’return chkForm(this)’>

<input type="text" name="d1"/>

<input type="submit"/>

</form>

<script type=”text/javascript”?/>

function chkForm(this)

{

var value = thist.d1.value;

var len =value.length;

for(vari=0;i<len;i++)

{

if(value.charAt(i)>"9"|| value.charAt(i)<"0")

{

alert("含有非數(shù)字字符");

returnfalse;

}

}

return true;

}

</script>

?

4、請寫出用于校驗HTML文本框中輸入的內(nèi)容全部為數(shù)字的javascript代碼

<input type="text" id="d1" οnblur=" chkNumber(this)"/>

<script type=”text/javascript”?/>

function chkNumber(eleText)

?

{

var value =eleText.value;

var len =value.length;

for(vari=0;i<len;i++)

{

if(value.charAt(i)>"9"|| value.charAt(i)<"0")

{

alert("含有非數(shù)字字符");

eleText.focus();

break;

}

}

}

</script>

除了寫完代碼,還應(yīng)該在網(wǎng)頁上寫出實驗步驟和在代碼中加入實現(xiàn)思路,讓面試官一看就明白你的意圖和檢查你的結(jié)果。

?

5、說說你用過那些ajax技術(shù)和框架,說說它們的區(qū)別

?

?

?Java Web部分

1、Tomcat的優(yōu)化經(jīng)驗

答:去掉對web.xml的監(jiān)視,把jsp提前編輯成Servlet。

有富余物理內(nèi)存的情況,加大tomcat使用的jvm的內(nèi)存

?

?

2、HTTP請求的GET與POST方式的區(qū)別

答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

3、解釋一下什么是servlet;

答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

4、說一說Servlet的生命周期?

答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

?

Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。

web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。

?

5、Servlet的基本架構(gòu)

public class ServletName extends HttpServlet {

public void doPost(HttpServletRequest request,HttpServletResponse response) throws

ServletException, IOException {

}

public void doGet(HttpServletRequest request,HttpServletResponse response) throws

ServletException, IOException {

}

}

6、SERVLET API中forward()與redirect()的區(qū)別?

答:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源,則必須使用

sendRedirect()方法。

?

7、什么情況下調(diào)用doGet()和doPost()?

Jsp頁面中的FORM標簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()。

?

8、Request對象的主要方法:

setAttribute(String name,Object):設(shè)置名字為name的request的參數(shù)值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request對象所有屬性的名字集合,結(jié)果是一個枚舉的實例

getCookies():返回客戶端的所有Cookie對象,結(jié)果是一個Cookie數(shù)組

getCharacterEncoding():返回請求中的字符編碼方式

getContentLength():返回請求的Body的長度

getHeader(String name):獲得HTTP協(xié)議定義的文件頭信息

getHeaders(String name):返回指定名字的request Header的所有值,結(jié)果是一個枚舉的實例

getHeaderNames():返回所以request Header的名字,結(jié)果是一個枚舉的實例

getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù)

getMethod():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法

getParameter(String name):獲得客戶端傳送給服務(wù)器端的有name指定的參數(shù)值

getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例

getParametervalues(String name):獲得有name指定的參數(shù)的所有值

getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱

getQueryString():獲得查詢字符串

getRequestURI():獲取發(fā)出請求字符串的客戶端地址

getRemoteAddr():獲取客戶端的IP地址

getRemoteHost():獲取客戶端的名字

getSession([Boolean create]):返回和請求相關(guān)Session

getServerName():獲取服務(wù)器的名字

getServletPath():獲取客戶端所請求的腳本文件的路徑

getServerPort():獲取服務(wù)器的端口號

removeAttribute(String name):刪除請求中的一個屬性

?

?

?

9、forward和redirect的區(qū)別

forward是服務(wù)器請求資源,服務(wù)器直接訪問目標地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。

redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。

10、request.getAttribute()和?request.getParameter()有何區(qū)別?

HttpServletRequest類既有g(shù)etAttribute()方法,也由getParameter()方法,這兩個方法有以下區(qū)別:
(1)HttpServletRequest類有setAttribute()方法,而沒有setParameter()方法
(2)當(dāng)兩個Web組件之間為鏈接關(guān)系時,被鏈接的組件通過getParameter()方法來獲得請求參數(shù),例如假定welcome.jsp和authenticate.jsp之間為鏈接關(guān)系,welcome.jsp中有以下代碼:
<a href="authenticate.jsp?username=weiqin"authenticate.jsp </a或者:<form name="form1" method="post" action="authenticate.jsp"
請輸入用戶姓名:<input type="text" name="username"
<input type="submit" name="Submit" value="提交"</form在authenticate.jsp中通過request.getParameter("username")方法來獲得請求參數(shù)username:
<% String username=request.getParameter("username"); %
(3)當(dāng)兩個Web組件之間為轉(zhuǎn)發(fā)關(guān)系時,轉(zhuǎn)發(fā)目標組件通過getAttribute()方法來和轉(zhuǎn)發(fā)源組件共享request范圍內(nèi)的數(shù)據(jù)。假定authenticate.jsp和hello.jsp之間為轉(zhuǎn)發(fā)關(guān)系。authenticate.jsp希望向hello.jsp傳遞當(dāng)前的用戶名字,如何傳遞這一數(shù)據(jù)呢?先在authenticate.jsp中調(diào)用setAttribute()方法:<%String username=request.getParameter("username");
request.setAttribute("username",username);%<jsp:forward page="hello.jsp" /
在hello.jsp中通過getAttribute()方法獲得用戶名字:
<% String username=(String)request.getAttribute("username"); %
Hello: <%=username %
從更深的層次考慮,request.getParameter()方法傳遞的數(shù)據(jù),會從Web客戶端傳到Web服務(wù)器端,代表HTTP請求數(shù)據(jù)。request.getParameter()方法返回String類型的數(shù)據(jù)。
request.setAttribute()和getAttribute()方法傳遞的數(shù)據(jù)只會存在于Web容器內(nèi)部,在具有轉(zhuǎn)發(fā)關(guān)系的Web組件之間共享。這兩個方法能夠設(shè)置Object類型的共享數(shù)據(jù)。
request.getAttribute()方法返回request范圍內(nèi)存在的對象,而request.getParameter()方法是獲取http提交過來的數(shù)據(jù)。
一般是string型用request.getParameter
對象的引用用request.getAttribute
當(dāng)然啦,String也是對象。

?

11. jsp有哪些內(nèi)置對象?作用分別是什么?分別有什么方法?

答:JSP共有以下9個內(nèi)置的對象:

request?用戶端請求,此請求會包含來自GET/POST請求的參數(shù)

response?網(wǎng)頁傳回用戶端的回應(yīng)

pageContext?網(wǎng)頁的屬性是在這里管理

session?與請求有關(guān)的會話期

application servlet?正在執(zhí)行的內(nèi)容

out?用來傳送回應(yīng)的輸出

config?servlet的構(gòu)架部件

page JSP網(wǎng)頁本身

exception?針對錯誤網(wǎng)頁,未捕捉的例外

?

request表示HttpServletRequest對象。它包含了有關(guān)瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header,和session數(shù)據(jù)的有用的方法。

response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法(如cookies,頭信息等)

out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。

pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對象的API,并且包裝了通用的servlet相關(guān)功能的方法。

session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息

applicaton?表示一個javax.servle.ServletContext對象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息

config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數(shù)。

page表示從該頁面產(chǎn)生的一個servlet實例

?

12. jsp有哪些動作?作用分別是什么?

(這個問題似乎不重要,不明白為何有此題)

答:JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個文件。

jsp:useBean:尋找或者實例化一個JavaBean。

jsp:setProperty:設(shè)置JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉(zhuǎn)到一個新的頁面。

jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記

?

13、JSP的常用指令

isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)

?

14. JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?

答:動態(tài)INCLUDE用jsp:include動作實現(xiàn)

<jsp:include page=included.jsp flush=true />它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)靜態(tài)INCLUDE用include偽碼實現(xiàn),定不會檢查所含文件的變化,適用于包含靜態(tài)頁面?<%@include file=included.htm %>

?

15、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?

(下面的回答嚴重錯誤,應(yīng)該是想問forward和sendRedirect的區(qū)別,畢竟出題的人不是專業(yè)搞文字藝術(shù)的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術(shù)面也可能存在一些問題,不一定真正將他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什么,不要一味想著是在答題)

答:有兩種,分別為:

<jsp:include page=included.jsp flush=true>

<jsp:forward page= nextpage.jsp/>

前者頁面不會轉(zhuǎn)向include所指的頁面,只是顯示該頁的結(jié)果,主頁面還是原來的頁面。執(zhí)行完后還會回來,相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁面,不會再回來。相當(dāng)于go to?語句。

?

16、頁面間對象傳遞的方法

request,session,application,cookie等

?

17、JSP和Servlet有哪些相同點和不同點,他們之間的聯(lián)系是什么?

JSP是Servlet技術(shù)的擴展,本質(zhì)上是Servlet的簡易方式,更強調(diào)應(yīng)用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。

?

18、MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?

答:MVC是Model-View-Controller的簡寫。Model代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實現(xiàn)),View是應(yīng)用的表示面(由JSP頁面產(chǎn)生),Controller是提供應(yīng)用的處理過程控制(一般是一個Servlet),通過這種設(shè)計模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用。

?

19、我們在web應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?

Public String translate(String str) {

String tempStr ="";

try {

tempStr = newString(str.getBytes("ISO-8859-1"), "GBK");

tempStr =tempStr.trim();

}

catch (Exception e) {

System.err.println(e.getMessage());

}

return tempStr;

}

?

20.現(xiàn)在輸入n個數(shù)字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結(jié)果為,提供reset

?

[html] view plain copy

  • import?java.util.*;??
  • public?class?bycomma{??
  • public?static?String[]?splitStringByComma(String?source){??
  • if(source==null||source.trim().equals(“”))??
  • return?null;??
  • StringTokenizer?commaToker?=?new?StringTokenizer(source,”,”);??
  • String[]?result?=?new?String[commaToker.countTokens()];??
  • int?i=0;??
  • while(commaToker.hasMoreTokens()){??
  • result[i]?=?commaToker.nextToken();??
  • i++;??
  • }??
  • return?result;??
  • }??
  • public?static?void?main(String?args[]){??
  • String[]?s?=?splitStringByComma(“5,8,7,4,3,9,1″);??
  • int[]?ii?=?new?int[s.length];??
  • for(int?i?=?0;i<s.length;i++){??
  • ii[i]?=Integer.parseInt(s[i]);??
  • }??
  • Arrays.sort(ii);??
  • //asc??
  • for(int?i=0;i<s.length;i++){??
  • System.out.println(ii[i]);??
  • }??
  • //desc??
  • for(int?i=(s.length-1);i>=0;i–){??
  • System.out.println(ii[i]);??
  • }??
  • }??
  • }??
  • ?

    ?

    ?

    ?

    ?

    數(shù)據(jù)庫部分

    1、用兩種方式根據(jù)部門號從高到低,工資從低到高列出每個員工的信息。

    employee: ??eid,ename,salary,deptid;

    select * from employee order by deptid desc

    ?

    ?

    2、列出各個部門中工資高于本部門的平均工資的員工數(shù)和部門號,并按部門號排序

    創(chuàng)建表:

    MySQL> createtable employee921(id int primary key auto_increment,name varchar(5

    0),salary bigint,deptid int);

    ?

    插入實驗數(shù)據(jù):

    mysql> insert into employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null

    ,'ww',1100,1),(null,'zl',900,1) ,(null,'zl',1000,2), (null,'zl',900,2),(null,'z

    l',1000,2) , (null,'zl',1100,2);

    ?

    編寫sql語句:

    ?

    ()select avg(salary) from employee921 group by deptid;

    ()mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

    tid tid from?employee921where salary > (select avg(salary) from employee921 where deptid = tid);

    效率低的一個語句,僅供學(xué)習(xí)參考使用(在group by之后不能使用where,只能使用having,在group by之前可以使用where,即表示對過濾后的結(jié)果分組):

    mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

    tid tid from?employee921where salary > (select avg(salary) from employee921 group by deptid havingdeptid = tid);

    ()select count(*) ,tid

    from (

    selectemployee921.id,employee921.name,employee921.salary,employee921.deptid tid

    from employee921

    where salary>

    (selectavg(salary) from employee921 where deptid = tid)

    ) as t

    group by tid ;

    ?

    另外一種方式:關(guān)聯(lián)查詢

    select a.ename,a.salary,a.deptid

    from emp a,

    (selectdeptd,avg(salary) avgsal from emp group by deptid ) b

    where a.deptid=b.deptidand a.salary>b.avgsal;

    ?

    3、存儲過程與觸發(fā)器必須講,經(jīng)常被面試到?

    create procedure insert_Student (_name varchar(50),_age int ,out_id int)

    begin

    insert into studentvalue(null,_name,_age);

    select max(stuId)into _id from student;

    end;

    ?

    call insert_Student('wfz',23,@id);

    select @id;

    ?

    mysql> create trigger update_Student BEFORE update on studentFOR EACH ROW

    -> select * from student;

    觸發(fā)器不允許返回結(jié)果

    ?

    create trigger update_StudentBEFORE update on student FOR EACH ROW

    insert into?student value(null,'zxx',28);

    mysql的觸發(fā)器目前不能對當(dāng)前表進行操作

    ?

    create trigger update_StudentBEFORE update on student FOR EACH ROW

    delete from articles?where id=8;

    這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的所有帖子

    這里要注意使用OLD.id

    ?

    觸發(fā)器用處還是很多的,比如校內(nèi)網(wǎng)、開心網(wǎng)、Facebook,你發(fā)一個日志,自動通知好友,其實就是在增加日志時做一個后觸發(fā),再向通知表中寫入條目。因為觸發(fā)器效率高。而UCH沒有用觸發(fā)器,效率和數(shù)據(jù)處理能力都很低。

    存儲過程的實驗步驟:

    mysql> delimiter |

    mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out

    pId int)

    -> begin

    -> insert into article1value(null,pTitle,pBid);

    -> select max(id) into pId fromarticle1;

    -> end;

    -> |

    Query OK, 0 rows affected (0.05sec)

    ?

    mysql> callinsertArticle_Procedure('傳智播客',1,@pid);

    -> |

    Query OK, 0 rows affected (0.00sec)

    ?

    mysql> delimiter ;

    mysql> select @pid;

    +------+

    | @pid |

    +------+

    | 3?|

    +------+

    1 row in set (0.00 sec)

    ?

    mysql> select * fromarticle1;

    +----+--------------+------+

    | id | title?| bid |

    +----+--------------+------+

    | 1?| test | 1 |

    | 2?| chuanzhiboke | 1 |

    | 3?|?傳智播客?| 1 |

    +----+--------------+------+

    3 rows in set (0.00 sec)

    ?

    觸發(fā)器的實驗步驟:

    create table board1(id intprimary key auto_increment,name varchar(50),ar

    ticleCount int);

    ?

    create table article1(id intprimary key auto_increment,title varchar(50)

    ,bid int referencesboard1(id));

    ?

    delimiter |

    ?

    create triggerinsertArticle_Trigger after insert on article1 for each ro

    w begin

    -> update board1 setarticleCount=articleCount+1 where id= NEW.bid;

    -> end;

    -> |

    ?

    delimiter ;

    ?

    insert into board1 value(null,'test',0);

    ?

    insert into article1value(null,'test',1);

    還有,每插入一個帖子,都希望將版面表中的最后發(fā)帖時間,帖子總數(shù)字段進行同步更新,用觸發(fā)器做效率就很高。下次課設(shè)計這樣一個案例,寫觸發(fā)器時,對于最后發(fā)帖時間可能需要用declare方式聲明一個變量,或者是用NEW.posttime來生成。

    ?

    4、數(shù)據(jù)庫三范式是什么?

    第一范式(1NF):字段具有原子性,不可再分。所有關(guān)系型數(shù)據(jù)庫系統(tǒng)都滿足第一范式)

    數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作為一個整體,無法區(qū)分哪部分是姓,哪部分是名,如果要區(qū)分出姓和名,必須設(shè)計成兩個獨立的字段。

    ?

    第二范式(2NF):

    第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。

    要求數(shù)據(jù)庫表中的每個實例或行必須可以被惟一地區(qū)分。通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關(guān)鍵字或主鍵。

    ?

    第二范式(2NF)要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實體,新實體與原實體之間是一對多的關(guān)系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關(guān)鍵字。

    ?

    第三范式的要求如下:

    滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。

    所以第三范式具有如下特征:
    1,每一列只有一個值
    2,每一行都能區(qū)分。
    3,每一個表都不包含其他表已經(jīng)包含的非主關(guān)鍵字信息。

    例如,帖子表中只能出現(xiàn)發(fā)帖人的id,而不能出現(xiàn)發(fā)帖人的id,還同時出現(xiàn)發(fā)帖人姓名,否則,只要出現(xiàn)同一發(fā)帖人id的所有記錄,它們中的姓名部分都必須嚴格保持一致,這就是數(shù)據(jù)冗余。

    ?

    5、說出一些數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗?

    用PreparedStatement一般來說比Statement性能高:一個sql發(fā)給服務(wù)器去執(zhí)行,涉及步驟:語法檢查、語義分析,編譯,緩存

    “inert into user values(1,1,1)”-à二進制

    “inert into user values(2,2,2)”-à二進制

    “inert into user values(?,?,?)”-à二進制

    ?

    ?

    ?

    有外鍵約束會影響插入和刪除性能,如果程序能夠保證數(shù)據(jù)的完整性,那在設(shè)計數(shù)據(jù)庫時就去掉外鍵。(比喻:就好比免檢產(chǎn)品,就是為了提高效率,充分相信產(chǎn)品的制造商)

    (對于hibernate來說,就應(yīng)該有一個變化:empleyee->Deptment對象,現(xiàn)在設(shè)計時就成了employeeàdeptid)

    ?

    看mysql幫助文檔子查詢章節(jié)的最后部分,例如,根據(jù)掃描的原理,下面的子查詢語句要比第二條關(guān)聯(lián)查詢的效率高:

    1.?select e.name,e.salarywhere e.managerid=(select id from employee where name='zxx');

    ?

    2.?select e.name,e.salary,m.name,m.salary fromemployees e,employees m where

    e.managerid = m.id andm.name='zxx';

    ?

    表中允許適當(dāng)冗余,譬如,主題帖的回復(fù)數(shù)量和最后回復(fù)時間等

    將姓名和密碼單獨從用戶表中獨立出來。這可以是非常好的一對一的案例喲!

    ?

    sql語句全部大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加需要統(tǒng)一大小寫,sql語句à發(fā)給oracle服務(wù)器à語法檢查和編譯成為內(nèi)部指令à緩存和執(zhí)行指令。根據(jù)緩存的特點,不要拼湊條件,而是用?和PreparedStatment

    ?

    還有索引對查詢性能的改進也是值得關(guān)注的。

    ?

    備注:下面是關(guān)于性能的討論舉例

    ?

    4航班?3個城市

    ?

    m*n

    ?

    select * from flight,city where flight.startcityid=city.cityidand city.name='beijing';

    ?

    m + n

    ?

    ?

    select * from flight where startcityid = (select cityid fromcity where cityname='beijing');

    ?

    select flight.id,'beijing',flight.flightTime from flight wherestartcityid = (select cityid from city where cityname='beijing')

    ?

    6、union和union all有什么不同?

    假設(shè)我們有一個表Student,包括以下字段與數(shù)據(jù):

    drop table student;

    create table student
    (
    id int primary key,
    name nvarchar2(50) not null,
    score number not null
    );

    insert into student values(1,'Aaron',78);
    insert into student values(2,'Bill',76);
    insert into student values(3,'Cindy',89);
    insert into student values(4,'Damon',90);
    insert into student values(5,'Ella',73);
    insert into student values(6,'Frado',61);
    insert into student values(7,'Gill',99);
    insert into student values(8,'Hellen',56);
    insert into student values(9,'Ivan',93);
    insert into student values(10,'Jay',90);

    commit;

    Union和Union All的區(qū)別。

    select *
    from student
    where id < 4

    union

    select *
    from student
    where id > 2 and id < 6

    結(jié)果將是

    1 Aaron 78
    2 Bill 76
    3 Cindy 89
    4 Damon 90
    5 Ella 73

    如果換成Union All連接兩個結(jié)果集,則返回結(jié)果是:

    1 Aaron 78
    2 Bill 76
    3 Cindy 89
    3 Cindy 89
    4 Damon 90
    5 Ella 73

    可以看到,Union和Union All的區(qū)別之一在于對重復(fù)結(jié)果的處理。

    ?

    UNION在進行表鏈接后會篩選掉重復(fù)的記錄,所以在表鏈接后會對所產(chǎn)生的結(jié)果集進行排序運算,刪除重復(fù)的記錄再返回結(jié)果。實際大部分應(yīng)用中是不會產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表UNION。如:
    select * from gc_dfys
    union
    select * from ls_jg_dfys
      這個SQL在運行時先取出兩個表的結(jié)果,再用排序空間進行排序刪除重復(fù)的記錄,最后返回結(jié)果集,如果表數(shù)據(jù)量大的話可能會導(dǎo)致用磁盤進行排序。
     而UNION ALL只是簡單的將兩個結(jié)果合并后就返回。這樣,如果返回的兩個結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會包含重復(fù)的數(shù)據(jù)了。
     從效率上說,UNION ALL要比UNION快很多,所以,如果可以確認合并的兩個結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話,那么就使用UNION ALL。

    ?

    ?

    7.分頁語句

    取出sql表中第31到40的記錄(以自動增長ID為主鍵)

    sql server方案1

    selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid

    sql server方案2

    selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddesc

    ?

    mysql方案:select * from t order by idlimit 30,10

    ?

    oracle方案:select * from (select rownum r,* from t where r<=40) wherer>30

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Java面试宝典 HTML、js、ajax、数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。