package limitstudy.corestruts2.tag;
import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.util.ValueStack;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@StrutsTag(name="mm", tldTagClass="limitstudy.corestruts2.tag.MMTag", description="MM")
public class MM extends UIBean {
private String message;
public MM(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
}
@Override
protected String getDefaultTemplate() {
return "mm";
}
@StrutsTagAttribute(description="set message", type="String")
public void setMessage(String message) {
this.message = message;
}
@Override
protected void evaluateExtraParams() {
super.evaluateExtraParams();
if (null != message) {
addParameter("message", findString(message));
}
}
}
* strutsTag注解指明了該UIBean的名字 和Tag類的類名。
* getDefaultTemplate()方法用于返回模板的名 字,Struts2會自動在后面加入.ftl擴展名以找到特定的模板文件。
* setXXX,設置UIBean的屬性,一般Tag中有幾個這樣的屬性,這里就有幾個。@StrutsTagAttribute(description="set message", type="String") 注解,說明該屬性是字符串(也可以是其它),這一步很重要。
* 覆寫evaluateExtraParams() 方法,在UIBean初始化后會調用這個方法來初始化設定參數,如addParameter方法,會在freemarker里的parameters里加 入一個key value。這里要注意findString,還有相關的findxxxx方法,它們是已經封裝好了的解釋ognl語法的工具,具體是怎么樣的,大家可以 查看一下UIBean的api doc。
然后是Tag部份:
package limitstudy.corestruts2.tag;
import org.apache.struts2.views.jsp.ui.AbstractUITag;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MMTag extends AbstractUITag {
private String message;
@Override
public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
return new MM(stack, request, response);
}
@Override
protected void populateParams() {
super.populateParams();
MM mm = (MM)component;
mm.setMessage(message);
}
public void setMessage(String message) {
this.message = message;
}
}
* getBean()返回該Tag中的UIBean。
* populateParams()初始化參數,一般用來初始化UIBean(Component)。
* setXXXX設置屬性,和jsp tag是一樣的。
在/WEB-INF/tlds/下建立current.tld文件(文名隨你喜歡):
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<description>test</description>
<tlib-version>2.0</tlib-version>
<short-name>cur</short-name>
<uri>/cur</uri>
<tag>
<name>mm</name>
<tag-class>limitstudy.corestruts2.tag.MMTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>message</name>
<required>true</required>
</attribute>
</tag>
</taglib>
在源代碼目錄中建立template/simple目錄(這個目錄名和你的theme有關),然后在里面建一個 mm.ftl文件:
<a href="http://www.yinsha.com">${parameters.message?html}</a>
建一個action測試一下,視圖文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="cur" uri="/cur" %>
<html>
<head>
<title><s:property value="message" /></title>
</head>
<body>
<cur:mm message="haoahahhahaha" />
</body>
</html>
完。
PS: 寫得有些粗鄙,所以,如有問題的,可以留言。
http://devilkirin.javaeye.com/blog/427395
http://xiaojianhx.javaeye.com/blog/482888The most important thing is to know how to access JSF component from JQuery. The id given to inputText is consisting of formid:componentid. So in this example the id given to textbox is registerform:username. But the presence of : (colon) causes problem to JQuery. So, we need to escape : (colon) using two \\ characters before colon - registerform\\:username.
Java 7已經完成的7大新功能:
1 對集合類的語言支持;
2 自動資源管理;
3 改進的通用實例創建類型推斷;
4 數字字面量下劃線支持;
5 switch中使用string;
6 二進制字面量;
7 簡化可變參數方法調用。
下面我們來仔細看一下這7大新功能:
1 對集合類的語言支持
Java將包含對創建集合類的第一類語言支持。這意味著集合類的創建可以像Ruby和Perl那樣了。
原本需要這樣:
List<String> list = new ArrayList<String>();
list.add("item");
String item = list.get(0);
Set<String> set = new HashSet<String>();
set.add("item");
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("key", 1);
int value = map.get("key");
現在你可以這樣:
List<String> list = ["item"];
String item = list[0];
Set<String> set = {"item"};
Map<String, Integer> map = {"key" : 1};
int value = map["key"];
這些集合是不可變的。
2 自動資源管理
Java中某些資源是需要手動關閉的,如InputStream,Writes,Sockets,Sql classes等。這個新的語言特性允許try語句本身申請更多的資源,
這些資源作用于try代碼塊,并自動關閉。
這個:
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
變成了這個:
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}
你可以定義關閉多個資源:
try (
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest))
{
// code
}
為了支持這個行為,所有可關閉的類將被修改為可以實現一個Closable(可關閉的)接口。
3 增強的對通用實例創建(diamond)的類型推斷
類型推斷是一個特殊的煩惱,下面的代碼:
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
通過類型推斷后變成:
Map<String, List<String>> anagrams = new HashMap<>();
這個<>被叫做diamond(鉆石)運算符,這個運算符從引用的聲明中推斷類型。
4 數字字面量下劃線支持
很長的數字可讀性不好,在Java 7中可以使用下劃線分隔長int以及long了,如:
int one_million = 1_000_000;
運算時先去除下劃線,如:1_1 * 10 = 110,120 – 1_0 = 110
5 switch中使用string
以前你在switch中只能使用number或enum。現在你可以使用string了:
String s = ...
switch(s) {
case "quux":
processQuux(s);
// fall-through
case "foo":
case "bar":
processFooOrBar(s);
break;
case "baz":
processBaz(s);
// fall-through
default:
processDefault(s);
break;
}
6 二進制字面量
由于繼承C語言,Java代碼在傳統上迫使程序員只能使用十進制,八進制或十六進制來表示數(numbers)。
由于很少的域是以bit導向的,這種限制可能導致錯誤。你現在可以使用0b前綴創建二進制字面量:
int binary = 0b1001_1001;
現在,你可以使用二進制字面量這種表示方式,并且使用非常簡短的代碼,可將二進制字符轉換為數據類型,如在byte或short。
byte aByte = (byte)0b001;
short aShort = (short)0b010;
7 簡化的可變參數調用
當程序員試圖使用一個不可具體化的可變參數并調用一個*varargs* (可變)方法時,編輯器會生成一個“非安全操作”的警告。
JDK 7將警告從call轉移到了方法聲明(methord declaration)的過程中。這樣API設計者就可以使用vararg,因為警告的數量大大減少了。
A:
<s:a href=""></s:a>-----超鏈接,類似于html里的<a></a>
<s:action name=""></s:action>-----執行一個view里面的一個action
<s:actionerror/>-----如果action的errors有值那么顯示出來
<s:actionmessage/>-----如果action的message有值那么顯示出來
<s:append var="newMerList">-----添加一個值到list,類似于list.add();
<s:param value="merList1"></s:param>
<s:param value="merList2"></s:param>
</s:append>
<s:autocompleter></s:autocompleter>-----自動完成<s:combobox>標簽的內容,這個是ajax
B:
<s:bean name=""></s:bean>-----類似于struts1.x中的,JavaBean的值
C:
<s:checkbox></s:checkbox>-----復選框
<s:checkboxlist list=""></s:checkboxlist>-----多選框
<s:combobox list=""></s:combobox>-----下拉框
<s:component></s:component>-----圖像符號
D:
<s:date name="time" format="yyyy/MM/dd"/>-----獲取日期格式
<s:datetimepicker></s:datetimepicker>-----日期輸入框
<s:debug></s:debug>-----顯示錯誤信息
<s:div></s:div>-----表示一個塊,類似于html的<div></div>
<s:doubleselect list="#appVar3" listKey="id" listValue="name" name="" doubleName="chinagra.chinagraCategory.id" -----雙下拉框
doubleId="mid" doubleList="#appVar4.get(top.id)" doubleListKey="id" doubleListValue="title" theme="simple"/>
List<Category> categories = chinagraService.searchProblemCategories();;
Map<Long, List<ChinagraCategory>> chinagraCategories = new HashMap<Long, List<ChinagraCategory>>();
for(Category category : categories) {
chinagraCategories.put(category.getId(), chinagraCategoryService.queryByType(category.getId().toString()));
}
E:
<s:if test=""></s:if>
<s:elseif test=""></s:elseif>
<s:else></s:else>-----這3個標簽一起使用,表示條件判斷
F:
<s:fielderror></s:fielderror>-----顯示文件錯誤信息
<s:file></s:file>-----文件上傳
<s:form action=""></s:form>-----獲取相應form的值
G:
<s:generator separator="'aaa,bbb,ccc,ddd'" val=",">
<s:iterator>
<s:property/>
</s:iterator>
</s:generator>----和<s:iterator>標簽一起使用
H:
<s:head/>-----在<head></head>里使用,表示頭文件結束
<s:hidden name="user.name" value="junly"/></s:hidden>-----隱藏值
I:
<s:i18n name=""></s:i18n>-----加載資源包到值堆棧
<s:include value=""></s:include>-----包含一個輸出,servlet或jsp頁面
<s:inputtransferselect list=""></s:inputtransferselect>-----獲取form的一個輸入
<s:iterator value="userlist" var="user" status="s">
<s:if test="#s.index == 0">
<s:property value="name"/>
</s:if>
<s:property value="#s.even"/>
<s:property value="#s.odd"/>
<s:property value="#s.first"/>
<s:property value="#s.last"/>
<s:property value="#s.count"/>
</s:iterator>-----用于遍歷集合
<s:if test="#list.size > 0 "></s:if>-----判斷 ActionContext.getContext().put("list", lists);
<s:elseif test="list.size > 0 "></s:elseif>
<s:else></s:else>
<s:if test="searchCondition.filter!=null">
L:
<s:label></s:label>-----只讀的標簽
M:
<s:merge></s:merge>-----合并遍歷集合出來的值
O:
<s:optgroup></s:optgroup>-----獲取標簽組
<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右選擇框
P:
<s:param name="pageSize" value="pageSize"/></s:param>-----為其他標簽提供參數
<s:password></s:password>-----密碼輸入框
<s:property value="user.name" />-----得到'value'的屬性
<s:push value=""></s:push>-----value的值push到棧中,從而使property標簽的能夠獲取value的屬性
R:
<s:radio name="type" list="#{0:'拍賣會',1:'展會'}" value="0"></s:radio>-----單選按鈕
<s:reset></s:reset>-----重置按鈕
S:
<s:select list=""></s:select>-----單選框
<s:set name=""></s:set>-----賦予變量一個特定范圍內的值
<s:sort comparator=""></s:sort>-----通過屬性給list分類
<s:submit></s:submit>-----提交按鈕
<s:subset source="#subList" start="1" count="2">-----為遍歷集合輸出子集
<s:iterator>
<s:property/>
</s:iterator>
</s:subset>
T:
<s:tabbedPanel id=""></s:tabbedPanel>-----表格框
<s:table></s:table>-----表格
<s:text name="error"/></s:text>-----I18n文本信息
<s:textarea></s:textarea>-----文本域輸入框
<s:textfield></s:textfield>-----文本輸入框
<s:token></s:token>-----攔截器
<s:tree></s:tree>-----樹
<s:treenode label=""></s:treenode>-----樹的結構
U:
<s:updownselect list=""></s:updownselect>-----多選擇框
<s:url value="/academy/get-detail.action?academyInfo.id=${id}"></s:url>-----創建url
<s:url action="search-big.action" escapeAmp="false" namespace="/problem">
<s:param name="name" value="%{'all'}"/>
<s:param name="id" value="0"/>
<s:param name="sex" value="user.sex"/>
</s:url>
JSTL語法及參數
JSTL包含以下的標簽:
常用的標簽:如<c:out>、<c:remove>、<c:catch>、<c:set>等
條件標簽:如<c:if><c:when>、<c:choose>、<c:otherwise>等
URL標簽:如<c:import>、<c:redirect>和<c:url>等
XML標簽:如<xml:out>等
國際化輸出標簽:如<fmt:timeZone>等
SQL標簽:如<sql:query>、<sql:update>、<sql:transaction>等
一般用途的標簽:
1.<c:out>
沒有Body時的語法
<c:out value=”value” [escapeXml=”{true|false}”] [default=”defaultValue”]/>
有Body時的語法
<c:out value=”value” [escapeXml=”{true|false}”]>
這里是Body部分
</c:out>
名字 類型 描述
value Object 將要輸出的表達式
escapeXml boolean 確定以下字符:<,>,&,’,”在字符串中是否被除數,默認為true
default Object 如果vaule計算后的結果是null,那么輸出這個默認值
2.<c:set>
這個標簽用于在某個范圍(page、request、session、application等)中使用某個名字設定特定的值,或者設定某個已經存在的javabean對象的屬性。他類似于<%request.setAttrbute(“name”,”value”);%>
語法1:使用value屬性設定一個特定范圍中的屬性。
<c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/>
語法2:使用value屬性設定一個特定范圍中的屬性,并帶有一個Body。
<c:set var=”varName” [scope=”{page|request|session|application}”]>
Body部分
</c:set>
語法3:設置某個特定對象的一個屬性。
<c:set value=”value” target=”target” property=”propertyName”/>
語法4:設置某個特定對象的一個屬性,并帶有一個Body。
<c:set target=”target” property=”propertyName”>
Body部分
</c:set>
名字 類型 描述
value Object 將要計算的表到式。
var String 用于表示value 值的屬性,如果要在其他標簽中使用,就是通過這 個var指定的值來進行的。它相當于在標簽定義了一個變量,并且這個變量只能在標簽中的一個。
scope String var的有效范圍,可以是page|request|session|application中的一個
target String 將要設置屬性的對象,它必須是javabean或則java.util.Map對象
property Object 待設定的Target對象中的屬性名字,比如在javabean中有個name屬性,提供了setUserId方法,那么這里填userId。
3.<c:remove>
<c:remove var=”varName” [scope=”{page|request|session|application}”]/>
4.<c:catch>
這個標簽相當于捕獲在它里邊的標簽拋出的異常對象
<c:catch [var=”varName”]> //var是異常的名字
內容
</c:catch>
條件標簽
1. <c:if>
語法1:無Body情況
<c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]/>
語法2:有Body的情況
<c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]>
Body內容
</c:if>
名字 類型 描述
test Boolean 表達式的條件,相當于if()中的條件判斷語句。
var String 表示這個語句的名字。
scope String var這個變量的作用范圍。
2.<c:choose>
語法:<c:choose>
Body內容(<c:when>和<c:otherwise>子標簽)
</c:choose>
注意:它的Body只能由以下元素組成:
1) 空格
2) 0或多個<c:when>子標簽,<c:when>必須在<c:otherwise>標簽之前出現.
3) 0個或多個<c:otherwise>子標簽。
<c:choose>
<c:when test="${param.age>70}">
歡迎老年人
</c:when>
<c:when test="${param.age<70 and param.age>35}">
歡迎中年人
</c:when>
<c:otherwise>
您的年齡有誤!
</c:otherwise>
</c:choose>
3.<c:when>
代表的是<c:choose>的一個條件分支,只能在<c:choose>中使用
語法:<c:when test=”testCondition”> //test是boolean類型,用于判斷條件真假
Body語句
</c:when>
4.<c:otherwise>
代表的是<c:choose>中的最后選擇。必須在最后出現
<c:otherwise>
內容
</c:otherwise>
迭代標簽
1.<c:forEach>
語法1:在Collection中迭代
<c:forEach[var=”varName”] items=”collection” [varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]
Body內容
</c:foeEach>
語法2:迭代固定的次數.
<c:forEach [var=”varName”] [varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]
Body內容
</c:foeEach>
名字 類型 描述
var String 迭代的參數,它是標簽參數,在其他標簽中通過它來引用這個標簽中的內容。
Items Collection、ArrayList、 要迭代的items集合.
Iterator、Map、String、
Eunmeration等
VarStatus String 表示迭代的狀態,可以訪問迭代自身的信息
Begin int 表示開始迭代的位置。
End int 表示結束迭代的位置。
Step int 表示迭代移動的步長,默認為1。
URL相關的標簽
1.<c:import>
語法1:資源的內容使用String對象向外暴露
<c:import url=”url” [context=”context”]
[var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]>
內容
</c:import>
語法2:資源的內容使用Reader對象向外暴露。
<c:import url=”url” [context=”context”]
varReader=”varReaderName” [charEncoding=”charEncoding”]>
內容
</c:import>
名字 類型 描述
url String 待導入資源的URL,可以是相對路徑和絕對路徑,并且可以導入其他主機資源
context String 當使用相對路徑訪問外部context資源時,context指定了這個資源的名字。
var String 參數的名字。
scope String var參數的作用范圍。
cahrEncoding String 輸入資源的字符編碼。
varReader String 這個參數的類型是Reader,用于讀取資源。
2.<c:redirct>
語法1:沒有Body的情況.
<c:redirect url=”value” [context=”context”]/>
語法2:有Body情況下,在Body中指定查詢的參數
<c:redirect url=”value” [context=”context”]>
<c:param name=”name” value=”value”/>
</c:redirect>
3.<c:url>
語法1:沒有Body
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]/>
語法2:有Body
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]>
<c:param name=”name” value=”value”/>
</c:url>
名字 類型 描述
value String URL值
context String 當使用相對路徑訪問外部context資源時,context指定了這個資源的名字
var String 標識這個URL標量。
Scope String 變量作用范圍。
SQL相關的標簽
1.<sql:setDataSource>
2.<sql:query>
3.<sql:update>
4.<transaction>
5.<param>
1 對Collection、Map接口的類對象初始化時要先分配合理的空間大小,同時還要按照自已的實際需求選擇合適的對象。
例如:聲明Vector vect=new Vector()時,系統調用:
public Vector() {
// 缺省構造函數
this(10);
// 容量是
10;}
缺省分配10個對象大小容量。
2 優化循環體
循環是比較重復運行的地方,如果循環次數很大,循環體內不好的代碼對效率的影響就會被放大而變的突出。
3 少用new初始化一個實例
盡量少用new來初始化一個類的實例,當一個對象是用new進行初始化時,其構造函數鏈的所有構造函數都被調用到,所以new操作符是很消耗系統資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當生成對象后,系統還要花時間進行垃圾回收和處理。當new創建對象不可避免時,注意避免多次的使用new初始化一個對象。盡量在使用時再創建該對象,另外,應該盡量重復使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變量達到重用的目的。
4 選擇合適的方法調用:
在Java中,一切都是對象,如果有方法(Method)調用,處理器先要檢查該方法是屬于哪個對象,該對象是否有效,對象屬于什么類型,然后選擇合適的方法并調用。可以減少方法的調用,不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。另外,在方法前加上final,private關鍵字有利于編譯器的優化。
5異常處理技巧
異常是Java的一種錯誤處理機制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創建一個新的對象,并進行相關的處理,造成系統的開銷,所以異常應該用在錯誤處理的情況,不應該用來控制程序流程,流程盡量用while,if等處理。在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。
6 盡量使用局部變量
盡量使用局部變量,調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態變量、實例變量等,都在堆(Heap)中創建,速度較慢。
7同步處理技巧
同步主要出現在多線程的情況,為多線程同時運行時提供對象數據安全的機制,多線程是比較復雜話題,應用多線程也是為了獲得性能的提升,應該盡可能減少同步。
另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個方法或函數,而不是整個代碼。
8 盡可能的使用Java自身提供的API
Java的API一般都做了性能的考慮,如果完成相同的功能,優先使用API而不是自己寫的代碼,如數組復制。
9 盡量減少I/O操作
輸入/輸出(I/O)包括很多方面,我們知道,進行I/O操作是很消耗系統資源的。程序中應該盡量少用I/O操作。使用時可以注意: . 合理控制輸出函數System.out.println()對于大多時候是有用的,特別是系統調試的時候,但也會產生大量的信息出現在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。
特別是在發行版中,要合理的控制輸出,可以在項目開發時,設計好一個Debug的工具類,在該類中可以實現輸出開關,輸出的級別,根據不同的情況進行不同的輸出的控制。
10 盡量使用緩存
讀寫內存要比讀寫硬盤上的文件要快很多,應盡可能使用緩沖,以便直接從內存中讀取數據。盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進行處理I/O操作。
同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高
11 盡量不使用同步:
Servlet是多線程的,以處理不同的請求,基于前面同步的分析,如果有太多的同步就失去了多線程的優勢了。
12 不用保存太多的信息在HttpSession中
很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統的開發,如網上商店系統會把購物車信息保存在該用戶的Session中,但當存儲大量的信息或是大的對象在會話中時,是有害的,特別是當系統中用戶的訪問量很大,對內存的需求就會很高。具體開發時,在這兩者之間應作好權衡。
13清除SESSION:
通常情況,當達到設定的超時時間時,同時有些Session沒有了活動,服務器會釋放這些沒有活動的Session,.. 不過這種情況下,特別是多用戶并訪時,系統內存要維護多個的無效Session。當用戶退出時,應該手動釋放,回收資源,實現如下:..
HttpSession theSession = request.getSession();
// 獲取當前Session
if(theSession != null){
theSession.invalidate(); // 使該Session失效
}
14 緩存Home接口
EJB庫使用Enterprise Bean 的客戶端通過它的Home接口創建它的實例。客戶端能通過JNDI訪問它。服務器通過Lookup方法來獲取。
JNDI是個遠程對象,通過RMI方式調用,對它的訪問往往是比較費時的。所以,在設計時可以設計一個類專門用來緩存Home接口,在系統初始化時就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。
15 使用快速度的Jdbc驅動
JDBC API包括兩種實現接口形式,一種是純Java實現的驅動,一種利用ODBC驅動和數據庫客戶端實現,具體有四種驅動模式:
第一類:JDBC-ODBC橋,再加上ODBC驅動程序。
JDBC驅動程序是JDBC-ODBC橋再加上一個ODBC驅動程序。建議第一類驅動程序只用于原型開發,而不要用于正式的運行環境。橋接驅動程序由Sun提供,它的目標是支持傳統的數據庫系統。Sun為該軟件提供關鍵問題的補丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅動程序用于已經在ODBC技術上投資的情形,例如已經投資了Windows應用服務器。
盡管Sun提供了JDBC-ODBC橋接驅動程序,但由于ODBC會在客戶端裝載二進制代碼和數據庫客戶端代碼,這種技術不適用于高事務性的環境。另外,第一類JDBC驅動程序不支持完整的Java命令集,而是局限于ODBC驅動程序的功能,這種驅動方式也叫胖客戶,主要用于低并發請求,大數據量傳輸的應用。
第二類:本機API,部分是Java的驅動程序。
JDBC驅動程序是本機API的部分Java代碼的驅動程序,用于把JDBC調用轉換成主流數據庫API的本機調用。這類驅動程序也存在與第一類驅動程序一樣的性能問題,即客戶端載入二進制代碼的問題,而且它們被綁定了特定的平臺。
第二類驅動程序要求編寫面向特定平臺的代碼,主流的數據庫廠商,例如Oracle和IBM,都為它們的企業數據庫平臺提供了第二類驅動程序,使用這些驅動程序的開發者必須及時跟進不同數據庫廠商針對不同操作系統發行的各個驅動程序版本。
另外,由于第二類驅動程序沒有使用純Java的API,把Java應用連接到數據源時,往往必須執行一些額外的配置工作。很多時候,第二類驅動程序不能在體系結構上與大型主機的數據源兼容;即使做到了兼容,效果也是比較差。
第三類:面向數據庫中間件的純Java驅動程序。
JDBC驅動程序是面向數據庫中間件的純Java驅動程序,JDBC調用被轉換成一種中間件廠商的協議,中間件再把這些調用轉換到數據庫API。第三類JDBC驅動程序的優點是它以服務器為基礎,也就是不再需要客戶端的本機代碼,這使第三類驅動程序要比第一、二兩類快。另外,開發者還可以利用單一的驅動程序連接到多種數據庫。
第四類:直接面向數據庫的純Java驅動程序。
JDBC驅動程序是直接面向數據庫的純Java驅動程序,即所謂的“瘦”(thin)驅動程序,它把JDBC調用轉換成某種直接可被DBMS使用的網絡協議,這樣,客戶機和應用服務器可以直接調用DBMS服務器。對于第四類驅動程序,不同DBMS的驅動程序不同。因此,在一個異構計算環境中,驅動程序的數量可能會比較多。但是,由于第四類驅動程序具有較高的性能,能夠直接訪問DBMS,所以這一問題就不那么突出了, 這種驅動方式,主要用于高并發,低數據量請求的應用中。
16 使用Jdbc鏈接池
為了提高訪問數據庫的性能,我們還可以使用JDBC 2.0的一些規范和特性,JDBC是占用資源的,在使用數據庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關閉Connection。而我們知道,獲取Connection是比較消耗系統資源的。
Connection緩沖池:當一個應用程序關閉一個數據庫連接時,這個連接并不真正釋放而是被循環利用,建立連接是消耗較大的操作,循環利用連接可以顯著的提高性能,因為可以減少新連接的建立。
一個通過DataSource獲取緩沖池獲得連接,并連接到一個CustomerDB數據源的代碼演示如下:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");
Connection conn = dataSource.getConnection("password","username");
17 緩存DataSorce
一個DataSource對象代表一個實際的數據源。這個數據源可以是從關系數據庫到表格形式的文件,完全依賴于它是怎樣實現的,一個數據源對象注冊到JNDI名字服務后,應用程序就可以從JNDI服務器上取得該對象,并使用之和數據源建立連接。
通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是占用資源的。
為了避免再次的JNDI調用,可以系統中緩存要使用的DataSource。
18 即時關閉使用過的資源
互聯網應用系統一般是并發的系統,在每次申請和使用完資源后,應該釋放供別人使用,使用完成后應該保證徹底的釋放。
19 架構選型
CoreMediaCMS將整個應用分成四成架構,每一層都可以獨立于其他層而正常運行,每一層都可以分布式布署,極大的提高了應用系統的穩定性、可擴展性、支持高并發的要求,每一次之前通過中間件Corba進行穩定的傳輸數據。
20 開發框架的選型
充分利用開源框架,可以大大提高開發效率。很多初級開發者,都采用DB+JavaBean+JSP這種初級的開發模式,而現在主要使用Struts、Spring等MVC開發框架。
常用開發框架構選型有:
Struts、Spring、Webwork等。
天極傳媒選擇的開發框架是:Struts+Spring+iBatis,在這個開發框架里,充分利用了Struts、Spring各自己的優點,可以選擇Stuts MVC,也可以選擇Spring MVC。
21 分級存儲
1)數據庫數據分級存儲:
將經常訪問的數據和訪問頻度低的數據,分別存放到不同的分區,甚至存放到不同的數據庫服務器,以便合進分配硬盤I/O及系統I/O。
2)網站內容發布之后,分級存儲:
任何一個大型的網站,一般都有海量的內容,為了提高訪問效率,應搭建分級存儲體系,根據應用的重要性和訪問并發要求,將這些內容分級存儲,同時將靜態內容中的靜態頁面文件、圖片文件、下載文件分不同的Web服務器訪問,降低I/O爭用,提高訪問效率,同時讓數據存儲、管理、備份更加清晰。
22 頁面靜態化
一個大型網站,既有靜態內容,也有動態內容。靜態內容,直接通過Apache或者Squid訪問,效率高,穩定可靠,更多的是受服務器等硬件設備的I/O吞吐量、網絡環境及頁面代碼本身質量限制,不受應用系統及數據庫性能限制,這些內容往往訪問速度和效率不會有較大的問題。
而動態內容,除了受硬件設備I/O、操作系統I/O及內容、網絡環境及頁面代碼的影響,還要受應用服務器和數據庫性能影響,因此,這部份內容,要盡可能作靜態化或者偽靜態,并采用緩存技術,將其緩存,以減少對應用服務器和數據庫服務器的操作次數,提高用戶訪問效率和穩定性。
23 緩存策略
對于構建的業務系統,如果有些數據要經常要從數據庫中讀取,同時,這些數據又不經常變化,這些數據就可以在系統中緩存起來,使用時直接讀取緩存,而不用頻繁的訪問數據庫讀取數據。
緩存工作可以在系統初始化時一次性讀取數據,特別是一些只讀的數據,當數據更新時更新數據庫內容,同時更新緩存的數據值。
例如:在CMS2005系統中,我們將很少發生變化的網站節點樹數據,緩存在客戶端,當用戶登錄時,一次性讀入到客戶端緩存起來,以后編輯在使用時,不用再從數據庫中讀取,大大提高了應用系統的訪問速度。
當然,也可以將數據庫中重復訪問的數據緩存在應用服務器內存中,減少對數據庫的訪問次數,Java常用的緩存技術產品有:MemoryCache、OSCache等。
<html>數字函數
1.1、ABS(n)函數
描述:返回數值n的絕對值。
Examples:select abs(-15) “test” from dual;
1.2、ACOS(n)函數
描述:返回數值n的反余弦值。輸入數值范圍在-1~1之間,返回值為弧度。
Examples:select acos(0.6) “test”,acos(-.6) “test1” from dual;
1.3、COS(n)函數
描述: 返回數值n的余弦值。返回值為弧度。
Examples:select cos(1.6) “test”,cos(-6) “test1” from dual;
1.4、SIN(n)函數
描述: 返回數值n的正弦值。
Examples:select sin(1.6) “test”,sin(-6) “test1” from dual;
1.5、ASIN(n)函數
描述: 返回數值n的反正弦值。輸入數值范圍在-1~1之間,返回值為弧度。
Examples:select asin(0.6) “test”,asin(-0.6) “test1” from dual;
1.6、TAN(n)函數
描述: 返回數值n的正切值。
Examples:select tan(6) “test”,tan(-0.6) “test1” from dual;
1.7、ATAN(n)函數
描述: 返回數值n的反正切值。輸入數值任意,返回值為弧度。
Examples:select atan(6) “test”,atan(-0.6) “test1” from dual;
1.8、ATAN2(n,m)函數
描述: 返回數值n/m的反正切值。輸入數值任意,返回值為弧度。
Examples:select atan2(19,3) “test”,atan2(-9,-0.9) “test1” from dual;
1.9、SINH(n)函數
描述: 返回數值n的雙曲正弦值。輸入數值任意。
Examples:select sinh(6) “test”,sinh(-0.6) “test1” from dual;
1.10、TANH(n)函數
描述: 返回數值n的雙曲正切值。輸入數值任意。
Examples:select tanh(6) “test”,tanh(-0.6) “test1” from dual;
1.11、CEIL(n)函數
描述: 返回大于等于數值n的最小整數。
Examples:select ceil(6) “test”,ceil(6.6) “test1” from dual;
1.12、COSH(n)函數
描述: 返回數值n的雙曲余弦值。
Examples:select cosh(6) “test”,cosh(6.6) “test1” from dual;
1.13、EXP(n)函數
描述: 返回e的n次冥。(e=2.71828183…)
Examples:select exp(6) “test” from dual;
1.14、FLOOR(n)函數
描述: 返回小于等于數值n的最大整數。
Examples:select floor(6) “test”,floor(9.3) “test1” from dual;
1.15、LN(n)函數
描述: 返回數值n的自然對數。(n必須大于0)
Examples:select ln(6) “test” from dual;
1.16、LOG(m,n)函數
描述: 返回以m為底的數值n的對數。(m>1,n>0)
Examples:select log(6,3) “test” from dual;
1.17、MOD(m,n)函數
描述: 返回m/n后的余數,若n=0,則返回m(求模運算)
Examples:select mod(6,3) “test” from dual;
1.18、POWER(m,n)函數
描述: 返回m的n次冥
Examples:select power(6,3) “test” from dual;
1.19、ROUND(n,[m])函數
描述: 執行四舍五入運算,m可以省略,當省略m時,四舍五入到整數位;當m為正數時,四舍五入到小數點后m位;當m為負數時,四舍五入到小數點前m位。
Examples:select round(6.698,2) “test” from dual;
1.20、SIGN(n)函數
描述: 檢測數值的正負,當n<0則返回-1;當n>0則返回1,當n=0返回0。
Examples:select sign(6.698) “test”,sign(-9) “test1”,sign(0) “test2” from dual;
1.21、SQRT(n)函數
描述: 返回數值n的平方根。(n>=0)
Examples:select sqrt(6.698) “test” from dual;
1.22、TRUNC(n,[m])函數
描述: 截取數值n,m可以省略,當省略m時則截取n的小數部分;當m為正數時則將n截取到小數點后m位;當m為負數時則將n截取到小數點前m位
Examples:select trunc(6.698,2) “test”,trunk(696.3,-2) “test1” from dual;
字符函數
說明:字符函數輸入值為字符類型,返回值為字符類型或數字類型,可以在sql語句中直接使用,也可以在pl/sql塊中使用。
2.1、ASCII(n)函數
描述: 返回字符串的ascii碼(當輸入為字符串時返回第一個字符的ascii碼)
Examples:select ascii(‘A’) “test”,ascii(‘我們’) “test1” from dual;
2.2、CHR(n)函數
描述: 返回對應的ascii碼的字符(n必須為數字類型)
Examples:select ascii(54992) “test” from dual;
2.3、CONCAT(n,m)函數
描述: 連接n和m,n和m可以是字符,也可以是字符串。作用和”||”一樣。
Examples:select concat(‘中國’,’人民’) “test” from dual;
2.4、INITCAP(n)函數
描述: 將字符串n中每個單詞首字母大寫,其余小寫(區分單詞的規則是按空格或非字母字符;可以輸入中文字符,但沒有任何作用)
Examples:select initcap(‘中 國 人 民’) “test”,initcap(‘my word’) “test1”,initcap(‘my中國word’) “test2” from dual;
2.5、INSTR(chr1,chr2,[n,[m]])函數
描述: 獲取字符串chr2在字符串chr1中出現的位置。n和m可選,省略是默認為1;n代表開始查找的起始位置,當n為負數從尾部開始搜索;m代表字串出現的次數。
Examples:select instr('pplkoopijk','k',-1,1) “test” from dual;
備注:當n為負數從尾部搜索,但返回值仍然是按正向排列得出的位置。
2.6、LENGTH(n)函數
描述: 返回字符或字符串長度。(當n為null時,返回nll;返回的長度包括后面的空格)
Examples:select length('ppl ') “test”,length(null) “test1” from dual;
2.7、LOWER(n)函數
描述: 將n轉換為小寫。
Examples:select lower('KKKD') “test” from dual;
2.8、LPAD(chr1,n,[chr2])函數
描述: 在chr1左邊填充字符chr2,使得字符總長度為n。chr2可選,默認為空格;當chr1字符串長度大于n時,則從左邊截取chr1的n個字符顯示。
Examples:select lpad('kkk',5) “test”,lpad(‘kkkkk’,4) “test1”,lpad(‘kkk’,6,’lll’) “test2” from dual;
2.9、LTRIM(chr,[n])函數
描述: 去掉字符串chr左邊包含的n字符串中的任何字符,直到出現一個不包含在n中的字符為止。
Examples:select ltrim('abcde',’a’) “test”,ltrim(‘abcde’,’b’) “test1”,ltrim(‘abcdefg’,’cba’) “test2” from dual;
2.10、NLS_INITCAP(chr,[’nls_param’])函數
描述: 將chr首字母大寫。Nls_param可選,指定排序的方式。(有SCHINESE_RADICAL_M(部首、筆畫),SCHINESE_STROKE_M(筆畫、部首),SCHINESE_PINYIN_M(拼音))
Examples:select nls_initcap('ab cde') “test”,nls_initcap(‘a b c d e’,’nls_sort= SCHINESE_PINYIN_M’) “test1” from dual;
2.11、NLS_LOWER(chr,[‘nls_param’])函數
描述: 將字符串轉換為小寫。Nls_param可選,指定排序的方式。(有SCHINESE_RADICAL_M(部首、筆畫),SCHINESE_STROKE_M(筆畫、部首),SCHINESE_PINYIN_M(拼音))
Examples:select nls_lower('ABC') “test”,nls_lower(‘ABC’,’nls_sort= SCHINESE_PINYIN_M’) “test1” from dual;
2.12、NLSSORT(col,[’nls_param’])函數
描述: 根據nls_param指定的方式對col字段進行排序。
Examples:SELECT part_number FROM cux_om_part_all ORDER BY nlssort(part_number,'nls_sort=SCHINESE_RADICAL_M')
2.13、NLS_UPPER(chr,[‘nls_param’])函數
描述: 將chr轉換為大寫。Nls_param可選,用于指定排序規則
Examples:SELECT nls_upper('ddddd','nls_sort=xdanish') FROM dual
2.14、REGEXP_REPLACE(source_string,pattern,replace_string,position,occurtence,match_parameter)函數(10g新函數)
描述:字符串替換函數。相當于增強的replace函數。Source_string指定源字符表達式;pattern指定規則表達式;replace_string指定用于替換的字符串;position指定起始搜索位置;occurtence指定替換出現的第n個字符串;match_parameter指定默認匹配操作的文本串。
其中replace_string,position,occurtence,match_parameter參數都是可選的。
2.15、REGEXP_SUBSTR(source_string, pattern[,position [, occurrence[, match_parameter]]])函數(10g新函數)
描述:返回匹配模式的子字符串。相當于增強的substr函數。Source_string指定源字符表達式;pattern指定規則表達式;position指定起始搜索位置;occurtence指定替換出現的第n個字符串;match_parameter指定默認匹配操作的文本串。
其中position,occurtence,match_parameter參數都是可選的
Examples:select regexp_substr(‘http://www.oracle.com/products’,’http://([[:alnum:]]+\.?) {3,4} / ?’) “regexp_substr” from dual
2.16、REGEXP_LIKE(source_string, pattern
[, match_parameter])函數(10g新函數)
描述:返回滿足匹配模式的字符串。相當于增強的like函數。Source_string指定源字符表達式;pattern指定規則表達式;match_parameter指定默認匹配操作的文本串。
其中position,occurtence,match_parameter參數都是可選的
Examples:
2.17、REGEXP_INSTR(source_string, pattern
[, start_position
[, occurrence
[, return_option
[, match_parameter]]]])函數(10g新函數)
描述: 該函數查找 pattern ,并返回該模式的第一個位置。您可以隨意指定您想要開始搜索的 start_position。 occurrence 參數默認為 1,除非您指定您要查找接下來出現的一個模式。return_option 的默認值為 0,它返回該模式的起始位置;值為 1 則返回符合匹配條件的下一個字符的起始位置
Examples:
附注:上面紅色標題的四個函數是oracle 10g才有的函數,使用正則表達式可以實現很強大的功能。鑒于變化太多,可以參考oracle的官方文檔:SQL Reference(第七章)
2.18、REPLACE(chr,search_string,[,replacement_string])函數
描述:將chr中滿足search_string條件的替換為replacement_string指定的字符串,當search_string為null時,返回chr;當replacement_string為null時,返回chr中截取掉search_string部分的字符串。
Examples: SELECT REPLACE('abcdeef','e','oo') "test",REPLACE('abcdeef','ee','oo') "test1",REPLACE('abcdeef',NULL,'oo') "test2",REPLACE('abcdeef','ee',NULL) "test3" FROM dual
2.19、RPAD(chr1,n,chr2)函數
描述:在chr1右邊填充chr2,使返回字符串長度為n..當chr1長度大于n時,返回左端n個字符。參考LPAD()函數。
2.20、RTRIM(chr,[set])函數
描述:去掉chr右邊包含的set中的任何字符,直到出現一個不是set中的字符結束。參考LTRIM()函數。
2.21、SOUNDEX(chr)函數
描述:返回字符串的語音表示,可以用來比較字符串的發音是否相同。
Examples:select soundex(‘ship’) “test”,soundex(‘sleep’) “test1” from dual;
2.22、SUBSTR(chr,m[,n])函數
描述:取chr的子串。M代表開始位置,n是要取的長度。當m為0時從首字符開始,當m為負時從字符串尾部開始截取。
Examples:select substr(‘abcdef’,0,3) “test”,substr(‘abcdef’,1,3) “test1”,substr(‘abcdef’,-3,3) “test2”,substr(‘abcdef’,-1,3) “test3” from dual
注意:m取0或1時,開始位置是一樣的,都是從第一位開始,m為負的時候,仍然是按從左到右的順序取,所以如果m為-1,n的長度再大,也只能取到最后一個字符,因為chr右邊已經沒有字符了。
2.23、TRANSLATE(chr,from_str,to_str)函數
描述:另一種替換函數的用法。
Examples: SELECT translate('abcdeabc','abc','fgh') "test",translate('abcdeabc','abc','hf') "test1",translate('abcdeabc','ab','hfgh') "test2",translate('abcdeabc','abc',' ') "test3" FROM dual
注意:匹配的規則是from_str和to_str每個字符按順序相對應,如果from_str字符少于to_str中的字符,則只替換能對應的字符,to_str后面不能和from_str對應的字符則不管,如果from_str字符多于to_str字符,則from_str中找不到對應字符按照null來處理。
2.24、TRIM(chr)函數
TRIM函數將字符串的前綴(或尾隨)字符刪除。
其具體的語法格式如下:
TRIM([LEADING|TRAILING|BOTH][trimchar FROM] string)
其中:
LEADING 指明僅僅將字符串的前綴字符刪除
TRAILING 指明僅僅將字符串的尾隨字符刪除
BOTH 指明既刪除前綴字符,也刪除尾隨字符。這也是默認方式
string 任意一待處理字符串
trimchar 可選項。指明試圖刪除什么字符,默認被刪除的字符是空格
下面是該函數的使用情況:
TRIM(’ Ashley ’)=‘Ashley’
TRIM(LEADING ’*’ FROM’***Ashley***’)=‘Ashley***’
2.25、UPPER(chr)函數
UPPER函數間返回字符串的大寫形式。
其具體的語法格式如下:
UPPER(string)
其中:
string 任意VARCHAR2或CHAR型字符串
下面是該函數的使用情況:
UPPER(’THIS IS a Test’)=‘THIS IS A TEST’
日期函數
3.1、add_months(d,n)
說明:用于從一個日期值增加或減少一些月份,d代表一個日期,n為正數則代表在d日期 上增加n月份,n為負數則代表在d日期上減少n月
例:select add_months(sysdate,12) "Next Year" from dual;
3.2、current_date()
說明:返回當前會話時區中的當前日期時間
alter session set time_zone=’-11:00’(更改當前會話時區命令)
例:select sessiontimezone,current_date from dual;
3.3、dbtimezone()
說明:返回數據庫實例時區
select dbtimezone from dual;
3.4、extract()
說明:顯示指定格式的日期值。
select extract(month from sysdate) "This Month" from dual;
select extract(year from add_months(sysdate,36)) "3 Years Out" from dual;
3.5、last_day()
說明:返回包含了日期參數的月份的最后一天的日期
select last_day(sysdate) "last" from dual;
3.6、months_between(d1,d2)
說明:返回d1和d2兩個月份之間相差的月數,若d1<d2,返回負數;d1>d2,返回正數;若d1和d2都是月底或者天數相同,則返回整數,否則以每月31天為基準數返回小數。
select months_between(to_date('2007-01-31','yyyy-mm-dd'),to_date('2006-11-30','yyyy-mm-dd')) from dual;
3.7、next_day(d,varchar2)
說明:返回日期d指定的在日期d之后的第一個工作日;
SELECT next_day(SYSDATE,'星期四') FROM dual;
Select next_day(sysdate,’monday’) from dual; 錯誤,不能使用英文單詞
返回當前日期后的第一個星期四的日期。若當前日期已經是星期四或過了星期四,則返回下周的星期四對應的日期,否則返回本周星期四的日期。
注意:varchar2指定工作日的時候和當前數據庫實例的參數設置有關,字符串需要用中文寫,如果中文不行,就使用英文星期代表。
3.8、round(d,fmt)
說明:返回日期時間的四舍五入結果。如果fmt指定年,則以7月1日為分界;如果指定月,則以16日為分界;關于按天來四舍五入,在測試時無法理解(資料上解釋按天的時候是以中午12:00為分界)
Select round(sysdate,’month’) from dual;
3.9、trunc(d,fmc)
說明:按照指定的格式截斷日期,如果指定格式為年,則結果為本年1月1日,如果格式指定為月,則結果為本月1日,關于格式指定為天還未理解。
SELECT trunc(SYSDATE,'month') FROM dual;
3.10、sysdate
應用:
1. 日期和字符轉換函數用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期轉化為字符串
select to_char(sysdate,'yyyy') as nowYear from dual; //獲取時間的年
select to_char(sysdate,'mm') as nowMonth from dual; //獲取時間的月
select to_char(sysdate,'dd') as nowDay from dual; //獲取時間的日
select to_char(sysdate,'hh24') as nowHour from dual; //獲取時間的時
select to_char(sysdate,'mi') as nowMinute from dual; //獲取時間的分
select to_char(sysdate,'ss') as nowSecond from dual; //獲取時間的秒
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//
2. select to_char( to_date(222,'J'),'Jsp') from dual
顯示Two Hundred Twenty-Two
3.求某天是星期幾
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
星期一
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
monday
設置日期語言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以這樣
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')
4. 兩個日期間的天數
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
5. 時間為null的用法
select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual;
注意要用TO_DATE(null)
6.月份差
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
那么12月31號中午12點之后和12月1號的12點之前是不包含在這個范圍之內的。
所以,當時間需要精確的時候,覺得to_char還是必要的
7. 日期格式沖突問題
輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American
或者在to_date中寫
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
注意我這只是舉了NLS_DATE_LANGUAGE,當然還有很多,
可查看
select * from nls_session_parameters
select * from V$NLS_PARAMETERS
8.
select count(*)
from ( select rownum-1 rnum
from all_objects
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-
02-01','yyyy-mm-dd')+1
)
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
not in ( '1', '7' )
查找2002-02-28至2002-02-01間除星期一和七的天數
在前后分別調用DBMS_UTILITY.GET_TIME, 讓后將結果相減(得到的是1/100秒, 而不是毫秒).
9. 查找月份
select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_day的用法
Next_day(date, day)
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D
11
select to_char(sysdate,'hh:mi:ss') TIME from all_objects
注意:第一條記錄的TIME 與最后一行是一樣的
可以建立一個函數來處理這個問題
create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,'hh:mi:ss') from all_objects;
12.獲得小時數
extract()找出日期或間隔值的字段值
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer
SQL> select sysdate ,to_char(sysdate,'hh') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> select sysdate ,to_char(sysdate,'hh24') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
13.年月日的處理
select older_date,
newer_date,
years,
months,
abs(
trunc(
newer_date-
add_months( older_date,years*12+months )
)
) days
from ( select
trunc(months_between( newer_date, older_date )/12) YEARS,
mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,
newer_date,
older_date
from (
select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date
from emp
)
)
14.處理月份天數不定的辦法
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual
16.找出今年的天數
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
閏年的處理方法
to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )
如果是28就不是閏年
17.yyyy與rrrr的區別
'YYYY99 TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001
18.不同時區的處理
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate
from dual;
19.5秒鐘一個間隔
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')
from dual
2002-11-1 9:55:00 35786
SSSSS表示5位秒數
20.一年的第幾天
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
310 2002-11-6 10:03:51
21.計算小時,分,秒,毫秒
select
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
(
select
trunc(sysdate) Days,
sysdate - trunc(sysdate) A
from dual
)
select * from tabname
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
//
floor((date2-date1) /365) 作為年
floor((date2-date1, 365) /30) 作為月
d(mod(date2-date1, 365), 30)作為日.
23.next_day函數 返回下個星期的日期,day為1-7或星期日-星期六,1表示星期日
next_day(sysdate,6)是從當前開始下一個星期五。后面的數字是從星期日開始算起。
1 2 3 4 5 6 7
日 一 二 三 四 五 六
---------------------------------------------------------------
select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual
日期 返回的是天 然后 轉換為ss
24,round[舍入到最接近的日期](day:舍入到最接近的星期日)
select sysdate S1,
round(sysdate) S2 ,
round(sysdate,'year') YEAR,
round(sysdate,'month') MONTH ,
round(sysdate,'day') DAY from dual
25,trunc[截斷到最接近的日期,單位為天] ,返回的是日期類型
select sysdate S1,
trunc(sysdate) S2, //返回當前日期,無時分秒
trunc(sysdate,'year') YEAR, //返回當前年的1月1日,無時分秒
trunc(sysdate,'month') MONTH , //返回當前月的1日,無時分秒
trunc(sysdate,'day') DAY //返回當前星期的星期天,無時分秒
from dual
26,返回日期列表中最晚日期
select greatest('01-1月-04','04-1月-04','10-2月-04') from dual
27.計算時間差
注:oracle時間差是以天數為單位,所以換算成年月,日
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //時間差-年
select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //時間差-月
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //時間差-天
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //時間差-時
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //時間差-分
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //時間差-秒
28.更新時間
注:oracle時間加減是以天數為單位,設改變量為n,所以換算成年月,日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-年
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改變時間-月
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-時
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-分
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-秒
29.查找月的第一天,最后一天
SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;
轉換函數
4.1、asciistr(str)
說明:將任意字符集的字符串轉換為當前數據庫實例對應的ascii字符串。
SELECT asciistr('中華民族') FROM dual;
備注:和該函數相似的有ascii,它是取得字符串第一個字符的ascii碼,后面的字符不管;chr是將ascii碼轉換為對應的字符。
4.2、cast()
說明:將一個內置數據類型或集合類型轉變為另一個內置數據類型或集合類型。
SELECT CAST(SYSDATE AS VARCHAR2(100)) FROM dual;
4.3、chartorowid(str)
說明:將字符串轉變為rowid數據類型,但字符串必須符合rowid格式。
4.4、convert(str,char_set,source_char_set)
說明:將字符串從一個字符集轉變為另一個字符集。Str為要轉變的字符串,char_set為轉變后的字符集,source_char_set為該字符串原始的字符集。
SELECT convert('中國','US7ASCII','ZHS16GBK') FROM dual;
4.4、rowidtochar(rowid)
說明:將rowid轉換為對應的varchar2數據類型值。
4.5、to_char()
select to_char(n’中國’) from dual; 轉變為本地字符集類型
select to_char(10000,’L99G999D99MI’) from dual; 轉換成貨幣格式
4.6、to_date()
轉變為日期格式。
4.7、to_number()
將字符串轉變為數字值,但字符串必須是數字(0~9)。
單行函數
decode(exer.search1,result1[search2,result2,...][,defalut])
用于匹配特定表達式的結果,如果search1匹配于exer,則返回result1,如果search2匹配于exer則返回result2,
依次類推,如果沒有任何匹配關系則返回defalut
分組函數
6.1AVG 取平均值
Select AVG(SAL) From EMP
6.2max 取最大值
select max(sal) from emp
6.3min 取最小值
select min(sal) from emp
6.4count 取記錄數
SELECT COUNT(*) FROM EMP
也可以
select count(empno) from emp
注意:
要么count(*)
要么count(沒有null值的列---主鍵)
6.5sum 求和
Select SUM(SAL*12) From EMP
應用:
1.分組函數和distinct關鍵詞的搭配
Select COUNT(Distinct SAL) From EMP
2.組函數與空值
select count(comm) from emp
空值不參與運算,直接被過濾掉
3.分組數據
group by子句
SELECT COUNT(*) FROM EMP GROUP BY DEPTNO
4.使用group by規則
A.group by后面的字段不必顯示在select列表中
B.反之則不行
也就是說:select后面的字段必須在group by子句中出現
例外的是:
在組函數(count,max,min等)中出現的字段除外
5.關于group by條件分組的問題
A.group by可以和where來搭配
where只能在group by的前面
Select JOB From EMP Where SAL>2000 Group By JOB
group by后面不能有where
B.where子句中不能包括組函數
條件的表達只能使用having來表示
Select DEPTNO,Max(SAL),Min(SAL) From EMP Group By DEPTNO Having Max(SAL)>2000
對象函數
table:citys
city ran
廣州 A
廣州 B
廣州 C
廣州 D
city ran
廣州 A,B,C,D
請問oracle 的sql語句要怎么寫?
2 備忘
3 直接裝載
4 更新