??xml version="1.0" encoding="utf-8" standalone="yes"?>
打开Plug-ins View扑ֈ插gorg.eclipse.jface.text,右键点击,选择import as Source Project,导入完成?在你的workspace可以看到这个project?br />
2.修改代码
?font style="background-color: #cce8cf">src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java文g?扑ֈq样一行代?br />
char triggers = t.getTriggerCharacter();
if(contains(triggers,key))
在那行if判断里面,eclipse?x)判断key(是你按下的?是否在triggers?如果?那就触发下面的第一行提CZ屏的代码.所以我们要做的是把空格和=h除就可以?
if(key!='='&&key!=0x20&&contains(triggers,key))
3.把修改好的org.eclipse.jface.text导出
右键点击你的workspace里的org.eclipse.jface.text,选择export-->Deployable plugins and fragments, next,destination 选择archive file,然后finish.你就可以在zip文g里看到生成好的jar ,用它替换掉eclipse/plugins里面的同名jar?可以了(jin)
]]>
/Files/yes1983/GUUUI_Web_Prototyping_Tool_3.zip
]]>
]]>
CTE:
说vWITH 语句Q除?jin)那些第一ơ听说WITH语句的hQ大部分人都觉得它是用来做递归查询的。其实那只是它的一个用途而已Q它的本名正如我们标题写的那P叫做Q公p表达式(Common Table ExpressionQ,从字面理解,大家觉得它是用来q嘛的呢Q其实,它是用来定义临时集合的。啊QVALUES语句不是用来定义临时集合的吗Q怎么WITH语句也用来定义(f)旉合呢Q它们有什么区别呢Q?/font>
VALUES语句是用明确的值来定义临时集合的,如下Q?/font>
VALUES (1,2), (1,3),(2,1)
WITH语句是用查询(也就是select语句)来定义(f)旉合的Q从q个角度Ԍ有点像视图,不过不是视图Q大家千万别误解。如下:(x)
CREATE TABLE USER (
NAME VARCHAR(20) NOT NULL,---姓名
SEX INTEGER,---性别Q?、男 2、女Q?br />
BIRTHDAY DATE---生日
);
WITH TEST(NAME_TEST, BDAY_TEST) AS
(
SELECT NAME,BIRTHDAY FROM USER--语句1
)
SELECT NAME_TEST FROM TEST WHERE BDAY_TEST='1949-10-1';--语句2
下面我们来解释一下,首先语句1执行Q它?x)生一个有两列QNAME,BIRTHDAYQ的l果集;接着Q我们将q个l果集命名ؓ(f)testQƈ且将列名重命名ؓ(f)NAME_TEST, BDAY_TESTQ最后我们执行语?Q从q个临时集合中找到生日是1949-10-1Q也是共和国的同龄人?/font>
怎么P如果你感觉不好理解,请仔l的分析一下上面的语句。下面我们D个VALUES语句和W(xu)ITH语句l合使用的例子,如下Q?/font>
WITH TEST(NAME_TEST, BDAY_TEST) AS
(
VALUES ('张三','1997-7-1'),('李四','1949-10-1')
)
SELECT NAME_TEST FROM TEST WHERE BDAY_TEST='1949-10-1'
从上面的介绍和W(xu)ITH语句不ؓ(f)大多Ch所熟?zhn)可以猜测QW(xu)ITH语句是ؓ(f)复杂的查询ؓ(f)设计的,的确是这L(fng)Q下面我们D个复杂的例子Q想提高技术的朋友可千万不能错q。考虑下面的情况:(x)
CREATE TABLE USER
(
NAME VARCHAR(20) NOT NULL,--姓名
DEGREE INTEGER NOT NULL,--学历(1、专U?2、本U?3、硕?4、博?
STARTWORKDATE date NOT NULL,--入职旉
SALARY1 FLOAT NOT NULL,--基本工资
SALARY2 FLOAT NOT NULL--奖金
);
假设现在让你查询一下那?1、学历是士或博?nbsp; 2、学历相同,入职q䆾也相同,但是工资Q基本工?奖金Q却比相同条件员工的q_工资低的员工。(哈哈Q可能是要涨工资Q,不知道你听明白问题没有?该怎么查询呢?我们是这h的:(x)
1、查询学历是士或博士的那些员工得到l果?Q如下:(x)
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)Q?nbsp;
2、根据学历和入职q䆾分组Q求q_工资 得到l果?Q如下:(x)
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY
FROM USER WHERE DEGREE IN (3,4)
GROUP BY DEGREE,YEAR(STARTWORKDATE)
3、以学历和入职年份ؓ(f)条g 联合两个l果集,查找工资<q_工资 的员工,以下是完整的SQLQ?/font>
WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS
(
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)
),
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS
(
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY
FROM USER WHERE DEGREE IN (3,4)
GROUP BY DEGREE,YEAR(STARTWORKDATE)
)
SELECT NAME FROM TEMP1, TEMP2 WHERE
TEMP1.DEGREE=TEMP2.DEGREE
AND TEMP1.WORDDATE=TEMP2.WORDDATE
AND SALARY<AVG_SALARY;
查询l果完全正确Q但我们q有改善的空_(d)在查询结果集2的时候,我们是从user表中取得数据的。其实此时结果集1已经查询出来?jin),我们完全可以从结果?中通过分组得到l果?Q而不用从uer表中得到l果?Q比较上面和下面的语句你可以知道我说的是什么意思了(jin)Q?/font>
WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS
(
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)
),
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS
(
SELECT DEGREE,WORDDATE, AVG(SALARY) AS AVG_SALARY
FROM TEMP1
GROUP BY DEGREE,WORDDATE
)
SELECT NAME FROM TEMP1, TEMP2 WHERE
TEMP1.DEGREE=TEMP2.DEGREE
AND TEMP1.WORDDATE=TEMP2.WORDDATE
AND SALARY<AVG_SALARY;
可能有些朋友?x)说Q我不用WITH语句也可以查出来Q的是q样Q如下:(x)
SELECT U.NAME FROM USER AS U,
(
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY
FROM USER WHERE DEGREE IN (3,4)
GROUP BY DEGREE,YEAR(STARTWORKDATE)
) AS G
WHERE U.DEGREE=G.DEGREE
AND YEAR(U.STARTWORKDATE)=G.WORDDATE
AND (SALARY1+SALARY2)<G.AVG_SALARY;
那用WITH 和不使用 WITHQ这两种写法有什么区别呢Q一般情况下q两U写法在性能上不?x)有太大差异Q但是,
1、当USER表的记录很多
2、硕士或博士QDEGREE IN (3,4)Q在USER表中的比例很?/font>
当满以上条件时Q这两种写法在性能的差异将?x)显现出来,Z么呢Q因Z使用WITH写法的语句访问了(jin)2ơUSER表,如果DEGREE 字段又没有烦(ch)引,性能差异会(x)非常明显?/font>
当你看到q时Q如果很好的理解?jin)上面的内容Q我怿你会(x)对WITH语句有了(jin)一定的体会(x)。然而W(xu)ITH语句能做的还?sh)止q些Q下面给大家介绍一下,如何用WITH语句做递归查询。递归查询的一个典型的例子是对?wi)状l构的表q行查询Q考虑如下的情况:(x)
论坛首页
--数据库开?nbsp;
----DB2
------DB2 文章1
--------DB2 文章1 的评?
--------DB2 文章1 的评?
------DB2 文章2
----Oracle
--Java技?nbsp;
以上是一个论坛的典型例子Q下面我们新Z个表来存储以上信息?/font>
CREATE TABLE BBS
(
PARENTID INTEGER NOT NULL,
ID INTEGER NOT NULL,
NAME VARCHAR(200) NOT NULL---板块、文章、评论等?nbsp;
);
insert into bbs (PARENTID,ID,NAME) values
(0,0,'论坛首页'),
(0,1,'数据库开?),
(1,11,'DB2'),
(11,111,'DB2 文章1'),
(111,1111,'DB2 文章1 的评?'),
(111,1112,'DB2 文章1 的评?'),
(11,112,'DB2 文章2'),
(1,12,'Oracle'),
(0,2,'Java技?);
现在万事兼备?jin),我们开始查询吧。假讄在让你查询一?#8216;DB2 文章1’的所有评论,有h_(d)q还?sh)简单,如下q样可以了(jin)?/font>
SELECT * FROM BBS WHERE PARENTID=(SELECT ID FROM BBS WHERE NAME='DB2');
{案完全正确。那么,现在让你查询一下DB2的所有文章及(qing)评论Q怎么办?传统的方法就很难查询?jin),q时候递归查询派上用Z(jin)Q如下:(x)
WITH TEMP(PARENTID,ID,NAME) AS
(
SELECT PARENTID,ID,NAME FROM BBS WHERE NAME='DB2'---语句1
UNION ALL---语句2
SELECT B.PARENTID,B.ID,B.NAME FROM BBS AS B, TEMP AS T WHERE B.PARENTID=T.ID---语句3
)
SELECT NAME FROM TEMP;---语句4
q行后,我们发现Q结果完全正,那它到底是怎么q行的呢Q下面我们详l讲解一下?/font>
1、首先,语句1会(x)执行Q它只执行一ơ,作ؓ(f)循环的v炏V得到结果集QDB2
2、接着Q将循环执行语句3Q这里我们有必要详细介绍一下?/font>
首先语句3的意图是什么呢Q说白了(jin)Q它?yu)是查找语?产生l果集(DB2Q的下一U,那么在目录树(wi)中DB2的下一U是什么呢Q是‘DB2 文章1’?#8216;DB2 文章2’Qƈ且把查询到的l果集作Z一ơ@环的L(fng)Q然后查询它们的下一U,直到没有下一Uؓ(f)止?/font>
怎么Pq没明白Q哈哈,不要紧,我们一步一步来Q?/font>
首先Q语?产生l果集:(x)DB2Q作为@环的L(fng)Q把它和BBS表关联来查找它的下一U,查询后的l果为:(x)‘DB2 文章1’?#8216;DB2 文章2’
接着Q把上次的查询结果(也就?#8216;DB2 文章1’?#8216;DB2 文章2’Q和BBS表关联来查找它们的下一U,查询后的l果为:(x)‘DB2 文章1 的评?’ ?‘DB2 文章1 的评?’?/p>
然后Q在把上ơ的查询l果Q也是‘DB2 文章1 的评?’ ?‘DB2 文章1 的评?’Q和BBS表关联来查找它们的下一U,此时Q没有结果返回,循环l束?/p>
3、第三,执行语?Q将所有的l果集放在一P最l得到templ果集?/p>
4、最后,我们通过语句4 从temp临时集合中得到我们期望的查询l果?/p>
怎么Pq回理解?jin)吧Q如果还没有理解Q那么我也无能ؓ(f)力了(jin)。需要特别提醒的?/p>
1、一定要注意语句3的关联条Ӟ否则很容易就写成d@环了(jin)?/p>
2、语?必须是UNION ALL
最后请大家猜想一下,把语?的where子句LQ将?x)生什么样的结果呢Q?/p>
NTE:
SELECT * FROM <TABLE-NAME>;
看到上面的语句了(jin)吗?q是我们在熟(zhn)不q的一条语句,我们中的大多人学?fn)SQL正是从这条语句开始的。所以大多数为FROM语句后只能接一个表或视图(或者压根就没多惻I(j)Q有q种x(chng)的h我非常能理解Q因为我曄也是q其中的一员。其实FROM后面可以接Q何集合(表)(j)。说到这Q关于集合和表,我特别想多少几句。SQL的理论基是数学中的集合理论,所以SQLx(chng)的就是如何对集合q行操作Q基于以上原因,我特别喜Ƣ名?集合Q而不喜欢说表。不q,大家如果不习(fn)惯,也可以把集合和表当一个意思来理解Q因为我们不是搞理论研究工作的,没必要深I他们之间的l微差别。说?jin)这么多Q我们还是赶快来看个例子吧?/font>
---
CREATE TABLE USER
(
NAME VARCHAR(20) NOT NULL,---姓名
BIRTHDAY DATE---生日
);
---例子1
SELECT * FROM
(
SELECT * FROM USER
) AS TEMP1;
---例子2
SELECT NAME,BIRTHDAY FROM
(
SELECT NAME,BIRTHDAY FROM USER
) AS TEMP1;
---例子3
SELECT TEMP1.NAME,TEMP1.BIRTHDAY FROM
(
SELECT NAME,BIRTHDAY FROM USER
) AS TEMP1;
---例子4
SELECT N,B FROM
(
SELECT NAME,BIRTHDAY FROM USER
) AS TEMP1(N,B);
---例子5
SELECT AAA.A,AAA.B,XXX.X,XXX.Y FROM
(
SELECT NAME,BIRTHDAY FROM USER
) AS AAA(A,B),--集合1
(
SELECT NAME,BIRTHDAY FROM USER
) AS XXX(X,Y)--集合2
WHERE AAA.A=XXX.X AND AAA.B=XXX.Y--兌两个集合
看到上面的例??jin)吗Q我们可以给临时集合命名Q还可以l重命名临时集合的列名,q可以关联两个(f)旉合,MQ操作(f)旉合和操作表没有区别?/font>
Temporary table临时表(TEMPORARY TABLEQ通常应用在需要定义(f)旉合的场合。但是,在大部分需要(f)旉合的时候,我们Ҏ(gu)׃需要定义(f)时表。当我们在一条SQL语句中只使用一ơ(f)旉合时Q我们可以用嵌套表表达式来定义临时集合Q当我们在一条SQL语句中需要多ơ用同一临时集合Ӟ我们可以使用公共表表辑ּQ只有当我们在一个工作单元中的多条SQL语句中用同一临时集合Ӟ我们才需要定义(f)时表?/font>
可以通过以下三种方式定义临时表:(x)
Ҏ(gu)1Q?nbsp;
DECLARE GLOBAL TEMPORARY TABLE SESSION.EMP
(
NAME VARCHAR(10),---姓名
DEPT SMALLINT,---部门
SALARY DEC(7,2)---工资
)
ON COMMIT DELETE ROWS;
Ҏ(gu)2Q?nbsp;
DECLARE GLOBAL TEMPORARY TABLE session.emp
LIKE staff INCLUDING COLUMN DEFAULTS
WITH REPLACE
ON COMMIT PRESERVE ROWS;
Ҏ(gu)3Q?nbsp;
DECLARE GLOBAL TEMPORARY TABLE session.emp AS
(
SELECT * FROM staff WHERE <condition>
)
DEFINITION ONLY
WITH REPLACE;
定义?jin)?f)时表后,我们可以像用普通表一样用(f)时表。(f)时表只对定义它的用户有效Q不同用户可以在同一旉定义同名的(f)时表Q他们之间互不媄(jing)响。(f)时表的生命周期是SESSIONQ当SESSION关闭Ӟ临时表将自动删除Q这也是临时表的模式名只能ؓ(f)SESSION的原因。此外,我们q可以给临时表定义烦(ch)引。更多细节请参考DB2 信息中心(j)?/font>
import java.io.*;
public class TestFile2
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush();
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);
fr.close();
isr.close();
br.close();
fw.close();
osw.close();
pw.close();
}
}
java中多U方式读文g
一、多U方式读文g内容?br />
1、按字节d文g内容
2、按字符d文g内容
3、按行读取文件内?br />
4、随取文件内?/font>
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
public class ReadFromFile {
/**
* 以字节ؓ(f)单位d文gQ常用于Mq制文gQ如囄、声韟뀁媄(jing)像等文g?br />
* @param fileName 文g的名
*/
public static void readFileByBytes(String fileName){
File file = new File(fileName);
InputStream in = null;
try {
System.out.println("以字节ؓ(f)单位d文g内容Q一ơ读一个字节:(x)");
// 一ơ读一个字?br />
in = new FileInputStream(file);
int tempbyte;
while((tempbyte=in.read()) != -1){
System.out.write(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
System.out.println("以字节ؓ(f)单位d文g内容Q一ơ读多个字节Q?);
//一ơ读多个字节
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
//d多个字节到字节数l中QbytereadZơ读入的字节?br />
while ((byteread = in.read(tempbytes)) != -1){
System.out.write(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null){
try {
in.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以字Wؓ(f)单位d文gQ常用于L本,数字{类型的文g
* @param fileName 文g?br />
*/
public static void readFileByChars(String fileName){
File file = new File(fileName);
Reader reader = null;
try {
System.out.println("以字Wؓ(f)单位d文g内容Q一ơ读一个字节:(x)");
// 一ơ读一个字W?br />
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1){
//对于windows下,rnq两个字W在一hQ表CZ个换行?br />
//但如果这两个字符分开昄Ӟ?x)换两次行?br />
//因此Q屏蔽掉rQ或者屏蔽n。否则,会(x)多出很多I?br />
if (((char)tempchar) != 'r'){
System.out.print((char)tempchar);
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("以字Wؓ(f)单位d文g内容Q一ơ读多个字节Q?);
//一ơ读多个字符
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
//d多个字符到字W数l中QcharreadZơ读取字W数
while ((charread = reader.read(tempchars))!=-1){
//同样屏蔽掉r不显C?br />
if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != 'r')){
System.out.print(tempchars);
}else{
for (int i=0; i<charread; i++){
if(tempchars[i] == 'r'){
continue;
}else{
System.out.print(tempchars[i]);
}
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以行为单位读取文Ӟ常用于读面向行的格式化文?br />
* @param fileName 文g?br />
*/
public static void readFileByLines(String fileName){
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("以行为单位读取文件内容,一ơ读一整行Q?);
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
//一ơ读入一行,直到dnull为文件结?br />
while ((tempString = reader.readLine()) != null){
//昄行号
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 随机d文g内容
* @param fileName 文g?br />
*/
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile = null;
try {
System.out.println("随机d一D|件内容:(x)");
// 打开一个随问文件流Q按只读方式
randomFile = new RandomAccessFile(fileName, "r");
// 文g长度Q字节数
long fileLength = randomFile.length();
// L件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
//读文g的开始位|移到beginIndex位置?br />
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
//一ơ读10个字节,如果文g内容不10个字节,则读剩下的字节?br />
//一ơ读取的字节数赋lbyteread
while ((byteread = randomFile.read(bytes)) != -1){
System.out.write(bytes, 0, byteread);
}
} catch (IOException e){
e.printStackTrace();
} finally {
if (randomFile != null){
try {
randomFile.close();
} catch (IOException e1) {
}
}
}
}
/**
* 昄输入中q剩的字节数
* @param in
*/
private static void showAvailableBytes(InputStream in){
try {
System.out.println("当前字节输入中的字节数?" + in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}
二、将内容q加到文件尾?/font>
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 内容追加到文gN
*/
public class AppendToFile {
/**
* AҎ(gu)q加文gQ用RandomAccessFile
* @param fileName 文g?br />
* @param content q加的内?br />
*/
public static void appendMethodA(String fileName,
String content){
try {
// 打开一个随问文件流Q按d方式
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
// 文g长度Q字节数
long fileLength = randomFile.length();
//写文g指针Ud文g?br />
randomFile.seek(fileLength);
randomFile.writeBytes(content);
randomFile.close();
} catch (IOException e){
e.printStackTrace();
}
}
/**
* BҎ(gu)q加文gQ用FileWriter
* @param fileName
* @param content
*/
public static void appendMethodB(String fileName, String content){
try {
//打开一个写文g器,构造函C的第二个参数true表示以追加Ş式写文g
FileWriter writer = new FileWriter(fileName, true);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
String content = "new append!";
//按方法Aq加文g
AppendToFile.appendMethodA(fileName, content);
AppendToFile.appendMethodA(fileName, "append end. n");
//昄文g内容
ReadFromFile.readFileByLines(fileName);
//按方法Bq加文g
AppendToFile.appendMethodB(fileName, content);
AppendToFile.appendMethodB(fileName, "append end. n");
//昄文g内容
ReadFromFile.readFileByLines(fileName);
}
}