2009年7月16日星期四
2009年5月19日星期二
DIV+CSS网页布局常用的方法与技巧
DIV+CSS网页布局常用的方法与技巧
CSS布局常用的方法
float:none|left|right
取值:
none:默认值。对象不飘浮
left:文本流向对象的右边
right:文本流向对象的左边
它是怎样工作的,看个一行两列的例子
xhtml代码:
Example Source Code
<div id="wrap">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
<div class="clear"></div> /*这是违背web标准意图的,只是想说明在它下面的元素需要清除浮动*/
</div>
CSS代码:
Example Source Code
#wrap{width:100;height:auto;}
#column1{float:left;width:40;}
#column2{float:right;width:60;}
.clear{clear:both;}
position:static|absolute|fixed|relative
取值:
static:�默认值。无特殊定位,对象遵循HTML定位规则
absolute:�将对象从文档流中拖出,使用left,right,top,bottom等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象,则依据body对象。而其层叠通过z-index属性定义
fixed:�未支持。对象定位遵从绝对(absolute)方式。但是要遵守一些规范
relative:�对象不可层叠,但将依据left,right,top,bottom等属性在正常文档流中偏移位置
它来实现一行两列的例子
xhtml代码:
Example Source Code
<div id="wrap">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
</div>
CSS代码:
Example Source Code [www.52css.com]
#wrap{position:relative;/*相对定位*/width:770px;}
#column1{position:absolute;top:0;left:0;width:300px;}
#column2{position:absolute;top:0;right:0;width:470px;}
他们的区别在哪?
显然,float是相对定位的,会随着浏览器的大小和分辨率的变化而改变,而position就不行了,所以一般情况下还是float布局!
CSS常用布局实例
单行一列
Example Source Code
body{margin:0px;padding:0px;text-align:center;}
#content{margin-left:auto;margin-right:auto;width:400px;}
两行一列
Example Source Code
body{margin:0px;padding:0px;text-align:center;}
#content-top{margin-left:auto;margin-right:auto;width:400px;}
#content-end{margin-left:auto;margin-right:auto;width:400px;}
三行一列
Example Source Code
body{margin:0px;padding:0px;text-align:center;}
#content-top{margin-left:auto;margin-right:auto;width:400px;width:370px;}
#content-mid{margin-left:auto;margin-right:auto;width:400px;}
#content-end{margin-left:auto;margin-right:auto;width:400px;}
单行两列
Example Source Code
#bodycenter{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
两行两列
Example Source Code
#header{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
三行两列
Example Source Code
#header{width:700px;margin-right:auto;margin-left:auto;}
#bodycenter{width:700px;margin-right:auto;margin-left:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
#footer{width:700px;margin-right:auto;margin-left:auto;overflow:auto;clear:both;}
单行三列
绝对定位
Example Source Code
#left{position:absolute;top:0px;left:0px;width:120px;}
#middle{margin:0px190px0px190px;}
#right{position:absolute;top:0px;right:0px;width:120px;}
float定位一
xhtml代码:
Example Source Code
<div id="wrap">
<div id="column">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
<div class="clear"></div>/*用法web标准不建议,但是记住下面元素需要清除浮动*/
</div>
<divid="column3">这里是第三列</div>
<divclass="clear"></div>/*用法web标准不建议,但是记住下面元素需要清除浮动*/
</div>
CSS代码:
Example Source Code
#wrap{width:100;height:auto;}
#column{float:left;width:60;}
#column1{float:left;width:30;}
#column2{float:right;width:30;}
#column3{float:right;width:40;}
.clear{clear:both;}
xhtml代码:
Example Source Code
<div id="center"class="column">
<h1>Thisisthemaincontent.</h1>
</div>
<div id="left"class="column">
<h2>Thisistheleftsidebar.</h2>
</div>
<div id="right"class="column">
<h2>Thisistherightsidebar.</h2>
</div>
CSS代码:
Example Source Code
body{
margin:0;
padding-left:200px;/*LCfullwidth*/
padding-right:190px;/*RCfullwidth CCpadding*/
min-width:200px;/*LCfullwidth CCpadding*/
}
.column{
position:relative;
float:left;
}
#center{
width:100;
}
#left{
width:200px;/*LCwidth*/
right:200px;/*LCfullwidth*/
margin-left:-100;
}
#right{
width:190px;/*RCwidth*/
margin-right:-100;
}
--
道不远人,人自远。
设计时如何把握网页布局
最开始,网页呈现在你面前的时侯,它就好像一张白纸, 它需要你任意挥洒你的设计才思。在开始的时侯,你需要明白,虽然你能控制一切你所能控制的东西,但假如你知道什么是一种约定俗成的标准或者说大多数访问者 的浏览习惯,那么你可以在此基础上加上自己的东西。你当然也可以创造出自己的设计方案,但如果你是初学者,那么最好明白网页布局的基本概念。
1.页面尺寸
由于页面尺寸和显示器大小及分辨率有关系,网页的局限性就在于你无法突破显示器的范围,而且 因为浏览器也将占去不少空间,留下给你的页面范围变得越来越小。一般分辨率在800x600的情况下,页面的显示尺寸为:780x428个象素;分辨率在 640x480的情况下,页面的显示尺寸为:620X311个象素;分辨率在1024X768的情况下,页面的显示尺寸为:1007x600。从以上数据 可以看出,分辨率越高页面尺寸越大。
浏览器的工具栏也是影响页面尺寸的原因。一般目前的浏览器的工具栏都可以取消或者增加,那么当你显示全部的工具栏时,和关闭全部工具栏时,页面的尺寸是不一样的。
在网页设计过程中,向下拖动页面是惟一给网页增加更多内容(尺寸)的方法。但我想提醒大家除非你能肯定站点的内容能吸引大家拖动,否则不要让访问者拖动页面超过三屏。如果需要在同一页面显示超过三屏的内容,那么你最好能在上面做上页面内部连接,方便访问者浏览。
2.整体造型
什么是造型,造型就是创造出来的物体形象。这里是指页面的整体形象,这种形象应该是一个整体,图形与文本的接合应该是层叠有序。虽然,显示器和浏览器都是矩形,但对于页面的造型,你可以充分运用自然界中的其它形状以及它们的组合:矩形,圆形,三角形,菱形等。
对于不同的形状,它们所代表的意义是不同的。比如矩形代表着正式,规则,你注意到很多ICP 和政府网页都是以矩形为整体造型;圆形带表着柔和,团结,温暖,安全等,许多时尚站点喜欢以圆形为页面整体造型;三角形代表着力量,权威,牢固,侵略等, 许多大型的商业站点为显示它的权威性常以三角形为页面整体造型;菱形代表着平衡,协调,公平,一些交友站点常运用菱形作为页面整体造型。虽然不同形状带表 着不同意义,但目前的网页制作多数是接合多个图形加以设计,在这其中某种图形的构图比例可能占的多一些。
3.页头
页头又可称之为页眉,页眉的作用是定义页面的主题。比如一个站点的名字多数都显示在页眉里。这样,访问者能很快知道这个站点是什么内容。页头是整个页面设计的关键,它将牵涉到下面的更多设计和整个页面的协调性。页头常放置站点名字的图片和公司标志以及旗帜广告。
4.文本
文本在页面中出现都数以行或者块(段落)出现,它们的摆放位置决定者整个页面布局的可视性。在过去因为页面制作技术的局限,文本放置的位置的灵活性非常小,而随着DHTML的兴起,文本已经可以按照自己的要求放置到页面的任何位置。
5.页脚
页脚和页头相呼应。页头是放置站点主题的地方,而页脚是放置制作者或者公司信息的地方。你能看到,许多制作信息都是放置在页脚的。
6.图片
图片和文本是网页的两大构成元素,却一不可。如何处理好图片和文本的位置成了整个页面布局的关键。而你的布局思维也将体现在这里。
7.多媒体
除了文本和图片,还有声音,动画,视频等等其它媒体。虽然它们不是经常能被利用到,但随着动态网页的兴起,它们在网页布局上也将变得更重要。
--
道不远人,人自远。
2009年5月14日星期四
centos 感觉不错~
--
道不远人,人自远。
2009年5月13日星期三
几种主流语言的泛型比较
几种主流语言的泛型比较
第一种支持泛型的语言是ADA(一种Pascal语言的后代,差不多是军方的专用语言).而把泛型发扬光大的的是C++(主要是借助泛型实现的模板).
作为一种提高代码重用的技术,泛型被越来越多的语言所支持.
java,C#,Delphi都开始先后支持了泛型技术.我就在这里比较和评论一下C++,java,C#,Delphi几种泛型技术的特点.
实现时机 是否会生成参考类 效率 约束 兼容性 泛型运行时信息
C++ 编译时 会 高 基本算没有 好 基本算没有
Java 编译时 不会 高 有 好 很弱
C# 运行时 不会 一般 有 一般 强
Delphi 编译时 会 高 有 好 强
先从实现的时机和是否生成参考类来说.
C++主要是通过源代码替换机制来实现泛型的.也就是说C++的泛型和宏差不多. 也就是说会为每个泛型实例生成参考类.
Java主要是通过编译器把泛型类全部变成object来实现的.而泛型类的方法是编译通过打包等技术进行类型转换的.例如List<T>实际上永远都是List<object>,不会生成新的参考类.
C#则主要是通过在虚拟机中加入泛型技术来达到对泛型的支持的.List<T>在虚拟机中只是List<T>.不会生成参考类. 只有在JIT编译的时候才会生成参考类的机器代码.当然T的类型不一样具体在虚拟机中的实现也不一样.当T是值类型的时候会生成参考类.但我们这里主要讨 论大部分情况,.NET中多数情况下用引用类型的时候多得多.
Delphi在编译角度讲则更像C++,是通过代码替换机制生成参考类来实现泛型的.但Delphi的类型限制更严格.没有指定类型的约束的时候是不允许使用特定的方法或者操作符等的.具体在后面的约束中讲.
效率方面
C++的效率就高一些.编译期间生成原生代码效率和正常手写代码一样高.
java的效率也比较高.生成的代码和手写代码几乎也是一样的.但打包拆包的类型转换会影响一点效率.
C#编译速度就快一些.但执行的时候要JIT编译器来处理泛型.会在一定程度上影响执行效率.
Delphi和C++相似.效率也是很高的.
约束
C++的模板约束能力比较差.相当于没有.主要是通过代码替换.替换后的代码能便通过就通过了.通不过就报编译错误.不过未来的C++0X标准加入了模板约束.
Java通过编译器保证泛型的约束.
C#通过运行时检查来保证约束.
Delphi通过编译器来保证泛型约束.
兼容性.
C++没有虚拟机,原生代码基本不存在兼容性问题.
java是通过编译器把所有类型都换成object.虚拟机都不用改,和旧的虚拟机完全兼容.兼容性非常好.
C#因为是要虚拟机支持的,所以再旧的.NET Frame虚拟机上不能执行新的泛型代码.
Delphi和C++类似,都是原生代码.所以基本不存在兼容问题.
泛型运行时信息.
C++本身运行时信息就弱的可怜.加之泛型利用代码替换的技术实现,所以基本不具有泛型技术的运行时信息.
Java虽然通过把所有的类型都替换成object实现了良好的兼容性,也有泛型的约束,但是却带来了无法获取运行时信息的难题.因为在Java虚拟机看来都是object,没有分别.
C#虽然通过虚拟机技术支持泛型带来兼容性不好的问题.但是运行时信息却及其强.
Delphi虽然实现技术和C++类似,因为有泛型约束,并且不是象java那样靠虚拟机执行无法区分object.所以Delphi的泛型对运行时信息一点都没有影响.
--
道不远人,人自远。
2009年5月12日星期二
OpenCms 启动指导
1. 启动MySQL 服务进程。
2. tomcat/bin/找到startup.bat, 双击该命令启动Tomcat 服务。
3. 手工启动Apache 服务(如果您安装了IIS之类的)。
4. 访问URL:http://localhost,进入默认站点的首页。
5. 访问URL:http://localhost/system/login/,进入工作区的登录页面。
6. 在登录页面输入用户名Admin 和密码admin(密码第一个字符小写),进入工作区。
--
道不远人,人自远。
集成Apache、Tomcat 和OpenCms 的意义
高了站点的整体性能。
2) OpenCms 中的动态资源将由Tomcat 管理,使Tomcat 从处理静态资源中解放出来。
3)可以去掉地址中的两个opencms 部分。
--
道不远人,人自远。
2009年5月10日星期日
正则表达式语言元素(9)
下表列出了用于修改正则表达式的子表达式。
构造 | 定义 |
---|---|
(? imnsx - imnsx ) | 对诸如不区分大小写这样的选项进行设置或禁用以使其在模式中间打开或关闭。有关特定选项的信息,请参见正则表达式选项。在封闭组结束之前,选项更改将一直有效。请参见有关分组构造(?imnsx-imnsx: ) 的信息,它是一个更为巧妙的形式。 |
(?# ) | 插入到正则表达式内部的内联注释。该注释在第一个右括号字符处终止。 |
# [至行尾] | X 模式注释。该注释以非转义的 # 开头,并继续到行的结尾。(请注意,必须激活 x 选项或 RegexOptions.IgnorePatternWhitespace 枚举选项才能识别此类注释。) |
--
道不远人,人自远。
正则表达式语言元素(8)
替换构造
下表列出了用于修改正则表达式以允许进行二者之一/或匹配的特殊字符。
替换构造 | 定义 |
---|---|
| | 与以 |(竖线)字符分隔的术语中的任何一项匹配;例如, cat|dog|tiger。使用最左侧的成功匹配。 |
(?( 表达式 )yes|no) | 如果表达式在此位置匹配,则与"yes"部分匹配;否则,与"no"部分匹配。"no"部分可省略。表达式可以是任何有效的子表达式,但它将变为零宽度断言,因此该语法等效于 (?(?=expression)yes|no)。请注意,如果表达式是命名组的名称或捕获组编号,则替换构造将解释为捕获测试(在本表的下一行对此进行了描述)。若要避免在这些情况下产生混淆,则可以显式拼出内部 (?=expression)。 |
(?( name )yes|no) | 如果命名捕获字符串有匹配,则与"yes"部分匹配;否则,与"no"部分匹配。"no"部分可省略。如果给定的名称不与此表达式中使用的捕获组的名称或编号对应,则替换构造将解释为表达式测试(在本表的上一行进行了描述)。 |
--
道不远人,人自远。
正则表达式语言元素(7)
下表列出了用于将后向引用修饰符添加到正则表达式中的可选参数。
后向引用构造 | 定义 |
---|---|
\ 数字 | 后向引用。例如,(\w)\1 查找双写的单词字符。 |
\k<name> | 命名后向引用。例如,(?<char>\w)\k<char> 查找双写的单词字符。表达式 (?<43>\w)\43 执行同样的操作。可以使用单引号替代尖括号,例如 \k'char'。 |
请注意八进制转义代码和使用相同表示法的 \number 后向引用之间的多义性。有关正则表达式引擎如何解析多义性的详细信息,请参见反向引用。
--
道不远人,人自远。
正则表达式语言元素(6)
分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。下表描述了正则表达式分组构造。
分组构造 | 说明 |
---|---|
( 子表达式 ) | 捕获匹配的子表达式(或非捕获组;有关更多信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获基于左括号按顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。 |
(?< name > 子表达式) | 将匹配的子表达式捕获到一个组名称或编号名称中。用于 name 的字符串不得包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?'name')。 |
(?< name1 - name2 > 子表达式) | (平衡组定义。)删除先前定义的 name2 组的定义,并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器,用于跟踪嵌套构造(如括号)。在此构造中,name1 是可选的。可以使用单引号替代尖括号,例如 (?'name1-name2')。 有关更多信息,请参见本主题中的示例。 |
(?: 子表达式) | (非捕获组。)不捕获由子表达式匹配的子字符串。 |
(?imnsx-imnsx: 子表达式) | 应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。有关更多信息,请参见正则表达式选项。 |
(?= 子表达式) | (零宽度正预测先行断言。)仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 |
(?! 子表达式) | (零宽度负预测先行断言。)仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。 |
(?<= 子表达式) | (零宽度正回顾后发断言。)仅当子表达式在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 |
(?<! 子表达式) | (零宽度负回顾后发断言。)仅当子表达式不在此位置的左侧匹配时才继续匹配。 |
(?> 子表达式) | (非回溯子表达式(也称为"贪婪"子表达式)。)该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。) 默认情况下,如果匹配未成功,回溯会搜索其他可能的匹配。如果已知无法成功回溯,可以使用非回溯子表达式避免不必要的搜索,从而提高性能。 |
命名捕获基于左括号按从左到右的顺序依次编号(与非命名捕获类似),但在对所有非命名捕获进行计数之后才开始对命名捕获编号。例如,模式 ((?<One>abc)/d+)?(?<Two>xyz)(.*) 按编号和名称产生下列捕获组。(编号为 0 的第一个捕获总是指整个模式)。
编号 | 名称 | 模式 |
---|---|---|
0 | 0(默认名称) | ((?<One>abc)/d+)?(?<Two>xyz)(.*) |
1 | 1(默认名称) | ((?<One>abc)/d+) |
2 | 2(默认名称) | (.*) |
3 | 1 | (?<One>abc) |
4 | 2 | (?<Two>xyz) |
平衡组定义示例
下 面的代码示例演示使用平衡组定义匹配输入字符串中的左右尖括号 (<>)。在该示例中,像使用堆栈那样使用 Open 组和 Close 组的捕获集合来跟踪尖括号配对:将所捕获的各左尖括号放入 Open 组的捕获集合中;将所捕获的各右尖括号放入 Close 组的捕获集合中;平衡组定义确保每个左尖括号均有一个匹配的右尖括号。
' This code example demonstrates using the balancing group definition feature of
' regular expressions to match balanced left angle bracket (<) and right angle
' bracket (>) characters in a string.
Imports System
Imports System.Text.RegularExpressions
Class Sample
Public Shared Sub Main()
'
' The following expression matches all balanced left and right angle brackets(<>).
' The expression:
' 1) Matches and discards zero or more non-angle bracket characters.
' 2) Matches zero or more of:
' 2a) One or more of:
' 2a1) A group named "Open" that matches a left angle bracket, followed by zero
' or more non-angle bracket characters.
' "Open" essentially counts the number of left angle brackets.
' 2b) One or more of:
' 2b1) A balancing group named "Close" that matches a right angle bracket,
' followed by zero or more non-angle bracket characters.
' "Close" essentially counts the number of right angle brackets.
' 3) If the "Open" group contains an unaccounted for left angle bracket, the
' entire regular expression fails.
'
Dim pattern As String = "^[^<>]*" & _
"(" + "((?'Open'<)[^<>]*)+" & _
"((?'Close-Open'>)[^<>]*)+" + ")*" & _
"(?(Open)(?!))$"
Dim input As String = "<abc><mno<xyz>>"
'
Dim m As Match = Regex.Match(input, pattern)
If m.Success = True Then
Console.WriteLine("Input: ""{0}"" " & vbCrLf & "Match: ""{1}""", _
input, m)
Else
Console.WriteLine("Match failed.")
End If
End Sub 'Main
End Class 'Sample
'This code example produces the following results:
'
'Input: "<abc><mno<xyz>>"
'Match: "<abc><mno<xyz>>"
'
// This code example demonstrates using the balancing group definition feature of
// regular expressions to match balanced left angle bracket (<) and right angle
// bracket (>) characters in a string.
using System;
using System.Text.RegularExpressions;
class Sample
{
public static void Main()
{
/*
The following expression matches all balanced left and right angle brackets(<>).
The expression:
1) Matches and discards zero or more non-angle bracket characters.
2) Matches zero or more of:
2a) One or more of:
2a1) A group named "Open" that matches a left angle bracket, followed by zero
or more non-angle bracket characters.
"Open" essentially counts the number of left angle brackets.
2b) One or more of:
2b1) A balancing group named "Close" that matches a right angle bracket,
followed by zero or more non-angle bracket characters.
"Close" essentially counts the number of right angle brackets.
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
*/
string pattern = "^[^<>]*" +
"(" +
"((?'Open'<)[^<>]*)+" +
"((?'Close-Open'>)[^<>]*)+" +
")*" +
"(?(Open)(?!))$";
string input = "<abc><mno<xyz>>";
//
Match m = Regex.Match(input, pattern);
if (m.Success == true)
Console.WriteLine("Input: \"{0}\" \nMatch: \"{1}\"", input, m);
else
Console.WriteLine("Match failed.");
}
}
/*
This code example produces the following results:
Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"
*/
--
道不远人,人自远。
正则表达式语言元素(5)
限定符将可选数量的数据添加到正则表达式。限定符表达式应用于紧挨着它前面的字符、组或字符类。.NET Framework 正则表达式支持最小匹配 (lazy) 限定符。
下表描述了影响匹配的元字符。数量 n 和 m 是整数常数。
限定符 | 说明 |
---|---|
* | 指定零个或更多个匹配;例如 \w* 或 (abc)*。等效于 {0,}。 |
+ | 指定一个或多个匹配;例如 \w+ 或 (abc)+。等效于 {1,}。 |
? | 指定零个或一个匹配;例如 \w? 或 (abc)?。等效于 {0,1}。 |
{ n } | 指定恰好 n 个匹配;例如 (pizza){2}。 |
{ n ,} | 指定至少 n 个匹配;例如 (abc){2,}。 |
{ n , m } | 指定至少 n 个但不多于 m 个匹配。 |
*? | 指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。 |
+? | 指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。 |
?? | 指定使用零次重复(如有可能)或一次重复 (lazy ?)。 |
{ n }? | 等效于 {n} (lazy {n})。 |
{ n ,}? | 指定尽可能少地使用重复但至少使用 n 次 (lazy {n,})。 |
{ n , m }? | 指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。 |
--
道不远人,人自远。
正则表达式语言元素(4)
原子零宽度断言
下表中描述的元字符不会使引擎在字符串中前进或使用字符。它们只是根据字符串中的当前位置使匹配成功或失败。例如,^ 指定当前位置在行或字符串的开头。因此,正则表达式 ^FTP 只会返回那些在行的开头出现的字符串"FTP"的匹配项。
断言 | 说明 |
---|---|
^ | 指定匹配必须出现在字符串的开头或行的开头。有关更多信息,请参见正则表达式选项中的 Multiline 选项。 |
$ | 指定匹配必须出现在以下位置:字符串结尾、字符串结尾处的 \n 之前或行的结尾。有关更多信息,请参见正则表达式选项中的 Multiline 选项。 |
\A | 指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。 |
\Z | 指定匹配必须出现在字符串的结尾或字符串结尾处的 \n 之前(忽略 Multiline 选项)。 |
\z | 指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。 |
\G | 指定匹配必须出现在上一个匹配结束的地方。与 Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。 |
\b | 指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上(即出现在由任何非字母数字字符分隔的单词中第一个或最后一个字符上)。匹配也可以出现在字符串结尾处的单词边界上。 |
\B | 指定匹配不得出现在 \b 边界上。 |
--
道不远人,人自远。
正则表达式语言元素(3)
可以使用影响匹配行为的选项修改正则表达式模式。可以通过下列两种基本方法之一设置正则表达式选项:可以在 Regex (pattern, options) 构造函数中的 options 参数中指定,其中 options 是 RegexOptions 枚举值的按位"或"组合;也可以使用内联 (?imnsx-imnsx:) 分组构造或 (?imnsx-imnsx) 其他构造在正则表达式模式内设置它们。
在内联选项构造中,一个选项或一组选项前面的减号 (-) 用于关闭这些选项。例如,内联构造 (?ix-ms) 将打开 IgnoreCase 和 IgnorePatternWhiteSpace 选项而关闭 Multiline 和 Singleline 选项。默认情况下,关闭所有正则表达式选项。
下表列出了 RegexOptions 枚举的成员以及等效的内联选项字符。请注意,选项 RightToLeft 和 Compiled 只适用于表达式整体而不允许内联。(它们只能在 Regex 构造函数的 options 参数中指定。)选项 None 和 ECMAScript 不允许内联。
RegexOption 成员 | 内联字符 | 说明 |
---|---|---|
None | N/A | 指定不设置任何选项。 |
IgnoreCase | i | 指定不区分大小写的匹配。 |
Multiline | m | 指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 |
ExplicitCapture | n | 指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…) 导致的语法上的笨拙。 |
Compiled | N/A | 指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。 |
Singleline | s | 指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。 |
IgnorePatternWhitespace | x | 指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。(有关转义空白字符的列表,请参见字符转义。)请注意,空白永远不会从字符类中消除。 |
RightToLeft | N/A | 指 定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。(因此,起始位置应指定为字符串的结尾而不是开头。) 为了避免构造具有无限循环的正则表达式的可能性,此选项不能在中流指定。但是,(?<) 回顾后发构造提供了可用作子表达式的类似替代物。 RightToLeft 只更改搜索方向。它不会反转所搜索的子字符串。预测先行和回顾后发断言不改变:预测先行向右搜索;回顾后发向左搜索。 |
ECMAScript | N/A | 指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。 |
CultureInvariant | N/A | 指定忽略语言中的区域性差异。有关更多信息,请参见在 RegularExpressions 命名空间中执行不区分区域性的操作。 |
--
道不远人,人自远。
正则表达式语言元素(2)
只在替换模式中允许替换。对于正则表达式中的类似功能,使用后向引用(如 \1)。有关后向引用的详细信息,请参见反向引用和后向引用构造。
字符转义和替换是在替换模式中识别的唯一的特殊构造。下面几部分描述的所有语法构造只允许出现在正则表达式中;替换模式中不识别它们。例如,替换模式 a*${txt}b 会插入字符串"a*",该字符串后跟按 txt 捕获组匹配的子字符串,该子字符串后跟字符串"b"(如果有)。在替换模式中,* 字符不会识别为元字符。与此类似,在正则表达式匹配模式中不识别 $ 模式。在正则表达式中,$ 指定字符串的结尾。
下表显示如何定义命名并编号的替换模式。
字符 | 说明 |
---|---|
$ 数字 | 替换按组号 number(十进制)匹配的最后一个子字符串。 |
${ name } | 替换由 (?<name> ) 组匹配的最后一个子字符串。 |
$$ | 替换单个"$"字符。 |
$& | 替换完全匹配本身的一个副本。 |
$` | 替换匹配前的输入字符串的所有文本。 |
$' | 替换匹配后的输入字符串的所有文本。 |
$+ | 替换最后捕获的组。 |
$_ | 替换整个输入字符串。 |
--
道不远人,人自远。
正则表达式语言元素(1)
大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 \(单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (\*) 视为 Unicode 字符 002A。
下表中列出的字符转义在正则表达式和替换模式中都会被识别。
转义符 | 说明 | ||
---|---|---|---|
一般字符 | 除 .$ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。 | ||
\a | 与响铃(警报)\u0007 匹配。 | ||
\b | 如果在 [] 字符类中,则与退格符 \u0008 匹配;如果不是这种情况,请参见本表后面的“注意”部分。 | ||
\t | 与 Tab 符 \u0009 匹配。 | ||
\r | 与回车符 \u000D 匹配。 | ||
\v | 与垂直 Tab 符 \u000B 匹配。 | ||
\f | 与换页符 \u000C 匹配。 | ||
\n | 与换行符 \u000A 匹配。 | ||
\e | 与 Esc 符 \u001B 匹配。 | ||
\040 | 将 ASCII 字符匹配为八进制数(最多三位);如果没有前导零的数字只有一位数或者与捕获组号相对应,则该数字为后向引用。(有关更多信息,请参见反向引用。)例如,字符 \040 表示空格。 | ||
\x20 | 使用十六进制表示形式(恰好两位)与 ASCII 字符匹配。 | ||
\cC | 与 ASCII 控制字符匹配;例如,\cC 为 Ctrl-C。 | ||
\u0020 | 使用十六进制表示形式(恰好四位)与 Unicode 字符匹配。
| ||
\ | 在后面带有不识别为转义符的字符时,与该字符匹配。例如,\* 与 \x2A 相同。 |
注意 |
---|
转义字符 \b 是一个特例。在正则表达式中,\b 表示单词边界(在 \w 和 \W 之间),不过,在 [] 字符类中,\b 表示退格符。在替换模式中,\b 始终表示退格符。 |
--
道不远人,人自远。
代码生成工具CodeSmith与SmartCode学习
总的来说个人比较倾向于SmartCode,因为其是开源的,并且附带了很多的可以直接使用的模板,也有视频演示视频。学习起来非常的轻松!而CodeSmith是商业的,虽然有破解的,但是就是用不太习惯,codeSmith是基于asp.net的语法编写template的,习惯了codebind模式后,现在直接写<%%>感觉不是太习惯。SmartCode直接采用lib的方式编写模板,使用的时候添加assembly就可以了,对习惯了编写后台的人比较适合点。
使用代码生成器可以提高效率,一般是对这套代码模式非常清楚又不想重复的做体力活,那么他们是你的选择。同时呢,你可以看他们的模板特别是smartcode的,可以学习到一些设计的思想哈。这些都算是经验的总结吧!
--
道不远人,人自远。
2009年5月9日星期六
必须勤奋些
想看看web service 和 spring 相关的东西。加油!
现在白天搞 .net ,晚上搞 java 。 有点不连续。 自己得抓紧,得勤奋些,不聪明的人只能这样了。
坚持,坚持,保持耐心,拥有希望!
Hibernate简要笔记
mysql engine:innoDb 支持事务, 其他的有些不支持事务,在Hibernate中默认事务是不开启的和jdbc
相反,所以如果数据不支持引擎,对hibernate来说插入数据都是有效的。
2.
save 与 persist。 没开事务的时候 persist不会插入(insert)数据。
3.
update,没记录时会抛异常
4.
transient:数据库里没相应记录与之对应,new出来的,没id值
persistent:数据库里有相应记录与之对应,并与session关联,有id值
detached:数据库里没相应记录与之对应,但是没有session与之关联,有id值
看图。
5.
hibernate查询的方式:
1)HQL
2)Criteria
6.
java实体类或属性名与数据库关键字冲突问题。
1)改表名
2)表名加反引号 ` , 字段名
3)表名加 [] 括起来 , 我自己摸索出来的。
7.
hql 命名参数, 把 name=? 代替 为 name=:name ,这样不需要 依赖于顺序了
8.
many to one: 基于对象建模,对象
one to many: set<对象> 使用泛型,配置的 one-to-many中需要配置class属性
one to one :foreign,constrained约束
many to many: 转成 2个 one to many的,连接表。性能问题。
component: 组件
9.
集合:PersitentSet。
10.
cascade :用来说明当对主对象进行某种操作是否对其关联的从对象也做类似的操作
none、all、save-update、delete、lock、refresh、evict、replicate、
persist、merge、delete-orphan。一般不在 many to many,mang ot one中设置级联
,在one ot one 和 one to many 中设置。
级联一般配置在 set list 等 中。
在one的一端!!!
inverse :表示是是否放弃维护关联关系。one to many 维护关联关系就是更新外键,
many to many 维护关联关系就是在中间表(关联表)增减记录
在父对象的一端或者one的一端放弃 维护关联关系(true)。关系由多的一段维护。
对象模型关联的设置。
可以提升性能。
在list 和 array中不能出现 invers属性。有序的集合必须维护关系。
多的一端不能设置inverse属性。
11.
继承映射。三种策略,或者四种。
1)一张表一个继承树,效率高,增加子类需修改表结构,子表字段不能非空字段
subclass。子类
discriminator。鉴别器。
2)每个类一张表,一个父表,多个字表。
joined - subclass 。table。 key 外键。
3) 1)2)混合使用,join
4)每个类都有一张独立表。
union - subclass。
12.懒加载, 提高性能
1)
load 方法。 懒加载。 lazy,load。
asm,cglib,不能是final的 ,如果是的话,lazy 失效。
Hibrenate.initialize(Class claaz);
2)one to one ,lazy(主对象不会出现,从对象出现)
a。lazy!=false,
b。constrained = true // 从对象
c。fetch = select
分多次查询,即在需要的时候查询,fetch如果为join的话,lazy就失效了。
访问的时候就查询。
相关的属性什么时候查询。
3)one to many ,many to mangy , lazy
a。lazy!=false
b。fetch = select
4)many to one。lazy 缺省是lazy的
a。lazy!=false
b。fetch = select
5)懒加载对象都是代理对象,getId,getClass不会触发懒加载,Initialize(proxy)方法
13.
Cache分析。。
1)session里有cache,session不关闭,2次同一个get。session生命周期比较短,起缓存作用比较小
save update load CreateQuery(不行), 清理,clear(全部) evict(一条)。
一级缓存没有限制。大数据量很容易内存溢出。
2)sessionFactory里也有,二级缓存,配置文件配置。
cache.use_second_level_cache : true.
cache.provider: class(HashTable,OSCache,Ehcache,TreeCache,SwarmCache)
OsCache 配置文件。
每一个类需要缓存的设置:
cfg中: class cache, usage:read only , read write, nonstrict-read-write,
transactional。
hbm中:Cache。命中率,session。clear()清除一级缓存
3)打开统计信息:
generate_staticstics : true.
或得统计信息:SessionFactory。getStastics()返回的是Statistics类里面有不少描述信息;
清理 evict()
CreateQuery :难以利用缓存。命中率低。
14.
分布式缓存,集群。,读取快,更新慢。
OScache支持。
中央缓存。更新快,读取慢,memcache
数据缓存的条件。
a。读取的次数大于修改的次数。
b。数据量不能太大
c。对数据有独享的控制权
d。可以容忍出现无效的数据
15.
事务相关。
JDBC事务一个数据库,JTA事务-分布式事务-跨数据库,JTA容器。
JNDI:类似注册表。
事务边界:事务开始,事务提交,事务回滚。
16.
opensessionInView
页面渲染的时候,session能够打开
Servlet Filter 里使用Session, getLocalSession
ThreadLocal 局部线程变量
要从SessionFactory中获得GetCucrrentSession的话需要配置
current_Session_context_class。否则会异常。
值为thread(ThreadLocal)或者jta(jta事务管理器)。
17.
乐观锁:hibernate用version和timestamp控制实现
悲观锁:数据库实现
18.
Session是非线程安全的。周期短,尽量晚的获取,尽量早的释放。他代表一个数据库连接。
SessionFactory是线程安全的。一个数据库对应一个SessionFactory,周期长。
19.
flush:一级缓存和数据库同步
20.
HQL:
查询多个对象,返回的是对象。要返回多个列,返回Object[]。
根据ID查询时,get、load查询和CreateQuery(不能利用缓存)的差别:性能~~
21.
N+1查询:iterator。
懒加载:fetch-》join,利用缓存。
detachedCriteria:离线查询,动态SQL。
22.
监听器。
拦截器与事件:Interceptor接口。
实现接口,
cfg,里配置even
推荐用 监听器。
23.
(1)使用sql,不用hql。
Query createSQLQuery(String).操作的是表,跟平时操作sql一样。
返回的是对象。
(2)使用Query节点,属性 name(可以放在class里面也可以放在外面,在里面的时候需要加上包的全路径
名),,即命名查询。把hql,放到hbm。xml文件里统一管理。
类似ibatis。
Query getNamedQuery(String name);
(3)
sql-query节点。里面使用的是sql。
24.
保存Domain对象,可以用Map代替。将对象转为xml。
25.
Best practice。
不适合的场景:
1)OLAP,一查询为主,相反适合OLTP
2)关系模型设计不合理的,
3)数据量巨大,性能要求苛刻。
1)细粒度设计持久类 component
2)id
3)每个持久类一个映射文件
4)映射文件作为资源加载
5)自然组件,覆盖hascode,equal
6)考虑把查询串发在hbm。xml配置文件里。
7)少用?多用变量名
8)不要自己管理jdbc 连接。
9)考虑使用自定义类型,UserType
10)性能瓶颈使用硬编码的jdbc实现
11)session flush 成本比较高,尽量不手动管理。交给hibernate
12)在三层架构中使用托管对象 detached object
13)在2层结构中,考虑使用长 持久上下文
14)不要把异常看成可恢复的,catch 回滚是,必须throw出来,让上层调用者知道。
15)对于关联有限考虑lazy fetching。
16)避免open session in view 的问题。
17)考虑把hibernate 代码从业务逻辑代码中抽象出来。
18)不要使用怪异的连接映射
19)偏爱双向关联。单项管理更难查询???
--自助者天助之--
--
道不远人,人自远。
2009年5月7日星期四
人体24小时状态热图
1∶00 人体进入浅睡眠阶段,易醒,对痛觉特别敏感。 睡眠休息
2∶00 体内大部分器官处于一天中工作最慢的时刻。而肝脏却在紧张地工作,为人体排毒。
3∶00 全身处于休息状态,肌肉完全放松。
4∶00 血压最低,人体脑部供血最少。所以,此时老年人容易发生心脑血管意外。
5∶00 经历了一定时间的睡眠,人体得到了充分休息。此时起床,显得精神饱满。 起床(如果可以)
6∶00 血压开始升高,心跳也逐渐加快。 起床、锻炼、日计划
7∶00 体温开始上升,人体免疫力最强。 创造性的工作
8∶00 皮肤有毒物质排除殆尽,性激素含量最高。
9∶00 皮肤痛觉降低。此时是就医注射的好时机。 完成工作任务
10∶00 精力充沛,最适宜工作。
11∶00 精力最旺盛,人体不易感觉疲劳。
12∶00 经历了一个上午的工作,人体需要休息。 整理、总结
13∶00 此时胃液分泌最多,胃肠加紧工作,适宜进餐,人体稍感疲乏,需要短时间的休息。 午餐
14∶00 人体应激能力下降,全身反应迟钝。 午睡
15∶00 体温最高,工作能力开始恢复。 执行工作任务
16∶00 血糖升高,脸部最红。
17∶00 工作效率最高,肺部呼吸运动最活跃,适宜进行体育锻炼 体育锻炼
18∶00 人体痛觉再度降低。 休息
19∶00 血压略有升高。此时,人们情绪最不稳定。 晚餐
20∶00 记忆力最强,大脑反应异常迅速。 阅读、学习
21∶00 脑神经反应活跃,适宜学习和记忆。 个人爱好
22∶00 呼吸开始减慢,体温逐渐下降。
23∶00 机体功能处于休息状态,一天的疲劳开始缓解。 整理、总结,睡眠休息
24∶00 进入睡眠状态,充分恢复体能。 睡眠休息
2009年5月6日星期三
Invist-.net O/R mapper - code generator(.net o/r 映射 代码生成器)
上有详细介绍和文档说明。首先下了软件,然后看了视频演示。再打开vs2008,操作了一遍感觉很爽哦~ 不到一瞬间,数据访问层最垃圾的事情基本都解决了哈! cool!!! 明天再仔细研究下,看看是否可以用与企业开发中,看看性能如何!!!
mark!
2009年4月25日星期六
hibernate3-双向关联-inverse属性
inverse映射属性究竟表示什么呢?对于你和Java来说,一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate并没有足够的信息去正确地执行INSERT和UPDATE语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为inverse将告诉Hibernate忽略关联的这一端,把这端看成是另外一端的一个镜象(mirror)。这就是所需的全部信息,Hibernate利用这些信息来处理把一个有向导航模型转移到数据库schema时的所有问题。你只需要记住这个直观的规则:所有的双向关联需要有一端被设置为inverse。在一对多关联中它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,因为两端之间并没有差别。
2009年4月21日星期二
jetty6开发环境配置
首先下载了最新的jetty包,解压之,然后分别在eclipse3.4和myeclipse7.1中配置好了环境。在MyEclipse中配置比较简单,主要在Server Config 里配置好Jetty的路径 就好,这个和tomcat一样的。在Eclipse中,在一个具体java project中,首先需要添加必须的jar文件,为了方便我就全把jetty-home/lib下的包全加了,初次是使用jetty,先这样了。然后再run config里new 一个 java application 设置名字jetty6,设置Main cliass : org.mortbay.xml.XmlConfiguration。并勾上其下面第一个选项。然后再Agrement里设置好参数:etc/jetty.xml ,他表示Main class启动是需要的参数,etc/jetty.xml 是jetty启动的主要参数。里面可以配置默认端口等。再修改work directory 为jetty home 即可。点击run 即可启动jetty!
防止遗忘或者再次遇到类似问题,所以记录之!
jquery form 学习
2009年4月17日星期五
2009年4月16日星期四
2009年4月14日星期二
Freemarker基本语法学习
<# ... > 中存放所有freemaker的内容,之外的内容全部原样输出。
<@ ... /> 是函数调用
两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下:
<#if condition><#elseif condition><#else>#if> 条件判断
<#list hash_or_seq as var>#list> 遍历hash表或者collection(freemaker称作sequence)的成员
<#macro name param1 param2 ... ><#nested param>#macro> 宏,无返回参数
<#function name param1 param2><#return val>#function> 函数,有返回参数
var?member_function(...) 用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var, ...)
stringA[M .. N] 取子字符串,类似substring(stringA, M, N)
{key:value, key2:value2 ...} 直接定义一个hash表
[item0, item1, item2 ...] 直接定义一个序列
hash0[key0] 存取hash表中key对应的元素
seq0[5] 存取序列指定下标的元素
<@function1 param0 param1 ... /> 调用函数function1
<@macro0 param0 param1 ; nest_param0 nest_param1 ...> nest_body < /@macro> 调用宏,并处理宏的嵌套
<#assign var = value > 定义变量并初始化
<#local var = value> 在 macro 或者 function 中定义局部变量并初始化
<#global var = value > 定义全局变量并初始化
${var} 输出并替换为表达式的值
<#visit xmlnode> 调用macro匹配xmlnode本身及其子节点
<#recurse xmlnode> 调用macro匹配xmlnode的子节点
2009年4月9日星期四
Eclipse Project Reference用来做jar包集中管理
http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build
深有感触,故记之。
深夜安静的时候听【古典曲集】让人亢奋
#EXTM3U
#EXTINF:0,01.柴可夫斯基-第一钢琴协奏曲:第一乐章.flac
01.柴可夫斯基-第一钢琴协奏曲:第一乐章.flac
#EXTINF:0,02.约翰.施特劳斯-闲聊波尔卡舞曲.flac
02.约翰.施特劳斯-闲聊波尔卡舞曲.flac
#EXTINF:0,03.威尔第-茶花女(选段):饮酒歌.flac
03.威尔第-茶花女(选段):饮酒歌.flac
#EXTINF:0,04.维瓦尔第-四季之春天.flac
04.维瓦尔第-四季之春天.flac
#EXTINF:0,05.门德尔松-仲夏夜之梦.结婚进行曲.flac
05.门德尔松-仲夏夜之梦.结婚进行曲.flac
#EXTINF:0,06.柴可夫斯基-天鹅湖(序曲).flac
06.柴可夫斯基-天鹅湖(序曲).flac
#EXTINF:0,07.莫扎特-四十号交响曲.flac
07.莫扎特-四十号交响曲.flac
#EXTINF:0,08.贝多芬-第九交响曲(合唱)欢乐颂.flac
08.贝多芬-第九交响曲(合唱)欢乐颂.flac
#EXTINF:0,09.罗西尼-威廉退尔序曲.flac
09.罗西尼-威廉退尔序曲.flac
#EXTINF:0,10.比才-第一卡门组曲.flac
10.比才-第一卡门组曲.flac
#EXTINF:0,11.柯夫-布兰之歌.flac
11.柯夫-布兰之歌.flac
#EXTINF:0,12.德沃夏克-自新大陆交响曲,第一乐章.flac
12.德沃夏克-自新大陆交响曲,第一乐章.flac
#EXTINF:0,13.贝多芬-悲怆钢琴奏鸣曲.flac
13.贝多芬-悲怆钢琴奏鸣曲.flac
#EXTINF:0,14.贝多芬-月光钢琴奏鸣曲.flac
14.贝多芬-月光钢琴奏鸣曲.flac
#EXTINF:0,15.约翰.施特劳斯-蓝色多瑙河.flac
15.约翰.施特劳斯-蓝色多瑙河.flac
#EXTINF:0,16.贝多芬-第五交响曲(命运).第一乐章.flac
16.贝多芬-第五交响曲(命运).第一乐章.flac
#EXTINF:0,17.拉威尔-波利舞曲.flac
17.拉威尔-波利舞曲.flac
#EXTINF:0,18.柴可夫斯基-1812.序曲.flac
18.柴可夫斯基-1812.序曲.flac
2009年4月4日星期六
Hibernate Tools3.2.4使用
费了点周折,认识了几个单词,搞定了mysql,sql server,oracle9i自动生成的问题。感觉生成的代码很傻的,感觉不太符合平时的要求,一般怎么改才合适呢?值得继续研究!另外,那些配置文件的含义,还是迷糊。。。
一周过去了,对hibernate的映像今天是最满意的,头几天看reference看的晕了。
实战中找感觉。。。
加油!!!
2009年4月3日星期五
mysql5修改root密码
1.
win + R
cmd
C:\> mysql -u root -p (旧密码)
mysql>use mysql
mysql> update user set password=password('新密码') where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>quit
2.
win + R
cmd
mysql -u root -p新密码
2009年4月1日星期三
2009年3月30日星期一
2009年3月26日星期四
用Ibator生成的SalMap与spring集成时的问题
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined in file [E:\WorkSpace\ibator\dataAccessContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: com/ibatis/common/xml/NodeletException
我还debug了呢,以为发现了spring的bug,汗。。。。。
第二、用ibator生成的sqlmap,假设在namespace为account的情况下,下面所有的sql , select,insert,etc 的id 都会加上 account.****。 Junit4测试的时候报异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined in file [E:\WorkSpace\ibator\dataAccessContext.xml]:
Invocation of init method failed; nested exception is org.springframework.core.NestedIOException:
Failed to parse config resource: file [E:\WorkSpace\ibator\sql-map-config.xml];
nested exception is com.ibatis.common.xml.NodeletException: Error parsing XML.
Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.
Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.
Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.
Cause: java.lang.RuntimeException: Could not find SQL statement to include with refid 'account.ibatorgenerated_Example_Where_Clause'
本以为Ibator是完全可以信赖的,看上去也没什么不对,AccountDaoImpl里面的也对应的很好,是不是ibatis里面那个地方可以设置呢?
在这里我就把namespace,account. 全部删掉,修改AccountDaoImpl。测试后全绿的!
JavaScript - Working with Database
1. How to connect the database in JavaScript
2. How to use the ADODB.Recordset in JavaScript
As I already put the details comments in coding, I hope you will find it useful.
You can download the sourcecode and MSAccess database from this link.
http://michaelsync.net/demo/JavaScriptDatabaseSrc.zip
引用:
http://michaelsync.net/2006/06/14/javascript-working-with-database
javeScript操作数据库代码片段
there are the code snippet:
var rsTopTen
var strInner
var strCntInner
var ConnectionString
rsTopTen = new ActiveXObject("ADODB.Recordset");
// Build the connection string
//
// ConnectionString Format below:
//ConnectionString = "DRIVER=SQL Server;SERVER=MySQLServer;CATALOG=MyDatabase;UID=USERID;PWD=Password";
//
// for SQL 7.0:
//ConnectionString = "DRIVER=SQL Server;SERVER=TopTen;CATALOG=TopTen;UID=TopTen;PWD=TopTen";
//
// for Access Database (on Server):
//ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=\\\\demwwwdev01\\develop\\im\\security\\TopTen.mdb";
//
// for Access Database (on local drive):
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\\TopTen\\TopTen.mdb";
// Build a SQL statement
strSQL = "SELECT TopTenName, TopTenCount FROM TopTen ORDER BY TopTenCount DESC";
// Open the recordset
rsTopTen.Open(strSQL, ConnectionString, 3,1,1);
// Loop through the Recordset
while(!rsTopTen.EOF)
{
//写出.......
}
引用:
http://metababy.blogspot.com/2009/03/use-javascript-to-operate-database-sql.html
2009年3月25日星期三
使用Ibator自动生成sqlmap配置文件、dto类、dao类
1.帮助文档
http://ibatis.apache.org/docs/tools/ibator/
2.找不到jdbc的异常处理
http://www.eclipse-plugins.info/eclipse/plugin_comments.jsp;jsessionid=6FDA6B5047854C57C42A0252F2D36A3E?id=1253
3.示例
http://ibatis.apache.org/docs/tools/ibator/configreference/xmlconfig.html
4.一点和Abator的小历史
Ibator was originally named "Abator", but the name was changed as the result of a federal trade registration dispute.
2009年3月24日星期二
研究ibatis的jgamestore
2009年3月23日星期一
ibatis的dao framework
ibatis的cache model
ibatis动态Sql
开启ibatis的Lazy loading
2009年3月22日星期日
ibatis学习
ibatis是懒人用的~ 呵呵。。。
jdbc是勤快的人想完全控制sql的人用的。。。
至于什么时候用,action的书里写的很清楚的。 当然跟项目的具体技术架构和需求也有很大的关系,毕竟是架构师和项目经理的事情。 俺学习学习,算过了。。
晚上继续看ibatis in actioan。 E文的看的好慢。。。 orz!
2009年3月20日星期五
Reading ibatis in action!
2009年3月19日星期四
学习SpringMVC一步一步
我的感觉是用她提供的框架开发是比较方便的。首先是一个jsp,利用里面的标签,发送一个请求过来,然后交给Controller,Controller负责接收请求,调用后面的服务,并返回一个ModelAndView。这些服务初始化工作交给spring,需要在applicationContext.xml等。还有一些配置文件如××-servlert.xml,jdbc.properties等。
最赞的是,build.xml几乎是自动的编译,部署,测试,建库。。。我很欣赏这点。前两天也捣鼓了下maven2,感觉不太适合现在的情况。
又是一天过去了。。。
明天计划好好Spring其他方面的整合,慢慢理解spring!
2009年3月17日星期二
没题目~
后来下了一本Eclipse Web Tool Platform:.... 的电子书,对着书上做很快跑起来来了一个简单的Servlet。以前很是讨厌web.xml那些配置文件,不过现在看来有wtp的帮助,配置都可以自动生成,还是挺方便!
看着看到了 Apache Derby ,也是第一次接触。。。 打开 http://db.apache.org/derby/ 里面瞧了瞧,开始学学。。
每天都在想做点什么,或者写点什么。。。
每天都在思考是广泛学习,还是深入研究。。。
现在还是浑浑噩噩,何时是个头?
我是一只小小鸟,好像飞不出企业的手心~ 或许他需要点勇气。。。
2009年3月16日星期一
IIS6配置Gzip
netstat -an, 发现是迅雷5占用了80端口,kill thunder5.exe
重启IIS6, OK!
2009年3月15日星期日
2009年3月13日星期五
安装EMS Sql Manager 2008 for Oracle
为什么不先看看文档呢?
偷懒往往更加得不偿失啊!
2分钟电话面试:又一次经验!
没办法,英语是老问题了。。。 我改花时间练练口语吗?
2009年3月12日星期四
Tomcat6中war自动部署原理
Tomcat6部署Spring-Jpetstore
2.spring包中example/jpetstore下运行warfile.bat.
3.将生成的jpetstore.war拷贝到tomcat/webapp/下
4.重启tomcat6,webapp下自动多了一个名字为jpetstore的文件夹,即我们的宠物网站,
5.按先前介绍的安装好的mysql5.1,在sql manager 2007中,新建一jpetstore的数据库,运行mysql脚本
6.将mysql的jdbc的驱动拷贝到/webapp/jpetstore/WEB-INF/lib/下,并修改/webapp/jpetstore/WEB-INF/下的jdbc.properties文件,修改为符合mysql的要求。
例如:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpetstore
jdbc.username=root
jdbc.password=123456
7.重启Tomcat6,在浏览器中输入http://localhost:8080/jpetstore/
这就好了。
Tomcat6 zip 版安装
简单的说,
1.先设置好java_home,
2.在tomcat_home下bin目录下:
1)运行startup.bat 启动tomcat6,
2)运行shutdown.bat 退出tomcat6,
3)运行service.bat install tomcat6 安装服务名为tomcat6的Windows服务,
4) 运行service.bat romove tomcat6 删除服务名为tomcat6的Windows服务,
5) ctrl + r , 输入 services.msc , 可以看到 Apache Tomcat 的服务名,
6) 其他设置参考tomcat文档。
7) 桌面快捷方式:startup.bat 和 shutdowt.bat。
2009年3月11日星期三
忙碌的一天
2009年3月9日星期一
MySQL:简单字符集操作
mysql> show variables like
-> 'character%';
+--------------------------+---------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\DevSoft\MySQL\MySQL Server 5.1\share\charsets\ |
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
2.修改默认字符集
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
MySQL:无法远程登入MySQL Server(is not allowed to connect to this MySQL server)解决
如果你想连接你的mysql的时候发生这个错误:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server
解决方法:
1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"
mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = '%' where user = 'root';mysql>select host, user from user;
2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
http://till.javaeye.com/blog/115659
http://www.webasp.net/article/21/20985_print.htm
我是用图形界面的SQL Manager中修改的!
获得mysql版本号
+------------------+
| version() |
+------------------+
| 5.1.32-community |
+------------------+
1 row in set (0.03 sec)
2009年3月6日星期五
试用wireshark,分析网络数据包
WireShark (以前一般称为 Ethereal)使程序员可以查看网络上传播的内容,让他们有机会检查正在网络上传播的内容是否合适,而那些不 合适的内容(比如敏感信息和明文密码)没有出现在网路上。呵呵,第一次听说这工具,以前只知道wincpap。。。 哈哈 , 我的工具箱又强大了!
Spring:IOC容器-依赖
1)构造器注入
1)构造器参数解析
2)构造器参数类型匹配
3)构造参数索引
2) Setter注入
3)一个替代构造器的方法,采用static工厂方法返回对象实例
2. 依赖配置详解
1)直接变量(基本类型、
Strings
类型等。)2)
idref
元素,提供错误验证功能。local。。。3) 引用其它的bean(协作者)。ref bean, ref local。
4)内部bean,内部bean中的
scope
标记及id
或name
属性将被忽略。内部bean总是匿名的且它们总是prototype模式的。同时将内部bean注入到包含该内部bean之外的bean是不可能的。5)集合。
、
、
及
元素。6)集合的合并。parent-style和child-style。父子集合元素合并后的值就是子集合中的最终结果,而且子集合中的元素值将覆盖父集全中对应的值。merge 属性。
7)强类型集合(仅适用于Java5+)。
8)
Nulls。
。
9)
XML配置文件的简写及其他1)XML-based configuration metadata shortcuts
2) 使用p名称空间配置属性。p 表示属性。。。
10)组合属性名称。属性的属性的属性。。。
3. 使用
depends-on。
依赖关系不是太直接。。。 多个时候 “ , ”4.延迟初始化bean。bean -
lazy-init。beans -
default-lazy-init。
5.自动装配(autowire)协作者。自动装配(autowire)。
1)Autowiring modes:no,byName,byType,constructor,autodetect。
2)如果直接使用
property
和constructor-arg
注入依赖的话,那么将总是
覆盖自动装配。3)优点:a.自动装配能显著减少配置的数量,b.自动装配可以使配置与java代码同步更新
4) 缺点:a.装配不明确可能出现难以预料的结果,对象之间的关联关系也不再能清晰的进行文档化,b.对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
5) 将bean排除在自动装配之外.
a.bean中autowire-candidate
属性可被设为false.b.
在
元素的'default-autowire-candidates'
属性中进行设置
6.
依赖检查.1)在bean定义中为
dependency-check
属性2)依赖检查方式:none,simple,object,all.
7.方法注入
1)放弃控制反转。通过实现
BeanFactoryAware
接口让bean A能够感知bean 容器,并且在需要的时候通过使用getBean("B")
方式向容器请求一个新的bean B实例。耦合高,不推荐。2)Lookup方法注入。
Lookup方法注入利用了容器的覆盖受容器管理的bean方法的能力,从而返回指定名字的bean实例。 Lookup方法注入适用于原型bean。Lookup方法注入的内部机制是Spring利用了CGLIB库在运行时生成二进制代码功能,通过动态创建Lookup方法bean的子类而达到复写Lookup方法的目的。(需要CGLIB支持,子类化的类不能是
final
的,要覆盖的方法也不能是final
的,不能是序列化的(serialized)。)3)自定义方法的替代方案。当使用基于XML配置元数据文件时,可以在bean定义中使用
replaced-method
元素来达到用另一个方法来取代已有方法的目的.在
元素内可包含一个或多个
元素
2009年3月5日星期四
Spring:IOC容器 - 基本原理(容器和bean)
答:BeanFactory
接口擅长于处理bean的初始化和配置,提供了配制框架及基本功能;ApplicationContext
是BeanFactory
的扩展,功能得到了进一步增强,比如更易 与Spring AOP集成、资源处理(国际化处理)、事件传递及各种不同应用层的context实现 (如针对web应用的WebApplicationContext
)。简而言之,一般把ApplicationContext
接 口作为首选。2.为什么使用bean?
答:使用'bean'这个名字而不是'组件'(component) 或'对象'(object)的动机 源于Spring框架本身(它产生的部分原因就是对Enterprise Java Beans复杂性的一次解构)。
3.多种资源加载配置元数据?
答:Spring IoC容器可以通过多种途径来加载配置元数据,比如本地文件系统、Java CLASSPATH
等。Resource
抽象机制。
4.怎么实例化容器?
答:ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"services.xml", "daos.xml"});
// anApplicationContext
is also aBeanFactory
(via inheritance)
BeanFactory factory = context;
XML配置元数据的结构:相对路径
5.bean的在Spring IOC 容器中怎么定义的?
答:bean定义由BeanDefinition
对象来表示。包括全限定类名、bean行为的定义、对其他bean的引用、
创建bean实例时的其他配置设置。他们被映射为中的properties:
class-类名,name-名字,scope-作用域,constructor arguments - 构造器参数,properties - 属性,autowiring mode
自动装配,dependency checking mode - 依赖检查,lazy-initialization mode - 初始化延迟,
initialization method - 初始化方法, destruction method - 析构方法。
6.bean的命名、 bean的别名?
答:bean的命名采用标准的Java命名约定,即小写字母开头,首字母大写间隔 的命名方式。如accountManager
、accountService
、userDao
及loginController
,等等。
xml配置别名:
7.实例化bean的方式?
答:
1)用构造器来实例化。
IoC容器不仅限于管理JavaBean,它可以管理任意 的类。
2)使用静态工厂方法实例化。createInstance()
必须是一个static方法。
3)使用实例工厂方法实例化。
8.使用容器
从本质上讲,BeanFactory
仅仅只是一个 维护bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory
我们可以访问bean定义。下面的例子创建了一个bean工厂,此工厂 将从xml文件中读取bean定义:
基本上就这些了,接着使用getBean(String)
方法就可以取得bean的实例;BeanFactory
提供的方法极其简单。 BeanFactory
接口提供 了非常多的方法,但是对于我们的应用来说,最好永远不要调用它们,当然也包括 使用getBean(String)
方法,这样可以避免我们对 Spring API的依赖。
2009年3月4日星期三
Eclipse3.4.1下安装Findbugs和subclipse(SVN for eclipse)
Eclipse3.4.1下安装Findbugs和subclipse(SVN for eclipse)
安装Subclipse(SVN):
Eclipse 3.4菜单->Help->Software Updates...->选择Available Software
点击“Add Sites...”按钮,分别添加两个站点:
http://download.eclipse.org/technology/subversive/0.7/update-site/
和
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
然后勾选以下选项,然后点击“Install...”安装,必成功:
http://download.eclipse.org/technology/subversive/0.7/update-site/
--Subversive Integration Plug-in's
--Subversive SVN Intergration for the Mylyn Project
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
--Subersive SVN Connectors
--JavaHL 1.5.0 Connector
--Native JavaHL 1.5 Win32
--Subversive SVN Connectors
--SVNKit 1.1.7 Implementation
安装Findbugs-1.3.8:
方法同上:
只是更新链接不同:
FindBugs Eclipse update sites:
- http://findbugs.cs.umd.edu/eclipse/
Only provides official releases of FindBugs.
- http://findbugs.cs.umd.edu/eclips-candidate/
Provides official releases and release candidates of FindBugs.
- http://findbugs.cs.umd.edu/eclipse-daily/
Provides the daily build of FindBugs. No testing other than that it compiles.
- (from Findbugs 在线手册)
EMS SQL Manager 2007 for MySQL安装试用
http://sqlmanager.net/
下载地址,及破解文件:
http://skywq.com/searchcn.asp?keyword=sql+manager&searchtj=name&x=0&y=0
先安装了最新的mysql5.1,再安装sql manager 2007,在应用破解文件。一切都很顺利,用起来很方便。。。
推荐不喜欢敲命令行的朋友使用哦。
2009年3月2日星期一
JProfiler5.2.1试用
JProfiler确实很强大,我打算用到我们的服务器性能测试中去,我想一定会有很大的帮助的。
附资料链接:
英文帮助文档:
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/JProfiler%20Reference%20Manual.pdf
jprofiler集成tomcat的demo
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/jprofiler%7C_demo%7C_1.rar
官方session设置demo
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/jprofiler%7C_demo%7C_config.swf
官方jporfilerOverView Demo
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/jprofiler%7C_demo%7C_overview.swf
安装文件with jre
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/jprofiler%7C_windows%7C_5%7C_2%7C_1%7C_with%7C_jre.exe
crack for jprofiler 5.1.2(没成功)
http://cid-976e63db5ed0bfb6.skydrive.live.com/self.aspx/.Public/jprofiler/JProfilter.512crack.zip
2009年2月24日星期二
关于oracle rownum的知识汇总
1.
http://rake.itpub.net/post/4038/27463
得到前n条记录
直接选择前n条记录。
select * from table_name where rownum<=n; 直接选择前10条记录。
(或是rownum <>或是rownum != n+1)
选出前n条记录后再排序
select * from table_name where rownum<=n order by field_name;
选出前n条最大的记录。(先排序,再选择)
select * from (select * from table_name order by field_name desc)
where rownum <=n ;
得到最后n条记录
注意:因为rownum是不能用大于号来和数字比较的。 如 rownum > n 是无效的。
方法一:集合之差
很慢
select * from table_name
minus
select * from table_name
where rownum <= (select count(*)-n from table_name);
order by filed_name
。(先选再排序)
方法二:子查询
较快
select *
from ( select rownum id,t.* from table_name t)
where id >(select count(*)-10 from table_name);
得到表的n~m条记录
select * from (select rownum id,t.* from table_name
where ……
and rownum <= m order by field_name)
where id > n;
(先选再排序再选)
要先排序再选则须用select嵌套,内层排序外层选。
取得某列中第n大的行
使用dense_rank()函数
select column_name from
(select table_name.*,dense_rank() over (order by column_name desc) rank from table_name)
where rank = &N;
关于rownum
rownum是随着结果集生成的,一旦生成,就不会变化了;同时,生成的结果是依次递加的,没有1就永远不会有2。
2.
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
举例说明:
例如表:student(学生)表,表结构为:
ID char(6) --学号
name VARCHAR2(10) --姓名
create table student (ID char(6), name VARCHAR2(100));
insert into sale values('200001',‘张一’);
insert into sale values('200002',‘王二’);
insert into sale values('200003',‘李三’);
insert into sale values('200004',‘赵四’);
commit;
(1) rownum 对于等于某值的查询条件
如 果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因 为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
SQL> select rownum,id,name from student where rownum=1;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200001 张一
SQL> select rownum,id,name from student where rownum =2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
(2)rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录
SQL> select rownum,id,name from student where rownum >2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
SQL>select * from(select rownum no ,id,name from student) where no>2;
NO ID NAME
---------- ------ ---------------------------------------------------
3 200003 李三
4 200004 赵四
SQL> select * from(select rownum,id,name from student)where rownum>2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
(3)rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum
SQL> select rownum,id,name from student where rownum <3;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200001 张一
2 200002 王二
综 上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的,rownum对 于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之 间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记 录行。但是这样的操作会在大数据集中影响速度。
SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
NO ID NAME
---------- ------ ---------------------------------------------------
2 200002 王二
3 200003 李三
(4)rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
SQL> select rownum ,id,name from student order by name;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
SQL> select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大)
笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示, 便考虑用rownum来作,下面是具体方法(每页
显示20条):
“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询 来实现先排序,后
rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。
后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序,然后再rownum;方法不变:
“select * from tabname where rownum<20>
取得某列中第N大的行
select column_name from
(select table_name.*,dense_rank() over (order by column desc) rank from table_name)
where rank = &N;
假如要返回前5条记录:
select * from tablename where rownum<6;(或是rownum <= 5 或是rownum != 6)
假如要返回第5-9条记录:
select * from tablename
where …
and rownum<10
minus
select * from tablename
where …
and rownum<5
order by name
选出结果后用name排序显示结果。(先选再排序)
注意:只能用以上符号(<、<=、!=)。
select * from tablename where rownum != 10;返回的是前9条记录。
不能用:>,>=,=,Between...and。由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件 不成立,查不到记录.
另外,这个方法更快:
select * from (
select rownum r,a from yourtable
where rownum <= 20
order by name )
where r > 10
这样取出第11-20条记录!(先选再排序再选)
要先排序再选则须用select嵌套:内层排序外层选。
rownum是随着结果集生成的,一旦生成,就不会变化了;同时,生成的结果是依次递加的,没有1就永远不会有2!
rownum 是在 查询集合产生的过程中产生的伪列,并且如果where条件中存在 rownum 条件的话,则:
1: 假如 判定条件是常量,则:
只能 rownum = 1, <= 大于1 的自然数, = 大于1 的数是没有结果的, 大于一个数也是没有结果的
即 当出现一个 rownum 不满足条件的时候则 查询结束 this is stop key!
若条件是 = var , 则只有当 var 为1 的时候才满足条件,这个时候不存在 stop key ,必须进行 full scan ,对每个满足其他where条件的数据进行判定
选出一行后才能去选rownum=2的行……
3.
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,& gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明
假设某个表 t1(c1) 有 20 条记录
如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。
可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一 些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?
先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果 你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下 条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所以的记录
因为 rownum 是在查询到的结果集后加上去的,它总是从1开始
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果
原因同上一样,因为 rownum 总是从 1 开始
从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10
一般代码中对结果集进行分页就是这么干的。
另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。
另外还要注意:rownum不能以任何基表的名称作为前缀。