1.JDBC有幾種驅(qū)動類型:
type 1:jdbc-odbc橋
type 2:本地api驅(qū)動
type 3:網(wǎng)絡(luò)協(xié)議驅(qū)動
type 4:本地協(xié)議驅(qū)動
Type 1: jdbc-odbc橋
Jdbc-odbc橋是sun公司提供的,是jdk提供的的標準api. 這種類型的驅(qū)動實際是把所有jdbc的調(diào)用傳遞給odbc ,再由odbc調(diào)用本地數(shù)據(jù)庫驅(qū)動代碼.( 本地數(shù)據(jù)庫驅(qū)動代碼是指由數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫操作二進制代碼庫,例如在oracle for windows中就是oci dll 文件)
jdbc-odbc橋 ---- odbc---- 廠商DB代碼 ----- 數(shù)據(jù)庫Server
(圖一)
只要本地機裝有相關(guān)的odbc驅(qū)動那么采用jdbc-odbc橋幾乎可以訪問所有的數(shù)據(jù)庫,jdbc-odbc方法對于客戶端已經(jīng)具備odbc driver的應用還是可行的.但是,由于jdbc-odbc先調(diào)用odbc再由odbc去調(diào)用本地數(shù)據(jù)庫接口訪問數(shù)據(jù)庫.所以,執(zhí)行效率比較低,對于那些大數(shù)據(jù)量存取的應用是不適合的.而且,這種方法要求客戶端必須安裝odbc 驅(qū)動,所以對于基于internet ,intranet的應用也是不合適的.因為,你不可能要求所有客戶都能找到odbc driver.
Type 2: 本地Api驅(qū)動
本地api驅(qū)動直接把jdbc調(diào)用轉(zhuǎn)變?yōu)閿?shù)據(jù)庫的標準調(diào)用再去訪問數(shù)據(jù)庫.這種方法需要本地數(shù)據(jù)庫驅(qū)動代碼.
本地api驅(qū)動----廠商DB代碼-----數(shù)據(jù)庫Server
(圖二)
這種驅(qū)動比起jdbc-odbc橋執(zhí)行效率大大提高了.但是,它仍然需要在客戶端加載數(shù)據(jù)庫廠商提供的代碼庫.這樣就不適合基于internet的應用.并且,他的執(zhí)行效率比起3,4型的jdbc驅(qū)動還是不夠高.
Type3:網(wǎng)絡(luò)協(xié)議驅(qū)動
這種驅(qū)動實際上是根據(jù)我們熟悉的三層結(jié)構(gòu)建立的. jdbc先把對數(shù)局庫的訪問請求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器. 中間件服務(wù)器再把請求翻譯為符合數(shù)據(jù)庫規(guī)范的調(diào)用,再把這種調(diào)用傳給數(shù)據(jù)庫服務(wù)器.如果中間件服務(wù)器也是用java開發(fā)的,那么在在中間層也可以使用1,2型 jdbc驅(qū)動程序作為訪問數(shù)據(jù)庫的方法.
網(wǎng)絡(luò)協(xié)議驅(qū)動---------中間件服務(wù)器------------數(shù)據(jù)庫Server
( 圖三)
由于這種驅(qū)動是基于server的.所以,它不需要在客戶端加載數(shù)據(jù)庫廠商提供的代碼庫.而且他在執(zhí)行效率和可升級性方面是比較好的.因為大部分功能實現(xiàn)都在server端,所以這種驅(qū)動可以設(shè)計的很小,可以非常快速的加載到內(nèi)存中. 但是,這種驅(qū)動在中間件層仍然需要有配置其它數(shù)據(jù)庫驅(qū)動程序,并且由于多了一個中間層傳遞數(shù)據(jù),它的執(zhí)行效率還不是最好.
Type4 本地協(xié)議驅(qū)動
這種驅(qū)動直接把jdbc調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫系統(tǒng)規(guī)范的請求.由于4型驅(qū)動寫的應用可以直接和數(shù)據(jù)庫服務(wù)器通訊.這種類型的驅(qū)動完全由java實現(xiàn),因此實現(xiàn)了平臺獨立性.
本地協(xié)議驅(qū)動---------數(shù)據(jù)庫Server
( 圖四)
由于這種驅(qū)動不需要先把jdbc的調(diào)用傳給odbc或本地數(shù)據(jù)庫接口或者是中間層服務(wù)器.所以它的執(zhí)行效率是非常高的.而且,它根本不需要在客戶端或服務(wù)器端裝載任何的軟件或驅(qū)動. 這種驅(qū)動程序可以動態(tài)的被下載.但是對于不同的數(shù)據(jù)庫需要下載不同的驅(qū)動程序.
以上對四種類型的jdbc驅(qū)動做了一個說明.那么它們適合那種類型的應用開發(fā)呢?Jdbc-odbc橋由于它的執(zhí)行效率不高,更適合做為開發(fā)應用時的一種過度方案,或著對于初學者了解jdbc編程也較適用. 對于那些需要大數(shù)據(jù)量操作的應用程序則應該考慮2,3,4型驅(qū)動.在intranet方面的應用可以考慮2型驅(qū)動,但是由于3,4型驅(qū)動在執(zhí)行效率上比2型驅(qū)動有著明顯的優(yōu)勢,而且目前開發(fā)的趨勢是使用純java.所以3,4型驅(qū)動也可以作為考慮對象. 至于基于internet方面的應用就只有考慮3,4型驅(qū)動了. 因為3型驅(qū)動可以把多種數(shù)據(jù)庫驅(qū)動都配置在中間層服務(wù)器.所以3型驅(qū)動最適合那種需要同時連接多個不同種類的數(shù)據(jù)庫, 并且對并發(fā)連接要求高的應用. 4型驅(qū)動則適合那些連接單一數(shù)據(jù)庫的工作組應用.
今天項目中碰到一個科學計算法的問題,我保存到數(shù)據(jù)庫的是數(shù)字,但是從數(shù)據(jù)庫中取出來在頁面展現(xiàn)的時候確變成了科學計算法的形式了。最后查了下,發(fā)現(xiàn)<bean:write/>里有個屬性format="##.00"這樣可以就正確顯示保存的數(shù)字。因為我的涉及到小數(shù)點的問題,所以我保留了兩位有效數(shù)字。
Date.prototype.isLeapYear 判斷閏年
Date.prototype.Format 日期格式化
Date.prototype.DateAdd 日期計算
Date.prototype.DateDiff 比較日期差
Date.prototype.toString 日期轉(zhuǎn)字符串
Date.prototype.toArray 日期分割為數(shù)組
Date.prototype.DatePart 取日期的部分信息
Date.prototype.MaxDayOfDate 取日期所在月的最大天數(shù)
Date.prototype.WeekNumOfYear 判斷日期所在年的第幾周
StringToDate 字符串轉(zhuǎn)日期型
IsValidDate 驗證日期有效性
CheckDateTime 完整日期時間檢查
daysBetween 日期天數(shù)差
js 代碼
-
-
-
- Date.prototype.isLeapYear = function()
- {
- return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
- }
-
-
-
-
-
-
-
-
-
-
-
- Date.prototype.Format = function(formatStr)
- {
- var str = formatStr;
- var Week = ['日','一','二','三','四','五','六'];
-
- str=str.replace(/yyyy|YYYY/,this.getFullYear());
- str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));
-
- str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0' + this.getMonth());
- str=str.replace(/M/g,this.getMonth());
-
- str=str.replace(/w|W/g,Week[this.getDay()]);
-
- str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());
- str=str.replace(/d|D/g,this.getDate());
-
- str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());
- str=str.replace(/h|H/g,this.getHours());
- str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());
- str=str.replace(/m/g,this.getMinutes());
-
- str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());
- str=str.replace(/s|S/g,this.getSeconds());
-
- return str;
- }
-
-
-
-
- function daysBetween(DateOne,DateTwo)
- {
- var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ('-'));
- var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);
- var OneYear = DateOne.substring(0,DateOne.indexOf ('-'));
-
- var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf ('-'));
- var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);
- var TwoYear = DateTwo.substring(0,DateTwo.indexOf ('-'));
-
- var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);
- return Math.abs(cha);
- }
-
-
-
-
-
- Date.prototype.DateAdd = function(strInterval, Number) {
- var dtTmp = this;
- switch (strInterval) {
- case 's' :return new Date(Date.parse(dtTmp) + (1000 * Number));
- case 'n' :return new Date(Date.parse(dtTmp) + (60000 * Number));
- case 'h' :return new Date(Date.parse(dtTmp) + (3600000 * Number));
- case 'd' :return new Date(Date.parse(dtTmp) + (86400000 * Number));
- case 'w' :return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));
- case 'q' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
- case 'm' :return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
- case 'y' :return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
- }
- }
-
-
-
-
- Date.prototype.DateDiff = function(strInterval, dtEnd) {
- var dtStart = this;
- if (typeof dtEnd == 'string' )
- {
- dtEnd = StringToDate(dtEnd);
- }
- switch (strInterval) {
- case 's' :return parseInt((dtEnd - dtStart) / 1000);
- case 'n' :return parseInt((dtEnd - dtStart) / 60000);
- case 'h' :return parseInt((dtEnd - dtStart) / 3600000);
- case 'd' :return parseInt((dtEnd - dtStart) / 86400000);
- case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));
- case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);
- case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();
- }
- }
-
-
-
-
- Date.prototype.toString = function(showWeek)
- {
- var myDate= this;
- var str = myDate.toLocaleDateString();
- if (showWeek)
- {
- var Week = ['日','一','二','三','四','五','六'];
- str += ' 星期' + Week[myDate.getDay()];
- }
- return str;
- }
-
-
-
-
-
- function IsValidDate(DateStr)
- {
- var sDate=DateStr.replace(/(^\s+|\s+$)/g,'');
- if(sDate=='') return true;
-
-
- var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');
- if (s=='')
- {
- var t=new Date(sDate.replace(/\-/g,'/'));
- var ar = sDate.split(/[-/:]/);
- if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())
- {
-
- return false;
- }
- }
- else
- {
-
- return false;
- }
- return true;
- }
-
-
-
-
-
- function CheckDateTime(str)
- {
- var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;
- var r = str.match(reg);
- if(r==null)return false;
- r[2]=r[2]-1;
- var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);
- if(d.getFullYear()!=r[1])return false;
- if(d.getMonth()!=r[2])return false;
- if(d.getDate()!=r[3])return false;
- if(d.getHours()!=r[4])return false;
- if(d.getMinutes()!=r[5])return false;
- if(d.getSeconds()!=r[6])return false;
- return true;
- }
-
-
-
-
- Date.prototype.toArray = function()
- {
- var myDate = this;
- var myArray = Array();
- myArray[0] = myDate.getFullYear();
- myArray[1] = myDate.getMonth();
- myArray[2] = myDate.getDate();
- myArray[3] = myDate.getHours();
- myArray[4] = myDate.getMinutes();
- myArray[5] = myDate.getSeconds();
- return myArray;
- }
-
-
-
-
-
-
- Date.prototype.DatePart = function(interval)
- {
- var myDate = this;
- var partStr='';
- var Week = ['日','一','二','三','四','五','六'];
- switch (interval)
- {
- case 'y' :partStr = myDate.getFullYear();break;
- case 'm' :partStr = myDate.getMonth()+1;break;
- case 'd' :partStr = myDate.getDate();break;
- case 'w' :partStr = Week[myDate.getDay()];break;
- case 'ww' :partStr = myDate.WeekNumOfYear();break;
- case 'h' :partStr = myDate.getHours();break;
- case 'n' :partStr = myDate.getMinutes();break;
- case 's' :partStr = myDate.getSeconds();break;
- }
- return partStr;
- }
-
-
-
-
- Date.prototype.MaxDayOfDate = function()
- {
- var myDate = this;
- var ary = myDate.toArray();
- var date1 = (new Date(ary[0],ary[1]+1,1));
- var date2 = date1.dateAdd(1,'m',1);
- var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));
- return result;
- }
-
-
-
-
- Date.prototype.WeekNumOfYear = function()
- {
- var myDate = this;
- var ary = myDate.toArray();
- var year = ary[0];
- var month = ary[1]+1;
- var day = ary[2];
- document.write('< script language=VBScript\> \n');
- document.write('myDate = DateValue(''+month+'-'+day+'-'+year+'') \n');
- document.write('result = DatePart('ww', myDate) \n');
- document.write(' \n');
- return result;
- }
-
-
-
-
-
- function StringToDate(DateStr)
- {
-
- var converted = Date.parse(DateStr);
- var myDate = new Date(converted);
- if (isNaN(myDate))
- {
-
- var arys= DateStr.split('-');
- myDate = new Date(arys[0],--arys[1],arys[2]);
- }
- return myDate;
- }
有時候在我們的網(wǎng)絡(luò)應用中,防止程序自動登錄搞破壞,我們一般都會加上驗證碼,這些驗證碼一般來說都是由人來識別的,當然,如果驗證碼很有規(guī)律,或者說很清楚,漂亮,那么也是可能被程序識別的,我以前就識別過某網(wǎng)站的驗證碼,因為比較有規(guī)律,所以被識別了,并且識別率達到99%左右,其實我們可以制作很復雜一點的驗證碼,添加一些干擾的線條或者字體變形,使程序識別的難度加大,這樣,我們的目的也就達到了.
下面是生成的圖片:

代碼如下,JSP代碼
<%@page contentType="image/jpeg"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.awt.*,javax.imageio.*,java.io.*,java.util.*,java.awt.image.*" %>
<%--
The taglib directive below imports the JSTL library. If you uncomment it,
you must also add the JSTL library to the project. The Add Library
action
on Libraries node in Projects view can be used to add the JSTL 1.1 library.
--%>
<%--
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%!String s="";%>
<%
java.util.List<String> fonts=new ArrayList<String>();
GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
String[] names=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
for(String s:names){
char c=s.charAt(0);
if(Character.isLowerCase(c)||Character.isUpperCase(c)){
}else{
fonts.add(s);
}
}
BufferedImage bi=new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
Graphics2D g=bi.createGraphics();
char[] cs={'0','1','2','3','4','5','6','7','8','9'};
char[] use=new char[4];
g.setColor(new Color(240,240,240));
g.fillRect(0,0,200,50);
for(int i=0;i<4;i++){
Point p=new Point(5+(i*((int)(Math.random()*10)+40)),40);
int size=0;
int[] sizes=new int[20];
for(int j=0;j<20;j++){
sizes[j]=30+j;
}
size=sizes[(int)(Math.random()*sizes.length)];
int face=0;
if(Math.random()*10>5){
face=Font.BOLD;
}else{
face=Font.ITALIC;
}
use[i]=cs[(int)(Math.random()*cs.length)];
g.setPaint(new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
p.x,p.y-size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256))));
g.setFont(new Font(fonts.get((int)(Math.random()*fonts.size())),face,size));
g.drawString(""+use[i],p.x,p.y);
}
s=new String(use);
session.setAttribute("code", s);
g.setPaint(null);
for(int i=0;i<4;i++){
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.drawLine((int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
}
Random random = new Random();
for (int i=0;i<88;i++) {
int x = random.nextInt(200);
int y = random.nextInt(50);
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.setStroke(new BasicStroke((float)(Math.random()*3)));
g.drawLine(x,y,x,y);
}
OutputStream ot=response.getOutputStream();
ImageIO.write(bi,"JPEG",ot);
g.dispose();
ot.close();
%>
以下是Servlet代碼
/*
* Code.java
*
* Created on 2007年9月21日, 下午12:08
*/
package com.hadeslee;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* @author lbf
* @version
*/
public class Code extends HttpServlet {
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
private List<String> fonts=new ArrayList<String>();
public Code(){
initFonts();
}
private void initFonts(){
GraphicsEnvironment.getLocalGraphicsEnvironment().preferLocaleFonts();
String[] names=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.CHINA);
for(String s:names){
char c=s.charAt(0);
if(Character.isLowerCase(c)||Character.isUpperCase(c)){
}else{
fonts.add(s);
}
}
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream out=response.getOutputStream();
BufferedImage bi=new BufferedImage(200,50,BufferedImage.TYPE_INT_RGB);
Graphics2D g=bi.createGraphics();
char[] cs={'0','1','2','3','4','5','6','7','8','9'};
char[] use=new char[4];
g.setColor(new Color(240,240,240));
g.fillRect(0,0,200,50);
for(int i=0;i<4;i++){
Point p=getPoint(i);
int size=getSize();
use[i]=cs[(int)(Math.random()*cs.length)];
// g.setColor(new Color((int)(Math.random()*256),0,(int)(Math.random()*256)));
g.setPaint(getPaint(p,size));
g.setFont(new Font(fonts.get((int)(Math.random()*fonts.size())),getFace(),size));
g.drawString(""+use[i],p.x,p.y);
}
g.setStroke(new BasicStroke(1.0f));
g.setPaint(null);
for(int i=0;i<4;i++){
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.drawLine((int)(Math.random()*200),(int)(Math.random()*50),(int)(Math.random()*200),(int)(Math.random()*50));
}
Random random = new Random();
for (int i=0;i<88;i++) {
int x = random.nextInt(200);
int y = random.nextInt(50);
g.setColor(new Color((int)(Math.random()*0x00FFFFFFF)));
g.setStroke(getStroke());
g.drawLine(x,y,x,y);
}
ImageIO.write(bi,"JPEG",out);
out.close();
g.dispose();
}
private Stroke getStroke(){
BasicStroke bs=new BasicStroke((float)(Math.random()*3));
return bs;
}
private Point getPoint(int index){
return new Point(5+(index*((int)(Math.random()*10)+40)),40);
}
private Paint getPaint(Point p,int size){
GradientPaint gp=new GradientPaint(p.x,p.y,new Color((int)(Math.random()*256),0,(int)(Math.random()*256)),
p.x,p.y-size,new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
return gp;
}
private int getFace(){
if(Math.random()*10>5){
return Font.BOLD;
}else{
return Font.ITALIC;
}
}
private int getSize(){
int[] sizes=new int[20];
for(int i=0;i<20;i++){
sizes[i]=30+i;
}
return sizes[(int)(Math.random()*sizes.length)];
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
摘要: 一 常用的SQL語句
select name,count(*) from table where .. group by ... 中能查詢的字段只能為group by的字段.
select * from table where rownum < 5 order by id 中查詢出來的結(jié)果不是按數(shù)據(jù)中的ID排序的,而只是將select * from t... 閱讀全文
function remove(){
document.body.removeChild(document.getElementById("showDive"));
}
function insert(hid,showid){
var elment=document.getElementById(showid);
var elmentid=document.getElementById(hid).value;
if(document.getElementById("showDive")!=null){
remove();
}
var div=window.document.createElement("div");
div.innerHTML = "<font color='red'>"+elmentid+"</font>";
div.setAttribute("id","showDive");
div.className ="css2";
div.style.height="100px";
div.style.height = "30px";
div.style.top=document.body.scrollLeft+event.clientY;
div.style.left=document.body.scrollLeft+event.clientX;
window.document.body.appendChild(div);
}
最近在做一個項目,因為考慮的主要是實現(xiàn)查詢,所以沒有用到Hibernate。直接用的jdbc,里面涉及到分頁,所以用到rownum了。
比如,寫個最簡單的用法:select *from (select *from adjustrequsition a order by a.applydate desc) where rownum<6;這樣才是正確的想法,往往像我這樣的新手,喜歡這樣寫:select *from adjustrequsition a where rownum<6 order by a.applydate desc; 這樣是最容易范的錯誤。。因為rownum是先從數(shù)據(jù)庫中任意取的數(shù)據(jù),然后在按條件排序。。HOHO。。
下面是我寫的我工作4個月來最長的sql代碼,畢竟我不是DBA哦。。呵呵
select *
from (select row_number() over(order by t.BEGIN_DATE) ranging,
decode(action_seq,
2,
t.person_name,
3,
(select name from account where id = s1.main_account_seq),
(select name from account where id = s1.main_account_seq)) as debit_name,
decode(action_seq,
7,
t.person_name,
4,
(select name from account where id = s1.main_account_seq),
(select name from account where id = s2.main_account_seq)) as credit_name,
(SELECT action_name FROM action_type WHERE t.action_seq = ID) AS action_name,
decode(action_seq,
2,
decode(bank_seq,
null,
'郵局',
(select bank_name
from bank_info
where id = t.bank_seq)),
(select bank_name from bank_info where id = t.bank_seq)) bankname,
decode(action_seq,
2,
t.card_no,
(select decode(a.email, null, a.mobile, a.email)
from account a, sub_account s
where a.id = s.main_account_seq
and s.id = t.debit_seq)) as debit_no,
decode(action_seq,
4,
t.card_no,
7,
t.card_no,
(select decode(a.email, null, a.mobile, a.email)
from account a, sub_account s
where a.id = s.main_account_seq
and s.id = t.credit_seq)) as credit_no,
t.amount,
to_char(t.BEGIN_DATE, 'YYYY-MM-DD hh24:mi') as begin_date,
t.remark,
t.id,
t.voucher_code,
t.DEBIT_FEE,
t.CREDIT_FEE
from transaction t, sub_account s1, sub_account s2
where t.voucher_code is not null
and exists
(select s.id
from account a, sub_account s
where s.main_account_seq = a.id
and a.account_type = 'B'
and (t.credit_seq = s.id or t.debit_seq = s.id))
and t.DEBIT_SEQ = s1.ID
and t.CREDIT_SEQ = s2.ID
and t.action_seq = 3)
where ranging between 1 and 100