#
1.什么是模式?
模式,即pattern,其實就是解決某一類問題的方法論,你把解決某類問題的方法總結歸納到理論高度,這就是模式。
Alexander給出的經典定義是:每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需再重復相同的工作。
模式有不同的領域,建筑領域有建筑模式,軟件設計領域也有設計模式。當一個領域逐漸成熟的時候,自然會出現很多模式。
什么是框架?
框架,即framework。其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單地說就是使用別人搭建好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。
2。為什么要用模式?
因為模式是一種指導,在一個良好的指導下,有助于你完成任務,有助于你作出一個優良的設計方案,達到事半功倍的效果。而且會得到解決問題的最佳辦法。
為什么要使用框架?
因為軟件系統發展到今天已經很復雜了,特別是服務器端軟件,設計到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就相當于讓別人幫你完成一些基礎的工作,你只需要集中精力完成系統業務邏輯設計。而且框架一般是成熟,穩健的,它可以處理系統很多細節的問題,比如,事物處理,安全性,數據流控制等問題。還有框架一般都是經過很多人使用,所以結構很好,所以擴展性也好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。
框架一般處在低層的應用平臺(如J2EE)和高層業務邏輯之間的中間層。
軟件為什么要分層?
為了實現“高內聚、低耦合”。把問題劃分開來各個解決,易于控制,易于擴展,易于分配資源。。。
1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標右鍵
<table border oncontextmenu=return(false)><td>no</table> 可用于Table
2. <body onselectstart="return false"> 取消選取、防止復制
3. onpaste="return false" 不準粘貼
4. oncopy="return false;" oncut="return false;" 防止復制
5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址欄前換成自己的圖標
6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖標
7. <input style="ime-mode:disabled"> 關閉輸入法
8. 永遠都會帶著框架
<script language="JavaScript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm為框架網頁
// --></script>
9. 防止被人frame
<SCRIPT LANGUAGE=JAVASCRIPT><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>
10. 網頁將不能被另存為
<noscript><*** src="/*.html>";</***></noscript>
11. <input type=button value="/查看網頁源代碼
onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">
12.刪除時確認
<a href=""javascript :if(confirm("確實要刪除嗎?"))location="boos.asp?&areyou=刪除&page=1"">刪除</a>
13. 取得控件的絕對位置
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>
//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>
14. 光標是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">
15. 判斷上一頁的來源
javascript :
document.referrer
16. 最小化、最大化、關閉窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="/Close"></OBJECT>
<input type=button value="/最小化 onclick=hh1.Click()>
<input type=button value="/blog/最大化 onclick=hh2.Click()>
<input type=button value=關閉 onclick=hh3.Click()>
本例適用于IE
17.屏蔽功能鍵Shift,Alt,Ctrl
<script>
function look(){
if(event.shiftKey)
alert("禁止按Shift鍵!"); //可以換成ALT CTRL
}
document.onkeydown=look;
</script>
18. 網頁不會被緩存
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">
19.怎樣讓表單沒有凹凸感?
<input type=text style="""border:1 solid #000000">
或
<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:
1 solid #000000"></textarea>
20.<div><span>&<layer>的區別?
<div>(division)用來定義大段的頁面元素,會產生轉行
<span>用來定義同一行內的元素,跟<div>的唯一區別是不產生轉行
<layer>是ns的標記,ie不支持,相當于<div>
21.讓彈出窗口總是在最上面:
<body onblur="this.focus();">
22.不要滾動條?
讓豎條沒有:
<body style="overflow:scroll;overflow-y:hidden">
</body>
讓橫條沒有:
<body style="overflow:scroll;overflow-x:hidden">
</body>
兩個都去掉?更簡單了
<body scroll="no">
</body>
23.怎樣去掉圖片鏈接點擊后,圖片周圍的虛線?
<a href="#" onFocus="this.blur()"><img src="/logo.jpg" border=0></a>
24.電子郵件處理提交表單
<form name="form1" method="post" action=mailto:****@***.com
enctype="text/plain">
<input type=submit>
</form>
25.在打開的子窗口刷新父窗口的代碼里如何寫?
window.opener.location.reload()
26.如何設定打開頁面的大小
<body onload="top.resizeTo(300,200);">
打開頁面的位置<body onload="top.moveBy(300,200);">
27.在頁面中如何加入不是滿鋪的背景圖片,拉動頁面時背景圖不動
<STYLE>
body
{background-image:url(/logo.gif); background-repeat:no-repeat;
background-position:center;background-attachment: fixed}
</STYLE>
28. 檢查一段字符串是否全由數字組成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
29. 獲得一個窗口的大小
document.body.clientWidth; document.body.clientHeight
30. 怎么判斷是否是字符
if (/[^/x00-/xff]/g.test(s)) alert("含有漢字");
else alert("全是字符");
31.TEXTAREA自適應文字行數的多少
<textarea rows=1 name=s1 cols=27 onpropertychange
="this.style.posHeight=this.scrollHeight">
</textarea>
32. 日期減去天數等于第二個日期
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上錯誤處理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>
33. 選擇了哪一個Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then
window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="/style" checked>Style
<INPUT name="radio1" type="radio" value="/blog/barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>
34.腳本永不出錯
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide
function killErrors() {
return true;
}
window.onerror = killErrors;
// -->
</SCRIPT>
35.ENTER鍵可以讓光標移到下一個輸入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
36. 檢測某個網站的鏈接速度:
把如下代碼加入<body>區域中:
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.cctv.com"
function butt(){
***("<form name=autof>")
for(var i=1;i<autourl.length;i++)
***("<input type=text name=txt"+i+" size=10 value="/測試中……> =》<input type=text
name=url"+i+" size=40> =》<input type=button value="/blog/GO
onclick=window.open(this.form.url"+i+".value)><br>")
***("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="/鏈接超時"}
else
{document.forms[0]["txt"+b].value="/blog/時間"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)***("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1
onerror=auto("http://"+autourl+"")>")}
run()</script>
37. 各種樣式的光標
auto :標準光標
default :標準箭頭
hand :手形光標
wait :等待光標
text :I形光標
vertical-text :水平I形光標
no-drop :不可拖動光標
not-allowed :無效光標
help :?幫助光標
all-scroll :三角方向標
move :移動標
crosshair :十字標
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
38.頁面進入和退出的特效
進入頁面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出頁面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">
這個是頁面被載入和調出時的一些特效。duration表示特效的持續時間,以秒為單位。transition表示使用哪種特效,取值為1-23:
0 矩形縮小
1 矩形擴大
2 圓形縮小
3 圓形擴大
4 下到上刷新
5 上到下刷新
6 左到右刷新
7 右到左刷新
8 豎百葉窗
9 橫百葉窗
10 錯位橫百葉窗
11 錯位豎百葉窗
12 點擴散
13 左右到中間刷新
14 中間到左右刷新
15 中間到上下
16 上下到中間
17 右下到左上
18 右上到左下
19 左上到右下
20 左下到右上
21 橫條
22 豎條
23 以上22種隨機選擇一種
39.在規定時間內跳轉
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">
40.網頁是否被檢索
<meta name="ROBOTS" content="屬性值">
其中屬性值有以下一些:
屬性值為"all": 文件將被檢索,且頁上鏈接可被查詢;
屬性值為"none": 文件不被檢索,而且不查詢頁上的鏈接;
屬性值為"index": 文件將被檢索;
屬性值為"follow": 查詢頁上的鏈接;
屬性值為"noindex": 文件不檢索,但可被查詢鏈接;
屬性值為"nofollow": 文件不被檢索,但可查詢頁上的鏈接。
41、email地址的分割
把如下代碼加入<body>區域中
<a href="mailto:webmaster@sina.com">webmaster@sina.com</a>
42、流動邊框效果的表格
把如下代碼加入<body>區域中
<SCRIPT>
l=Array(6,7,8,9,'a','b','b','c','d','e','f')
Nx=5;Ny=35
t="<table border=0 cellspacing=0 cellpadding=0 height="+((Nx+2)*16)+"><tr>"
for(x=Nx;x<Nx+Ny;x++)
t+="<td width=16 id=a_mo"+x+"> </td>"
t+="</tr><tr><td width=10 id=a_mo"+(Nx-1)+"> </td><td colspan="+(Ny-2)+" rowspan="+(Nx)+"> </td><td width=16 id=a_mo"+(Nx+Ny)+"></td></tr>"
for(x=2;x<=Nx;x++)
t+="<tr><td width=16 id=a_mo"+(Nx-x)+"> </td><td width=16 id=a_mo"+(Ny+Nx+x-1)+"> </td></tr>"
t+="<tr>"
for(x=Ny;x>0;x--)
t+="<td width=16 id=a_mo"+(x+Nx*2+Ny-1)+"> </td>"
***(t+"</tr></table>")
var N=Nx*2+Ny*2
function f1(y){
for(i=0;i<N;i++){
c=(i+y)%20;if(c>10)c=20-c
document.all["a_mo"+(i)].bgColor=""""#0000"+l[c]+l[c]+"'"}
y++
setTimeout('f1('+y+')','1')}
f1(1)
</SCRIPT>
43、JavaScript主頁彈出窗口技巧
窗口中間彈出
<script>
window.open("http://www.cctv.com","","width=400,height=240,top="+(screen.availHeight-240)/2+",left="+(screen.availWidth-400)/2);
</script>
============
<html>
<head>
<script language="LiveScript">
function WinOpen() {
msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
msg.***("<HEAD><TITLE>哈 羅!</TITLE></HEAD>");
msg.***("<CENTER><H1>酷 斃 了!</H1><h2>這 是<B>JavaScript</B>所 開 的 視 窗!</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" onclick="WinOpen()">
</form>
</body>
</html>
==============
一、在下面的代碼中,你只要單擊打開一個窗口,即可鏈接到賽迪網。而當你想關閉時,只要單擊一下即可關閉剛才打開的窗口。
代碼如下:
<SCRIPT language="JavaScript">
<!--
function openclk() {
another=open('1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>http://www.ccidnet.com','NewWindow');
}
function closeclk() {
another.close();
}
//-->
</SCRIPT>
<FORM>
<INPUT TYPE="BUTTON" NAME="open" value="/打開一個窗口" onClick="openclk()">
<BR>
<INPUT TYPE="BUTTON" NAME="close" value="/blog/關閉這個窗口" onClick="closeclk()">
</FORM>
二、上面的代碼也太靜了,為何不來點動感呢?如果能給頁面來個降落效果那該多好啊!
代碼如下:
<script>
function drop(n) {
if(self.moveBy){
self.moveBy (0,-900);
for(i = n; i > 0; i--){
self.moveBy(0,3);
}
for(j = 8; j > 0; j--){
self.moveBy(0,j);
self.moveBy(j,0);
self.moveBy(0,-j);
self.moveBy(-j,0);
}
}
}
</script>
<body onLoad="drop(300)">
三、討厭很多網站總是按照默認窗口打開,如果你能隨心所欲控制打開的窗口那該多好。
代碼如下:
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
function popupPage(l, t, w, h) {
var windowprops = "location=no,scrollbars=no,menubars=no,toolbars=no,resizable=yes" +
",left=" + l + ",top=" + t + ",width=" + w + ",height=" + h;
var URL = "http://www.80cn.com";
popup = window.open(URL,"MenuPopup",windowprops);
}
// End -->
</script>
<table>
<tr>
<td>
<form name=popupform>
<pre>
打開頁面的參數<br>
離開左邊的距離: <input type=text name=left size=2 maxlength=4> pixels
離開右邊的距離: <input type=text name=top size=2 maxlength=4> pixels
窗口的寬度: <input type=text name=width size=2 maxlength=4> pixels
窗口的高度: <input type=text name=height size=2 maxlength=4> pixels
</pre>
<center>
<input type=button value="打開這個窗口!" onClick="popupPage(this.form.left.value, this.form.top.value, this.form.width.value,
this.form.height.value)">
</center>
</form>
</td>
</tr>
</table>你只要在相對應的對話框中輸入一個數值即可,將要打開的頁面的窗口控制得很好。
44、頁面的打開移動
把如下代碼加入<body>區域中
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
for (t = 2; t > 0; t--) {
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,-x);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,x);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(x,0);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(-x,0);
}
}
}
//-->
// End -->
</script>
45、顯示個人客戶端機器的日期和時間
<script language="LiveScript">
<!-- Hiding
today = new Date()
***("現 在 時 間 是: ",today.getHours(),":",today.getMinutes())
***("<br>今 天 日 期 為: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>
46、自動的為你每次產生最後修改的日期了:
<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
<script language="LiveScript">
<!-- hide script from old browsers
***(document.lastModified)
// end hiding contents -->
</script>
</body>
</html>
47、不能為空和郵件地址的約束:
<html>
<head>
<script language="JavaScript">
<!-- Hide
function test1(form) {
if (form.text1.value == "")
alert("您 沒 寫 上 任 何 東 西, 請 再 輸 入 一 次 !")
else {
alert("嗨 "+form.text1.value+"! 您 已 輸 入 完 成 !");
}
}
function test2(form) {
if (form.text2.value == "" ||
form.text2.value.indexOf('@', 0) == -1)
alert("這 不 是 正 確 的 e-mail address! 請 再 輸 入 一 次 !");
else alert("您 已 輸 入 完 成 !");
}
// -->
</script>
</head>
<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="輸 入 測 試" onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="輸 入 測 試" onClick="test2(this.form)">
</body>
48、跑馬燈
<html>
<head>
<script language="JavaScript">
<!-- Hide
var scrtxt="怎麼樣 ! 很酷吧 ! 您也可以試試."+"Here goes your message the visitors to your
page will "+"look at for hours in pure fascination...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;
function scroll() {
pos++;
var scroller="";
if (pos==lentxt) {
pos=1-width;
}
if (pos<0) {
for (var i=1; i<=Math.abs(pos); i++) {
scroller=scroller+" ";}
scroller=scroller+scrtxt.substring(0,width-i+1);
}
else {
scroller=scroller+scrtxt.substring(pos,width+pos);
}
window.status = scroller;
setTimeout("scroll()",150);
}
//-->
</script>
</head>
<body onLoad="scroll();return true;">
這里可顯示您的網頁 !
</body>
</html>
49、在網頁中用按鈕來控制前頁,后頁和主頁的顯示。
<html>
<body>
<FORM NAME="buttonbar">
<INPUT TYPE="button" VALUE="Back" onClick="history.back()">
<INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
<INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
</FORM>
</body>
</html>
50、查看某網址的源代碼
把如下代碼加入<body>區域中
<SCRIPT>
function add()
{
var ress=document.forms[0].luxiaoqing.value
window.location="view-source:"+ress;
}
</SCRIPT>
輸入要查看源代碼的URL地址:
<FORM><input type="text" name="luxiaoqing" size=40 value="http://"></FORM>
<FORM><br>
<INPUT type="button" value="查看源代碼" onClick=add()>
</FORM>
51、title顯示日期
把如下代碼加入<body>區域中:
<script language="JavaScript1.2">
<!--hide
var isnMonth = new
Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
var isnDay = new
Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六","星期日");
today = new Date () ;
Year=today.getYear();
Date=today.getDate();
if (document.all)
document.title="今天是: "+Year+"年"+isnMonth[today.getMonth()]+Date+"日"+isnDay[today.getDay()]
//--hide-->
</script>
52、顯示所有鏈接
把如下代碼加入<body>區域中
<script language="JavaScript1.2">
<!--
function extractlinks(){
var links=document.all.tags("A")
var total=links.length
var win2=window.open("","","menubar,scrollbars,toolbar")
win2.***("<font size='2'>一共有"+total+"個連接</font><br>")
for (i=0;i<total;i++){
win2.***("<font size='2'>"+links[i].outerHTML+"</font><br>")
}
}
//-->
</script>
<input type="button" onClick="extractlinks()" value="顯示所有的連接">
53、回車鍵換行
把如下代碼加入<body>區域中
<script type="text/javascript">
function handleEnter (field, event) {
var keyCode = event.keyCode ? event.keyCode : event.which ?
event.which : event.charCode;
if (keyCode == 13) {
var i;
for (i = 0; i < field.form.elements.length; i++)
if (field == field.form.elements[i])
break;
i = (i + 1) % field.form.elements.length;
field.form.elements[i].focus();
return false;
}
else
return true;
}
</script>
<form>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<textarea>回車換行
54、確認后提交
把如下代碼加入<body>區域中
<SCRIPT LANGUAGE="JavaScript">
<!--
function msg(){
if (confirm("你確認要提交嘛!"))
document.lnman.submit()
}
//-->
</SCRIPT>
<form name="lnman" method="post" action="">
<p>
<input type="text" name="textfield" value="確認后提交">
</p>
<p>
<input type="button" name="Submit" value="提交" onclick="msg();">
</p>
</form>
55、改變表格的內容
把如下代碼加入<body>區域中
<script ***script>
var arr=new Array()
arr[0]="一一一一一";
arr[1]="二二二二二";
arr[2]="三三三三三";
</script>
<select onchange="zz.cells[this.selectedIndex].innerHTML=arr[this.selectedIndex]">
<option value=a>改變第一格</option>
<option value=a>改變第二格</option>
<option value=a>改變第三格</option>
</select>
<table id=zz border=1>
<tr height=20>
<td width=150>第一格</td>
<td width=150>第二格</td>
<td width=150>第三格</td>
</tr>
</table>
摘要: struts+spring+hibernate的web應用<一> 架構搭建
開發工具:
Eclipse 3.2 + NLpack1-eclipse-SDK-3.2.1-win32( 中文語言包 )
插件:
tomcatPluginV31 :用于 tomcat 項目建立和管理。
Properties Editor : struts 中的資源國際化的中文編輯插件,不需要...
閱讀全文
軟件環境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安裝路徑為:C:"ORANT
問題提出:
1、當我們想要為一個表創建唯一索引時,如果該表有重復的記錄,則無法創建成功。
方法原理:
1、Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是唯一的,
rowid確定了每條記錄是在ORACLE中的哪一個數據文件、塊、行上。
2、在重復的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重復記錄中
那些具有最大rowid的就可以了,其余全部刪除。
3、以下語句用到了3項技巧:rowid、子查詢、別名。
實現方法:
SQL> create table a (
2 bm char(4), --編碼
3 mc varchar2(20) --名稱
4 )
5 /
表已建立.
SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');
SQL> insert into a select * from a;
插入4個記錄.
SQL> commit;
完全提交.
SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111
查詢到8記錄.
查出重復記錄
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
ROWID BM MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
刪除重復記錄
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
刪除4個記錄.
SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111
come from :: http://dev.csdn.net/article/59/59333.shtm
-測試數據
/*-----------------------------
select * from tt
-----------------------------*/
id pid
----------- -----------
1 1
1 1
2 2
3 3
3 3
3 3
(所影響的行數為 6 行)
首先,如何查詢table中有重復記錄
select *,count(1) as rownum
from tt
group by id, pid
having count(1) > 1
id pid rownum
----------- ----------- -----------
1 1 2
3 3 3
(所影響的行數為 2 行)
方法一:使用distinct和臨時表
if object_id('tempdb..#tmp') is not null
drop table #tmp
select distinct * into #tmp from tt
truncate table tt
insert into tt select * from #tmp
方法二:添加標識列
alter table tt add NewID int identity(1,1)
go
delete from tt where exists(select 1 from tt a where a.newid>tt.newid and tt.id=a.id and tt.pid=a.pid)
go
alter table tt drop column NewID
go
--測試結果
/*-----------------------------
select * from tt
-----------------------------*/
id pid
----------- -----------
1 1
2 2
3 3
(所影響的行數為 3 行)
*---*-- * 8 8 * * * * 8* * * * 8 8 *
USE CEO
CREATE TABLE TT
(
TTNO CHAR(4),
TTNAME VARCHAR(10)
)
INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')
INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')
INSERT INTO TT (TTNO,TTNAME) VALUES ('1424','WHEREIS')
INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')
INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')
方法二:添加標識列(最有效方法)
alter table tt add newid2 int identity(1,1)
go
delete from tt where exists( select 1 from tt a where a.newid2>tt.newid2 and tt.ttno=a.ttno and tt.ttname=a.ttname)
alter table tt drop column newid2
go
select * from tt
開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結束,以下分別舉例說明:
"^The": 開頭一定要有"The"字符串;
"of despair$": 結尾一定要有"of despair" 的字符串;
那么,
"^abc$": 就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配。
"notice": 匹配包含notice的字符串。
你可以看見如果你沒有用我們提到的兩個字符(最后一個例子),就是說 模式(正則表達式) 可以出現在被檢驗字符串的任何地方,你沒有把他鎖定到兩邊。
接著,說說 '*', '+',和 '?',
他們用來表示一個字符可以出現的次數或者順序. 他們分別表示:
- "zero or more"相當于{0,},
- "one or more"相當于{1,},
- "zero or one."相當于{0,1}, 這里是一些例子:
- "ab*": 和ab{0,}同義,匹配以a開頭,后面可以接0個或者N個b組成的字符串("a", "ab", "abbb", 等);
- "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.);
- "ab?":和ab{0,1}同義,可以沒有或者只有一個b;
- "a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字符串.
要點, '*', '+',和 '?'只管它前面那個字符.
你也可以在大括號里面限制字符出現的個數,比如
- "ab{2}": 要求a后面一定要跟兩個b(一個也不能少)("abb");
- "ab{2,}": 要求a后面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.);
- "ab{3,5}": 要求a后面可以有2-5個b("abbb", "abbbb", or "abbbbb").
現在我們把一定幾個字符放到小括號里,比如:
- "a(bc)*": 匹配 a 后面跟0個或者一個"bc";
- "a(bc){1,5}": 一個到5個 "bc."
還有一個字符 '│', 相當于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有這樣多個(包括0個)a或b,后面跟一個c的字符串;
一個點('.')可以代表所有的單一字符,不包括"\n"
如果,要匹配包括"\n"在內的所有單個字符,怎么辦?
對了,用'[\n.]'這種模式.
"a.[0-9]": 一個a加一個字符再加一個0到9的數字
"^.{3}$": 三個任意字符結尾 .
中括號括住的內容只匹配一個單一的字符
"[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣);
"[a-d]": 匹配'a' 到'd'的單個字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文
"^[a-zA-Z]": 匹配以大小寫字母開頭的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字符串
你也可以把你不想要得字符列在中括號里,你只需要在總括號里面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號里面有一個非字母的字符串.
要點:^用在中括號開頭的時候,就表示排除括號里的字符。為了PHP能夠解釋,你必須在這些字符面前后加'',并且將一些字符轉義.
不要忘記在中括號里面的字符是這條規路的例外?在中括號里面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質 "[*\+?{}.]"匹配含有這些字符的字符串.
還有,正如regx的手冊告訴我們: "如果列表里含有 ']', 最好把它作為列表里的第一個字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一個范圍的第二個結束點[a-d-0-9]中間的‘-’將有效.
看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小于m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個p.
下面說說以\開頭的
\b 書上說他是用來匹配一個單詞邊界,就是...比如've\b',可以匹配love里的ve而不匹配very里有ve
\B 正好和上面的\b相反.例子我就不舉了
.....突然想起來....可以到http://www.phpv.net/article.php/251 看看其它用\ 開頭的語法
好,我們來做個應用:
如何構建一個模式來匹配 貨幣數量 的輸入
構建一個匹配模式去檢查輸入的信息是否為一個表示money的數字。我們認為一個表示money的數量有四種方式: "10000.00" 和 "10,000.00",或者沒有小數部分, "10000" and "10,000". 現在讓我們開始構建這個匹配模式:
這是所變量必須以非0的數字開頭.但這也意味著 單一的 "0" 也不能通過測試. 以下是解決的方法:
"只有0和不以0開頭的數字與之匹配",我們也可以允許一個負號在數字之前:
這就是: "0 或者 一個以0開頭 且可能 有一個負號在前面的數字." 好了,現在讓我們別那么嚴謹,允許以0開頭.現在讓我們放棄 負號 , 因為我們在表示錢幣的時候并不需要用到. 我們現在指定 模式 用來匹配小數部分:
這暗示匹配的字符串必須最少以一個阿拉伯數字開頭. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道為什么嗎)
我們上面指定小數點后面必須有兩位小數.如果你認為這樣太苛刻,你可以改成:
這將允許小數點后面有一到兩個字符. 現在我們加上用來增加可讀性的逗號(每隔三位), 我們可以這樣表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ |
不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字符串被輸入話 (為什么?). 也不要忘記反斜桿 ’\’ 在php字符串中可能會出現錯誤 (很普遍的錯誤).
現在,我們已經可以確認字符串了, 我們現在把所有逗號都去掉 str_replace(",", "", $money) 然后在把類型看成 double然后我們就可以通過他做數學計算了.
再來一個:
構造檢查email的正則表達式
在一個完整的email地址中有三個部分:
1. 用戶名 (在 '@' 左邊的一切),
2.'@',
3. 服務器名(就是剩下那部分).
用戶名可以含有大小寫字母阿拉伯數字,句號 ('.'), 減號('-'), and 下劃線 ('_'). 服務器名字也是符合這個規則,當然下劃線除外.
現在, 用戶名的開始和結束都不能是句點. 服務器也是這樣. 還有你不能有兩個連續的句點他們之間至少存在一個字符,好現在我們來看一下怎么為用戶名寫一個匹配模式:
現在還不能允許句號的存在. 我們把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$ |
上面的意思就是說: "以至少一個規范字符(除了.)開頭,后面跟著0個或者多個以點開始的字符串."
簡單化一點, 我們可以用 eregi()取代 ereg().eregi()對大小寫不敏感, 我們就不需要指定兩個范圍 "a-z" 和 "A-Z" ? 只需要指定一個就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$ |
后面的服務器名字也是一樣,但要去掉下劃線:
^[a-z0-9-]+(\.[a-z0-9-]+)*$ |
好. 現在只需要用”@”把兩部分連接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ |
這就是完整的email認證匹配模式了,只需要調用
eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil) |
就可以得到是否為email了.
正則表達式的其他用法
提取字符串
ereg() and eregi() 有一個特性是允許用戶通過正則表達式去提取字符串的一部分(具體用法你可以閱讀手冊). 比如說,我們想從 path/URL 提取文件名 ? 下面的代碼就是你需要:
ereg("([^\\/]*)$", $pathOrUrl, $regs);
echo $regs[1]; |
高級的代換
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負號都替換成逗號:
ereg_replace("[ \n\r\t]+", ",", trim($str)); |
最后,我把另一串檢查EMAIL的正則表達式讓看文章的你來分析一下.
"^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$" |
如果能方便的讀懂,那這篇文章的目的就達到了.
DB2中簡單存儲過程 selectAllUsers
CREATE procedure selectAllUsers
DYNAMIC RESULT SETS 1
BEGIN
DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR
SELECT * FROM test;
OPEN temp_cursor1;
END;
映射文件中關于存儲過程內容如下
<hibernate-mapping package="com.unmi.vo">
<class name="Test" table="TEST">
............
</class>
<sql-query callable="true" name="selectAllUsers">
<return alias="aa" class="Test">
<return-property name="oborqt" column="OBORQT"/>
<return-property name="moorqt" column="MOORQT"/>
<return-property name="roschn" column="ROSCHN"/>
<return-property name="plandate" column="PLANDATE"/>
</return>
{ ? = call selectAllUsers() }
</sql-query>
</hibernate-mapping>
{ ? = call selectAllUsers() } 也可以寫成{ call selectAllUsers() },
如果有參數就寫成
{ ? = call selectAllUsers(?,?,?) }
代碼中對query設置相應位置上的值就OK
Java調用關鍵代碼如下
Session session = HibernateUtil.currentSession();
Query query = session.getNamedQuery("selectAllUsers");
List list = query.list();
System.out.println(list);
要求你的存儲過程必須能返回記錄集,否則要出錯
如果你的存儲過程是完成非查詢任務就應該在配置文件用以下三個標簽
<sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
——此文章摘自
《Java程序員面試寶典》定價:46元 特價:38.9元 購買>>
回答智力測試的一些基本方法如下。
(1)排除法
把一些無關的問題先予以排除,可以確定的問題先確定,盡可能縮小未知的范圍,以便于問題的分析和解決。這種思維方式在我們的工作和生活中都是很有用處的。
(2)遞推法
由已知條件層層向下分析,要確保每一步都能準確無誤。可能會有幾個分支,應本著先易后難的原則,先從簡單的一支入手。
(3)倒推法
從問題最后的結果開始,一步一步往前推,直到求出問題的答案。有些問題用此法解起來很簡單,如用其他方法則很難。
(4)假設法
對給定的問題,先做一個或一些假設,然后根據已給的條件進行分析,如果出現與題目給的條件有矛盾的情況,說明假設錯誤,可再做另一個或另一些假設。如果結果只有兩種可能,那么問題就已經解決了。在科學史上,“假設”曾起了極大的作用。
(5)計算法
有些問題必須經計算才能解決。要注意的是,智力測驗中的問題往往含有隱含的條件,有時給出的數是無用的。
(6)分析法
這是最基本的方法。各種方法常常要用到分析法。可以說,分析能力的高低,是一個人的智力水平的體現。分析能力不僅是先天性的,在很大程度上取決于后天的訓練,應養成對客觀事物進行分析的良好習慣。
(7)作圖法
根據問題中已知的條件,采用適當的方法畫出圖形,有助于問題的解決。有些問題,在沒畫圖之前,會覺得無處下手,畫了圖后就一目了然了。
(8)綜合法
事實上,許多問題都要運用幾種不同的方法才能解決。所謂綜合法,就是綜合各種方法(包括前述各種方法以外的方法)去解決某些問題。
面試例題1:100美元哪里去了?
3個朋友住進了一家賓館。結賬時,賬單總計3 000美元。3個朋友每人分攤1 000美元,并把這3 000美元如數交給了服務員,委托他代到總臺交賬。但在交賬時,正逢賓館實施價格優惠,總臺退還給服務員500美元,實收2 500美元。服務員從這500美元退款中扣下了200美元,只退還3個客人300美元。3個客人平分了這300美元,每人取回了100美元。這樣,3個客人每人實際支付900美元,共支付2 700美元,加上服務員扣的200美元,共計2 900美元,那么這100美元的差額到哪里去了?
答案:這道題純粹是文字游戲,但是如果你的頭腦不夠清晰,很可能把你搞糊涂了。客人實際支付2 700美元,就等于總臺實際結收的2 500美元加上服務員克扣的200美元。在這2 700美元上加上200美元是毫無道理的,而在這2 700美元上加退回的300美元,這是有道理的,因為這等于客人原先交給服務員的3 000美元。
面試例題2:擊鼠標比賽現在開始!參賽者有拉爾夫、威利和保羅。
拉爾夫10秒鐘能擊10下鼠標,威利20秒鐘能擊20下鼠標,保羅5秒鐘能擊5下鼠標。以上各人所用的時間是這樣計算的:從第一擊開始,到最后一擊結束。
他們是否打平手?如果不是,誰最先擊完40下鼠標?
解析:n秒鐘擊n下鼠標其實是擊第一下鼠標時才開始計時的,實際上擊n-1下需要n秒鐘,那么若擊40下鼠標,拉爾夫需要(40-1)/(9/10)=39/0.9秒,威利需要(40-1)/(19/20)=39/0.95秒,保羅需要(40-1)/(4/5)=39/0.8秒,因此威利先擊完。
答案:威利先擊完。
面試例題3:父親打電話給女兒,要她替自己買一些生活用品,同時告訴她,錢放在書桌上的一個信封里。女兒找到信封,看見上面寫著98,以為信封內有98元,就把錢拿出來,數也沒數放進書包里。在商店里,她買了90元的東西,付款時才發現,她不僅沒有剩下8元,反而差了4元。回到家里,她把這事告訴了父親,懷疑父親把錢點錯了。父親笑著說,他并沒有數錯,錯在女兒身上。
問:女兒錯在什么地方?
答案:拿倒了,86看成是98了。
面試例題4:3個孩子翻衣兜,他們把兜里所有的錢都掏出來,看看一共有多少錢。結果一共有320日元。其中有兩枚硬幣是100日元的,兩枚是50日元的,兩枚是10日元的。每一個孩子所帶的硬幣中沒有相同的。而且,沒帶100日元硬幣的孩子也沒帶10日元的硬幣,沒帶50日元硬幣的孩子也沒帶100日元的硬幣。你能弄清楚這3個日本孩子原來各自帶了什么硬幣嗎?
答案:第一個小孩:100,50,10;第二個小孩:100,50;第三個小孩:10。
面試例題5:有一種小蟲,每隔2秒鐘分裂一次。分裂后的2只新的小蟲經過2秒鐘后又會分裂。如果最初某瓶中只有一只小蟲,那么2秒后變2只,再過2秒后就變4只……2分鐘后,正好滿滿一瓶小蟲。假設這個瓶內最初放入2只這樣的小蟲。
問:經過多少時間后,正巧也是滿滿的一瓶?
答案:經過1分58秒時間,也正巧是滿滿一瓶。因為從一只蟲蛻變為2只蟲只需2秒鐘。在瓶內只有一只蟲子的情況下,經過2秒鐘后就變成2只。這時的情況和瓶內一開始就有2只蟲子的情況是一樣的。出現這兩種情況的時間差是2秒鐘。所以,經過1分58秒后,也正好是滿滿一瓶。
面試例題6:斯芬克斯是古代希臘神話中的帶翅膀的獅子女魔。傳說她在底比斯附近要人猜謎,猜不出來就要殺人。一次,她要底比斯王子猜謎:“有一種動物,早上4條腿,中午2條腿,晚上3條腿,是什么動物?”聰明的王子說:“是人。”他猜中了。
如果你是現代的斯芬克斯,會提出什么樣的問題呢?比如,1和0之間加上什么符號才可以使得到的數比0大又比1小呢?你知道嗎?
答案:0.1
面試例題7:你讓工人為你工作7天,給工人的回報是一根金條。金條平分成相連的7段,你必須在每天結束時給他們一段金條,如果只許你兩次把金條弄斷,你如何給你的工人付費?你讓工人為你工作7天,給工人的回報是一根金條。金條平分成相連的7段,你必須在每天結束時給他們一段金條,如果只許你兩次把金條弄斷,你如何給你的工人付費?
答案:兩次弄斷就應分成三份,我把金條分成1/7、2/7和4/7三份。這樣,第1天我就可以給他1/7;第2天我給他2/7,讓他找回我1/7;第3天我就再給他1/7,加上原先的2/7就是3/7;第4天我給他那塊4/7,讓他找回那兩塊1/7和2/7的金條;第5天,再給他1/7;第6天和第2天一樣;第7天給他找回的那個1/7。
面試題8:對一批編號為1-100全部開關朝上(開)的燈進行以下操作:凡是1的倍數反方向撥一次開關;2的倍數反方向又撥一次開關;3的倍數反方向又撥一次開關。。。。。問:最后為關熄狀態的燈的編號。
答案:
1,4,9,16,25,36,47,64,81,100關
面試題9:
小明和小強都是王老師的學生。王老師的生日是m月n日,2人都指導王老師的生日是下列10組中的一天,王老師把m值告訴了小明,把n值告訴了小強。王老師文他們知道他的生日是那一天嗎?
3月4 日,3月5 日,3月9 日
6月 4日,6月 7日
9月 1日,9月 5日
12月 1日,12月 2日,12月 8日
小明說:我不知道的話,小強肯定也不知道
小強說:笨來我不知道,但是現在我知道了
小明說:哦,那我也知道了
情根據上面的對話推斷出王老師的生日是哪一天?
答案:9月1號準沒錯
首先小明是不知道的,所以不可能在某月的 2號,7號,8號,9號.去掉一些日子后;簡化如下
3月4 日,3月5 日,
6月 4日,
9月 1日,9月 5日
12月 1日,
小強說他不知道,小明也不會知道.即小強知道的月數不會在有 2號,7號,8號,9號 的這些月數,因為如果在這些月數,小明是有可能知道的.最后只剩下 9月1日 和 9月5日.
這時候小明也清楚M是9月了,小強也因此知道N是1號.
神的交通工具是什么------神奇(騎)寶貝
什么動物可以貼在墻上------海豹(報)
什么顏色最會模仿------紅(磨坊)模仿
什么雞最慢------尼可基(雞)曼
辣妹什么地方最香------臘梅處處香
哪位古人跑得最快------曹操(說曹操曹操就到)
什么動物沒有方向感------麋鹿(迷路)
茉莉花、太陽花、玫瑰花,哪一朵花最沒力------茉莉花[好一朵美麗(沒力)的茉莉花]
猴子最付厭什么錢------平行線[沒有相交(香蕉)]
象皮、老虎皮、獅子つ囊桓霰冉喜?-----象皮擦(象皮差)
木魚掉進海里會變成什么------虱目魚(濕木魚)
哪一位藝人講的笑話最冷------蔡依琳(衣淋濕就冷)
狼、老虎和獅子誰玩游戲一定會被淘汰------狼,桃太郎(淘汰狼)
孔子有三位徒弟子貢、子路和子游,請問哪一位不是人------子路(指鹿為馬)
布跟紙怕什么------不怕一萬只怕萬一 (布怕一萬紙怕萬一)
麒麟飛到北極會變成什么------冰淇淋(冰麒麟)
哪個歷史人物游泳必定沉下去------阿斗,扶(浮)不起的阿斗
星星、月亮、太陽哪一個是啞巴------星星,歌中有「天上的星星不說話 」
鉛筆姓什么------蕭,削(蕭)鉛筆
糖果是公的還是母的------母的,因為它會生螞蟻
請問哪一種花沒有孩子------五月花, 五月花衛生紙(未生子)
左和右,誰喜歡獨奏,誰又比較好------左solo, 右so good (左手鑼,右手鼓)
為什么蠶寶寶很有錢------蠶會結繭(節儉)
周瑜與諸葛亮的母親分別姓什么------[既]生瑜,[何]生亮
和誰交往最辛苦------莉莉,粒粒(莉莉)皆辛苦
蝴蝶、螞蟻、蜘蛛、蜈蚣,哪一個沒有領到酬勞------蜈蚣,無功(蜈蚣)不受祿
哪位歷史人物最欠扁------蘇武,蘇武牧羊北海邊(被海扁)
123456789哪個數字最勤勞,哪個數字最懶惰------1最勤勞2最懶惰(一不做二不休)
誰家沒有電話------天衣(天衣無縫 phone)
怎樣使麻雀安靜下來------壓它一下(鴉雀無聲)
哪一家的路最窄------冤家(冤家路窄)
紅豆的小孩是誰------南國(紅豆生南國)
有位媽媽生了連體嬰,姐姐叫瑪麗,那么妹妹叫什么------夢露,瑪麗蓮(連)夢露
正則表達式用于字符串處理、表單驗證等場合,實用高效。現將一些常用的表達式收集于此,以備不時之需。
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
評注:匹配中文還真是個頭疼的事,有了這個表達式就好辦了
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
匹配空白行的正則表達式:\n\s*\r
評注:可以用來刪除空白行
匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*? />
評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力
匹配首尾空白字符的正則表達式:^\s*|\s*$
評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
評注:表單驗證時很實用
匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*
評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用
匹配國內電話號碼:\d{3}-\d{8}|\d{4}-\d{7}
評注:匹配形式如 0511-4405222 或 021-87888822
匹配騰訊QQ號:[1-9][0-9]{4,}
評注:騰訊QQ號從10000開始
匹配中國郵政編碼:[1-9]\d{5}(?!\d)
評注:中國郵政編碼為6位數字
匹配身份證:\d{15}|\d{18}
評注:中國的身份證為15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
評注:提取ip地址時有用
匹配特定數字:
^[1-9]\d*$ //匹配正整數
^-[1-9]\d*$ //匹配負整數
^-?[1-9]\d*$ //匹配整數
^[1-9]\d*|0$ //匹配非負整數(正整數 + 0)
^-[1-9]\d*|0$ //匹配非正整數(負整數 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點數
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負浮點數
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點數
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負浮點數(正浮點數 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點數(負浮點數 + 0)
評注:處理大量數據時有用,具體應用時注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
評注:最基本也是最常用的一些表達式
原載地址:http://lifesinger.3322.org/myblog/?p=185
數據庫是面向事務的設計,數據倉庫是面向主題設計的。數據庫一般存儲在線交易數據,數據倉庫存儲的一般是歷史數據。
數據庫設計是盡量避免冗余,一般采用符合范式的規則來設計,數據倉庫在設計是有意引入冗余,采用反范式的方式來設計。
數據庫是為捕獲數據而設計,數據倉庫是為分析數據而設計,它的兩個基本的元素是維表和事實表。(維是看問題的角度,比如時間,部門,維表放的就是這些東西的定義,事實表里放著要查詢的數據,同時有維的ID)
數據倉庫,是在數據庫已經大量存在的情況下,為了進一步挖掘數據資源、為了決策需要而產生的,它決不是所謂的“大型數據庫”。那么,數據倉庫與傳統數據庫比較,有哪些不同呢?讓我們先看看W.H.Inmon關于數據倉庫的定義:面向主題的、集成的、與時間相關且不可修改的數據集合。
“面向主題的”:傳統數據庫主要是為應用程序進行數據處理,未必按照同一主題存儲數據;數據倉庫側重于數據分析工作,是按照主題存儲的。這一點,類似于傳統農貿市場與超市的區別—市場里面,白菜、蘿卜、香菜會在一個攤位上,如果它們是一個小販賣的;而超市里,白菜、蘿卜、香菜則各自一塊。也就是說,市場里的菜(數據)是按照小販(應用程序)歸堆(存儲)的,超市里面則是按照菜的類型(同主題)歸堆的。
“與時間相關”:數據庫保存信息的時候,并不強調一定有時間信息。數據倉庫則不同,出于決策的需要,數據倉庫中的數據都要標明時間屬性。決策中,時間屬性很重要。同樣都是累計購買過九車產品的顧客,一位是最近三個月購買九車,一位是最近一年從未買過,這對于決策者意義是不同的。
“不可修改”:數據倉庫中的數據并不是最新的,而是來源于其它數據源。數據倉庫反映的是歷史信息,并不是很多數據庫處理的那種日常事務數據(有的數據庫例如電信計費數據庫甚至處理實時信息)。因此,數據倉庫中的數據是極少或根本不修改的;當然,向數據倉庫添加數據是允許的。
數據倉庫的出現,并不是要取代數據庫。目前,大部分數據倉庫還是用關系數據庫管理系統來管理的。可以說,數據庫、數據倉庫相輔相成、各有千秋
補充一下,數據倉庫的方案建設的目的,是為前端查詢和分析作為基礎,由于有較大的冗余,所以需要的存儲也較大。為了更好地為前端應用服務,數據倉庫必須有如下幾點優點,否則是失敗的數據倉庫方案。
1.效率足夠高。客戶要求的分析數據一般分為日、周、月、季、年等,可以看出,日為周期的數據要求的效率最高,要求24小時甚至12小時內,客戶能看到昨天的數據分析。由于有的企業每日的數據量很大,設計不好的數據倉庫經常會出問題,延遲1-3日才能給出數據,顯然不行的。
2.數據質量。客戶要看各種信息,肯定要準確的數據,但由于數據倉庫流程至少分為3步,2次ETL,復雜的架構會更多層次,那么由于數據源有臟數據或者代碼不嚴謹,都可以導致數據失真,客戶看到錯誤的信息就可能導致分析出錯誤的決策,造成損失,而不是效益。
3.擴展性。之所以有的大型數據倉庫系統架構設計復雜,是因為考慮到了未來3-5年的擴展性,這樣的話,客戶不用太快花錢去重建數據倉庫系統,就能很穩定運行。主要體現在數據建模的合理性,數據倉庫方案中多出一些中間層,使海量數據流有足夠的緩沖,不至于數據量大很多,就運行不起來了.
ETL是將業務系統的數據經過抽取、清洗轉換之后加載到數據倉庫的過程,目的是將企業中的分散、零亂、標準不統一的數據整合到一起,為企業的決策提供分析的依據
ETL是BI項目最重要的一個環節,通常情況下ETL會花掉整個項目的1/3的時間,ETL設計的好壞直接關接到BI項目的成敗。ETL也是一個長期的過程,只有不斷的發現問題并解決問題,才能使ETL運行效率更高,為項目后期開發提供準確的數據。
ETL的設計分三部分:數據抽取、數據的清洗轉換、數據的加載。在設計ETL的時候也是從這三部分出發。數據的抽取是從各個不同的數據源抽取到ODS中(這個過程也可以做一些數據的清洗和轉換),在抽取的過程中需要挑選不同的抽取方法,盡可能的提高ETL的運行效率。ETL三個部分中,花費時間最長的是T(清洗、轉換)的部分,一般情況下這部分工作量是整個ETL的2/3。數據的加載一般在數據清洗完了之后直接寫入DW中去。
ETL的實現有多種方法,常用的有三種,第一種是借助ETL工具如Oracle的OWB、SQL server 2000的DTS、SQL Server2005的SSIS服務、informatic等實現,第二種是SQL方式實現,第三種是ETL工具和SQL相結合。前兩種方法各有優缺點,借助工具可以快速的建立起ETL工程,屏蔽復雜的編碼任務,提高速度,降低難度,但是欠缺靈活性。SQL的方法優點是靈活,提高ETL運行效率,但是編碼復雜,對技術要求比較高。第三種是綜合了前面二種的優點,極大的提高ETL的開發速度和效率。
數據的抽取
數據的抽取需要在調研階段做大量工作,首先要搞清楚以下幾個問題:數據是從幾個業務系統中來?各個業務系統的數據庫服務器運行什么DBMS?是否存在手工數據,手工數據量有多大?是否存在非結構化的數據?等等類似問題,當收集完這些信息之后才可以進行數據抽取的設計。
1、與存放DW的數據庫系統相同的數據源處理方法
這一類數源在設計比較容易,一般情況下,DBMS(包括SQLServer,Oracle)都會提供數據庫鏈接功能,在DW數據庫服務器和原業務系統之間建立直接的鏈接關系就可以寫Select 語句直接訪問。
2、與DW數據庫系統不同的數據源的處理方法。
這一類數據源一般情況下也可以通過ODBC的方式建立數據庫鏈接,如SQL Server和Oracle之間。如果不能建立數據庫鏈接,可以有兩種方式完成,一種是通過工具將源數據導出成.txt或者是.xls文件,然后再將這些源系統文件導入到ODS中。另外一種方法通過程序接口來完成。
3、對于文件類型數據源(.txt,,xls),可以培訓業務人員利用數據庫工具將這些數據導入到指定的數據庫,然后從指定的數據庫抽取。或者可以借助工具實現,如SQL SERVER 2005 的SSIS服務的平面數據源和平面目標等組件導入ODS中去。
4、增量更新問題
對于數據量大的系統,必須考慮增量抽取。一般情況,業務系統會記錄業務發生的時間,可以用作增量的標志,每次抽取之前首先判斷ODS中記錄最大的時間,然后根據這個時間去業務系統取大于這個時間的所有記錄。利用業務系統的時間戳,一般情況下,業務系統沒有或者部分有時間戳。
數據的清洗轉換
一般情況下,數據倉庫分為ODS、DW兩部分,通常的做法是從業務系統到ODS做清洗,將臟數據和不完整數據過濾掉,再從ODS到DW的過程中轉換,進行一些業務規則的計算和聚合。
1、數據清洗
數據清洗的任務是過濾那些不符合要求的數據,將過濾的結果交給業務主管部門,確認是否過濾掉還是由業務單位修正之后再進行抽取。不符合要求的數據主要是有不完整的數據、錯誤的數據和重復的數據三大類。
- A、不完整的數據,其特征是是一些應該有的信息缺失,如供應商的名稱,分公司的名稱,客戶的區域信息缺失、業務系統中主表與明細表不能匹配等。需要將這一類數據過濾出來,按缺失的內容分別寫入不同Excel文件向客戶提交,要求在規定的時間內補全。補全后才寫入數據倉庫。
- B、錯誤的數據,產生原因是業務系統不夠健全,在接收輸入后沒有進行判斷直接寫入后臺數據庫造成的,比如數值數據輸成全角數字字符、字符串數據后面有一個回車、日期格式不正確、日期越界等。這一類數據也要分類,對于類似于全角字符、數據前后有不面見字符的問題只能寫SQL的方式找出來,然后要求客戶在業務系統修正之后抽取;日期格式不正確的或者是日期越界的這一類錯誤會導致ETL運行失敗,這一類錯誤需要去業務系統數據庫用SQL的方式挑出來,交給業務主管部門要求限期修正,修正之后再抽取。
- C、重復的數據,特別是維表中比較常見,將重復的數據的記錄所有字段導出來,讓客戶確認并整理。
數據清洗是一個反復的過程,不可能在幾天內完成,只有不斷的發現問題,解決問題。對于是否過濾、是否修正一般要求客戶確認;對于過濾掉的數據,寫入Excel文件或者將過濾數據寫入數據表,在ETL開發的初期可以每天向業務單位發送過濾數據的郵件,促使他們盡快的修正錯誤,同時也可以作為將來驗證數據的依據。數據清洗需要注意的是不要將有用的數據過濾掉了,對于每個過濾規則認真進行驗證,并要用戶確認才行。
2、數據轉換
數據轉換的任務主要是進行不一致的數據轉換、數據粒度的轉換和一些商務規則的計算。
- A、不一致數據轉換,這個過程是一個整合的過程,將不同業務系統的相同類型的數據統一,比如同一個供應商在結算系統的編碼是XX0001,而在CRM中編碼是YY0001,這樣在抽取過來之后統一轉換成一個編碼。
- B、數據粒度的轉換,業務系統一般存儲非常明細的數據,而數據倉庫中的數據是用來分析的,不需要非常明細的數據,一般情況下,會將業務系統數據按照數據倉庫粒度進行聚合。
- C、商務規則的計算,不同的企業有不同的業務規則,不同的數據指標,這些指標有的時候不是簡單的加加減減就能完成,這個時候需要在ETL中將這些數據指標計算好了之后存儲在數據倉庫中,供分析使用。
ETL日志與警告發送
1、ETL日志,記錄日志的目的是隨時可以知道ETL運行情況,如果出錯了,出錯在那里。
ETL日志分為三類。第一類是執行過程日志,是在ETL執行過程中每執行一步的記錄,記錄每次運行每一步驟的起始時間,影響了多少行數據,流水賬形式。第二類是錯誤日志,當某個模塊出錯的時候需要寫錯誤日志,記錄每次出錯的時間,出錯的模塊以及出錯的信息等。第三類日志是總體日志,只記錄ETL開始時間,結束時間是否成功信息。
如果使用ETL工具,工具會自動產生一些日志,這一類日志也可以作為ETL日志的一部分。
2、警告發送
ETL出錯了,不僅要寫ETL出錯日志而且要向系統管理員發送警告,發送警告的方式有多種,常用的就是給系統管理員發送郵件,并附上出錯的信息,方便管理員排查錯誤。