Stay hungery. Stay Foolish.
Oracle、DB二、SQLSERVER、Mysql、Access分页SQL语句梳理
2010年9月16日 18:06javascript
Oracle、DB二、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中经常使用到的数据库分页sql总结了下。你们能够贴出分页更高效的sql语句。
sqlserver分页
第一种分页方法
需用到的参数:
pageSize 每页显示多少条数据
pageNumber 页数 从客户端传来
totalRecouds 表中的总记录数 select count (*) from 表名
totalPages 总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages 计算前pages 条数据
pages= pageSize*(pageNumber-1)
SQL语句:
select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id
第二种分页方法
pageSize 每页显示多少条数据
pageNumber 页数 从客户端传来
pages=pageSize*(pageNumber-1)+1
select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )html
mysql分页
需用到的参数:
pageSize 每页显示多少条数据
pageNumber 页数 从客户端传来
totalRecouds 表中的总记录数 select count (*) from 表名
totalPages 总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages 起始位置
pages= pageSize*(pageNumber-1)
SQL语句:
select * from 表名 limit pages, pageSize;
mysql 分页依赖于关键字 limit 它需两个参数:起始位置和pageSize
起始位置=页大小*(页数-1)
起始位置=pageSize*(pageNumber -1)java
oracle分页
pageSize 每页显示多少条数据
pageNumber 页数 从客户端传来
totalRecouds 表中的总记录数 select count (*) from 表名
totalPages 总页数
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
startPage 起始位置
startPage= pageSize*(pageNumber-1)+1
endPage=startPage+pageSize
SQL语句
select a.* from
(
select rownum num ,t.* from 表名 t where 某列=某值 order by id asc
)a
where a.num>=startPage and a.num<endPagemysql
db2分页
int startPage=1 //起始页
int endPage; //终止页
int pageSize=5; //页大小
int pageNumber=1 //请求页git
startPage=(pageNumber-1)*pageSize+1
endPage=(startPage+pageSize);ajax
SQL语句
select * from (select 字段1,字段2,字段3,字段4,字段5,rownumber() over(order by 排序字段 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid <endPage正则表达式
access分页
pageSize 每页显示多少条数据
pageNumber 页数 从客户端传来
pages=pageSize*(pageNumber-1)+1
SQL语句
select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )算法
转自http://www.blogjava.net/sxyx2008/archive/2010/09/16/332193.htmlspring
Charleehu 2010-09-16 18:06 发表评论
hibernate主键生成策略
2010年7月29日 10:59sql
Hibernate有不少值得学习的地方,这里咱们主要介绍Hibernate主键,包括介绍Assigned方式、Increment方式和Foreign GUID等方面。
Hibernate主键介绍
1.Assigned
Assigned方式由程序生成主键值,而且要在save()以前指定不然会抛出异常
特色:主键的生成值彻底由用户决定,与底层数据库无关。用户须要维护主键值,在调用session.save()以前要指定主键值。
2.Hilo
Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,而后把算法获得的两个值拼接起来做为数据库中的惟一主键。Hilo方式须要额外的数据库表和字段提供高位值来源。默认请况下使用的表是
hibernate_unique_key,默认字段叫做next_hi。next_hi必须有一条记录不然会出现错误。
特色:须要额外的数据库表的支持,能保证同一个数据库中主键的惟一性,但不能保证多个数据库之间主键的惟一性。Hilo主键生成方式由Hibernate 维护,因此Hilo方式与底层数据库无关,但不该该手动修改hi/lo算法使用的表的值,不然会引发主键重复的异常。
3.Increment
Increment方式对主键值采起自动增加的方式生成新的主键值,但要求底层数据库的支持Sequence。如Oracle,DB2等。须要在映射文件xxx.hbm.xml中加入Increment标志符的设置。
特色:由Hibernate自己维护,适用于全部的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
4.Identity
Identity当时根据底层数据库,来支持自动增加,不一样的数据库用不一样的主键增加方式。
特色:与底层数据库有关,要求数据库支持Identity,如MySQl中是 auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB二、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不一样的数据库之间移植程序。
5.Sequence
Sequence须要底层数据库支持Sequence方式,例如Oracle数据库等
特色:须要底层数据库的支持序列,支持序列的数据库有DB二、PostgreSql、Qracle、SAPDb等在不一样数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库须要修改配置文件
6.Native
Native主键生成方式会根据不一样的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。
特色:根据不一样的底层数据库采用不一样的主键生成方式。因为Hibernate会根据底层数据库采用不一样的映射方式,所以便于程序移植,项目中若是用到多个数据库时,可使用这种方式。
7.UUID
UUID使用128位UUID算法生成主键,可以保证网络环境下的主键惟一性,也就可以保证在不一样数据库及不一样服务器下主键的惟一性。
特色;可以保证数据库中的主键惟一性,生成的主键占用比较多的存贮空间
8.Foreign GUID
Foreign用于一对一关系中。GUID主键生成方式使用了一种特殊算法,保证生成主键的惟一性,支持SQL Server和MySQL。以上介绍Hibernate主键。
Charleehu 2010-07-29 10:59 发表评论
Eclipse开源插件
2010年7月23日 15:31
一、EasyExplorer
EasyExplorer 是一个相似于 Windows Explorer的Eclipse插件,它能够帮助你直接浏览本地文件系统。
下载地址:http://sourceforge.net/projects/easystruts/
相似的还有openexplorer等
二、FindBugs
静态代码扫描工具,能帮助你检查代码中的一些BUG。
下载地址:http://findbugs.sourceforge.net/
三、JSDT
JSDT(Javascript Debug Toolkit)是一个用于javascript调试的eclipse 插件,用于调试javascript。JSDT能够跨浏览器调试,支持在IE,Firefox,Safari,Chrome等主流浏览器中调试 javascript。JSDT支持设置断点,单步调试等调试工具的基本特性。
下载地址:http://code.google.com/p/jsdt/
使用介绍:http://www.blogjava.net/xmatthew/archive/2008/11/10/239727.html
四、HibernateTools
经过数据库生成POJO和HBM映射文件,属于JBoss Tools系列.
下载地址:http://jboss.org/tools/download.html
使用介绍:http://smartcai.spaces.live.com/blog/cns!5E38E5D69C4C0678!229.trak
五、Metrics
一个十分强大的分析工具,主要分析代码的复杂性。同时能够统计如包的依赖性、代码的有效行数、方法的有效行数、包的数量、属性的数量等等。
下载地址:http://metrics.sourceforge.net/
六、Hibernate Synchronizer
一款Eclipse的插件,用于自动生成Hibernate的映射文件,主要特色包括:
1,支持从数据库直接生成映射文件
2,能从hbm文件自动生成/同步更新Entity
3,支持veclocity模板,能够配置veclocity控制代码生成
4,还附带一个XML编辑器,支持HBM代码自动补全
项目主页 : http://hibernatesynch.sourceforge.net/
Charleehu 2010-07-23 15:31 发表评论
Oracle JDBC URL
2010年1月25日 17:35
jdbc:oracle:driver_type:[username/password]@database_specifier
driver_type有thin和oci
eg.
jdbc:oracle:thin:@localhost:1521:xe
Charleehu 2010-01-25 17:35 发表评论
XMLHttpRequest().readyState的五种状态详解(转)
2009年11月1日 13:03
转 http://javathinker.blog.ccidnet.com/blog-htm-itemid-1262479-do-showone-type-blog-uid-36384.html
在《Pragmatic AJAX中文问题 A Web 2.0 Primer 》中偶然看到对readyStae状态的介绍,感受这个介绍很实在,摘译以下:
0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.
0 - (未初始化)尚未调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到所有响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,能够在客户端调用了
对于readyState的这五种状态,其余书中大都语焉不详。像《Foundations of AJAX中文问题》中,只在书中的表2-2简单地列举了状态的“名称”--The state of the request. The five possible values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《Ajax in Action》中好像根本就没有提到这5种状态的细节。《Professional AJAX中文问题》中虽不尽人意,但仍是有可取之处:
There are five possible values for readyState:
0 (Uninitialized): The object has been created but the open() method hasn’t been called.
1 (Loading): The open() method has been called but the request hasn’t been sent.
2 (Loaded): The request has been sent.
3 (Interactive). A partial response has been received.
4 (Complete): All data has been received and the connection has been closed.
readyState有五种可能的值:
0 (未初始化): (XMLHttpRequest)对象已经建立,但尚未调用open()方法。
1 (载入):已经调用open() 方法,但还没有发送请求。
2 (载入完成): 请求已经发送完成。
3 (交互):能够接收到部分响应数据。
4 (完成):已经接收到了所有数据,而且链接已经关闭。
在《Understanding AJAX中文问题: Using JavaScript to Create Rich Internet Applications》中,则用下表进行了说明:
readyState Status Code
Status of the XMLHttpRequest Object
(0) UNINITIALIZED
未初始化 The object has been created but not initialized. (The open method has not been called.)
(XMLHttpRequest)对象已经建立,但还没有初始化(尚未调用open方法)。
(1) LOADING
载入 The object has been created, but the send method has not been called.
(XMLHttpRequest)对象已经建立,但还没有调用send方法。
(2) LOADED
载入完成 The send method has been called, but the status and headers are not yet available.
已经调用send方法,(HTTP响应)状态及头部还不可用。
(3) INTERACTIVE
交互 Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误,由于状态和响应头部还不彻底可用。
(4) COMPLETED
完成 All the data has been received, and the complete data is available in the responseBody and responseText properties.
已经接收到了所有数据,而且在responseBody和responseText属性中能够提取到完整的数据。
根据以上几本书中的关于readyState五种状态的介绍,我认为仍是《Pragmatic AJAX中文问题 A Web 2.0 Primer 》比较到位,由于它提到了对接收到的数据的解析问题,其余书中都没有提到这一点,而这一点正是“(3)交互”阶段做为一个必要的转换过程存在于“(2)载入完成”到“(4)完成”之间的理由,也就是其任务是什么。归结起来,我以为比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”表达模式来对这几个状态进行定义比较准确,并且让人容易理解。现试总结以下:
readyState 状态
状态说明
(0)未初始化
此阶段确认XMLHttpRequest对象是否建立,并为调用open()方法进行未初始化做好准备。值为0表示对象已经存在,不然浏览器会报错--对象不存在。
(1)载入
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。
(2)载入完成
此阶段接收服务器端的响应数据。但得到的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收彻底部响应数据。并为下一阶段对数据解析做好准备。
(3)交互
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能经过responseBody、responseText或responseXML属性存取的格式,为在客户端调用做好准备。状态3表示正在解析数据。
(4)完成
此阶段确认所有数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,能够经过XMLHttpRequest对象的相应属性取得数据。
概而括之,整个XMLHttpRequest对象的生命周期应该包含以下阶段:
建立-初始化请求-发送请求-接收数据-解析数据-完成
在具体应用中,明确了readyState的五个状态(XMLHttpRequest对象的生命周期各个阶段)的含义,就能够消除对Ajax核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,令人昭昭”),迅速把握其实质,对减小学习中的挫折感和加强自信心都极其有益。
好比,经过以下示例:
//声明数组
var states = [“正在初始化……”,
“正在初始化请求……成功!
正在发送请求……”,
“成功!
正在接收数据……”,
“完成!
正在解析数据……”,
“完成!
”];
//回调函数内部代码片断
if (xmlHttp.readyState==4)
{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
if (xmlHttp.status == 200)
{
var xmldoc = xmlHttp.responseXML;
//其余代码
}
//别忘记销毁,防止内存泄漏
xmlHttp = null;
}else{
var span = document.createElement(“span”);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
}结果以下:
正在初始化请求……成功!
正在发送请求……成功!
正在接收数据……完成!
正在解析数据……完成!
Charleehu 2009-11-01 13:03 发表评论
【转载】详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
2009年9月21日 20:55
数据库名、实例名、数据库域名、全局数据库名、服务名 ,
这是几个令不少初学者容易混淆的概念。相信不少初学者都与我同样被标题上这些个概念搞得一头雾水。咱们如今就来把它们弄个明白。
1、数据库名
什么是数据库名?
数据库名就是一个数据库的标识,就像人的身份证号同样。他用参数DB_NAME表示,若是一台机器上装了多全数据库,那么每个数据库都有一个数据库名。在数据库安装或建立完成以后,参数DB_NAME被写入参数文件之中。格式以下:
DB_NAME=myorcl
...
在建立数据库时就应考虑好数据库名,而且在建立完数据库以后,数据库名不宜修改,即便要修改也会很麻烦。由于,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户没法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。可是在Oracle启动时,因为参数文件中的DB_NAME与控制文件中的数据库名不一致,致使数据库启动失败,将返回ORA-01103错误。
DB_NAME和instance_name在\oracle\admin\szcg\pfile\下的init.ora文件中,其中szcg是数据库名
数据库名的做用
数据库名是在安装数据库、建立新的数据库、建立数据库控制文件、修改数据结构、备份与恢复数据库时都须要使用到的。
有不少Oracle安装文件目录是与数据库名相关的,如:
winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
跟踪文件目录:
winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在建立数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,不然将产生错误。
一样,修改数据库结构的语句alter database, 固然也要指出要修改的数据库的名称。
若是控制文件损坏或丢失,数据库将不能加载,这时要从新建立控制文件,方法是以nomount方式启动实例,而后以create controlfile命令建立控制文件,固然这个命令中也是指指DB_NAME。
还有在备份或恢复数据库时,都须要用到数据库名。
总之,数据库名很重要,要准确理解它的做用。
查询当前数据名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件。
修改数据库名
前面建议:应在建立数据库时就肯定好数据库名,数据库名不该做修改,由于修改数据库名是一件比较复杂的事情。那么如今就来讲明一下,如何在已建立数据以后,修改数据库名。步骤以下:
1.关闭数据库。
2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
3.以NOMOUNT方式启动实例,修建控制文件(有关建立控制文件的命令语法,请参考oracle文档)
2、数据库实例名
什么是数据库实例名?
数据库实例名是用于和操做系统进行联系的标识,就是说数据库和操做系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。
数据库名和实例名能够相同也能够不一样。
在通常状况下,数据库名和实例名是一对一的关系,但若是在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。
查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询。
数据库实例名与ORACLE_SID
虽然二者都表是oracle实例,但二者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操做系统的环境变量。ORACLD_SID用于与操做系统交互,也就是说,从操做系统的角度访问实例名,必须经过ORACLE_SID。在winnt不台,ORACLE_SID还需存在于注册表中。
且ORACLE_SID必须与instance_name的值一致,不然,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。
数据库实例名与网络链接
数据库实例名除了与操做系统交互外,还用于网络链接的oracle服务器标识。当你配置oracle主机链接串的时候,就须要指定实例名。固然8i之后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来讲明 。
3、数据库域名
什么是数据库域名?
在分布式数据库系统中,不一样版本的数据库服务器之间,不论运行的操做系统是unix或是windows,各服务器之间均可以经过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:
全国交通运政系统的分布式数据库,其中:
福建节点: fj.jtyz
福建厦门节点: xm.fj.jtyz
江西: jx.jtyz
江西上饶:sr.jx.jtyz
这就是数据库域名。
数据库域名在存在于参数文件中,他的参数是db_domain.
查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询。
全局数据库名
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz
4、数据库服务名
什么是数据库服务名?
从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。
若是数据库有域名,则数据库服务名就是全局数据库名;不然,数据库服务名与数据库名相同。
查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在参数文件中查询。
数据库服务名与网络链接
从oracle8i开始的oracle网络组件,数据库与客户端的链接主机串使用数据库服务名。以前用的是ORACLE_SID,即数据库实例名。
Charleehu 2009-09-21 20:55 发表评论
Spring中Bean的生命周期
2009年6月23日 16:56
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每个Bean的别名只能维持一个实例,而不是每次都产生
一个新的对象
使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程
同时存取共享资源所引起的数据不一样步问题。
然而在spring中 能够设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" singleton="false">
在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例
一个Bean从建立到销毁,若是是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段:
1:Bean的创建:
有BeanFactory读取Bean定义文件,并生成各个Bean实例
2:属性注入:
执行相关的Bean属性依赖注入
3:BeanNameAware的setBeanName():
若是Bean类有实现org.springframework.beans.BeanNameAware接口,则执行它的setBeanName()方法
4:BeanFactoryAware的setBeanFactory():
若是Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,则执行它的setBeanFactory()方法
5:BeanPostProcessors的ProcessBeforeInitialization()
若是任何的org.springframework.beans.factory.config.BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例
的processBeforeInitialization()方法
6:initializingBean的afterPropertiesSet():
若是Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
7:Bean定义文件中定义init-method:
能够在Bean定义文件中使用"init-method"属性设定方法名称例如:
<bean id="helloBean" calss="onlyfun.caterpillar.HelloBean" init-method="initBean">
若是有以上设置的话,则执行到这个阶段,就会执行initBean()方法
8:BeanPostProcessors的ProcessaAfterInitialization()
若是有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法
9:DisposableBean的destroy()
在容器关闭时,若是Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
10:Bean定义文件中定义destroy-method
在容器关闭时,能够在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" destroy-method="destroyBean">
若是有以上设定的话,则进行至这个阶段时,就会执行destroyBean()方法,若是是使用ApplicationContext来生成并管理Bean的话
则稍有不一样,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAware的setBeanFactory()阶段后,若Bean
类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行
BeanPostProcessors的ProcessBeforeInitialization()及以后的流程
Charleehu 2009-06-23 16:56 发表评论
Java正则表达式的解释说明
2009年6月11日 20:15
表达式意义:
1.字符
x 字符 x。例如a表示字符a
\\ 反斜线字符。在书写时要写为\\\\。(注意:由于java在第一次解析时,把\\\\解析成正则表达式\\,在第二次解析时再解析为\,因此凡是否是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次)
\0n 带有八进制值 0的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0的字符 mnn(0 <= m <= 三、0 <= n <= 7)
\xhh 带有十六进制值 0x的字符 hh
\uhhhh 带有十六进制值 0x的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符
2.字符类
[abc] a、b或 c(简单类)。例如[egd]表示包含有字符e、g或d。
[^abc] 任何字符,除了 a、b或 c(否认)。例如[^egd]表示不包含字符e、g或d。
[a-zA-Z] a到 z或 A到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a到 d或 m到 p:[a-dm-p](并集)
[a-z&&[def]] d、e或 f(交集)
[a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](减去)
[a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](减去)
3.预约义字符类(注意反斜杠要写两次,例如\d写为\\d)任何字符
(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})
\p{Lower} 小写字母字符:[a-z]。
\p{Upper} 大写字母字符:[A-Z]
\p{ASCII} 全部 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十进制数字:[0-9]
\p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六进制数字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]
5.java.lang.Character 类(简单的 java 字符类型)
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored()
6.Unicode 块和类别的类
\p{InGreek} Greek 块(简单块)中的字符
\p{Lu} 大写字母(简单类别)
\p{Sc} 货币符号
\P{InGreek} 全部字符,Greek 块中的除外(否认)
[\p{L}&&[^\p{Lu}]] 全部字母,大写字母除外(减去)
7.边界匹配器
^ 行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
$ 行的结尾,请在正则表达式的结束处使用。例如:(^bca).*(abc$)表示以bca开头以abc结尾的行。
\b 单词边界。例如\b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc 均可以匹配)
\B 非单词边界。例如\B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)
\A 输入的开头
\G 上一个匹配的结尾(我的感受这个参数没什么用)。例如\\Gdog表示在上一个匹配结尾处查找dog若是没有的话则从开头查找,注意若是开头不是dog则不能匹配。
\Z 输入的结尾,仅用于最后的结束符(若是有的话)
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。
如下代码被识别为行结束符:
‐新行(换行)符 ('\n')、
‐后面紧跟新行符的回车符 ("\r\n")、
‐单独的回车符 ('\r')、
‐下一行字符 ('\u0085')、
‐行分隔符 ('\u2028') 或
‐段落分隔符 ('\u2029)。
\z 输入的结尾
当编译模式时,能够设置一个或多个标志,例如
Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
下面六个标志都是支持的:
‐CASE_INSENSITIVE:匹配字符时与大小写无关,该标志默认只考虑US ASCII字符。
‐UNICODE_CASE:当与CASE_INSENSITIVE结合时,使用Unicode字母匹配
‐MULTILINE:^和$匹配一行的开始和结尾,而不是整个输入
‐UNIX_LINES: 当在多行模式下匹配^和$时,只将'\n'看做行终止符
‐DOTALL: 当使用此标志时,.符号匹配包括行终止符在内的全部字符
‐CANON_EQ: 考虑Unicode字符的规范等价
8.Greedy 数量词
X? X,一次或一次也没有
X* X,零次或屡次
X+ X,一次或屡次
X{n} X,刚好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,可是不超过 m 次
9.Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或屡次
X+? X,一次或屡次
X{n}? X,刚好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,可是不超过 m 次
10.Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或屡次
X++ X,一次或屡次
X{n}+ X,刚好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,可是不超过 m 次
Greedy,Reluctant,Possessive的区别在于:(注意仅限于进行.等模糊处理时)
greedy量 词被看做“贪婪的”,由于它第一次就读入整个被模糊匹配的字符串。若是第一个匹配尝试(整个输入字符串)失败,匹配器就会在被匹配字符串中的最后一位后退 一个字符而且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符能够后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1 个或者0个字符。
可是,reluctant量词采起相反的方式:它们从被匹配字符串的开头开始,而后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。
最后,possessive量词老是读完整个输入字符串,尝试一次(并且只有一次)匹配。和greedy量词不一样,possessive从不后退。
11.Logical 运算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,做为捕获组。例如(abc)表示把abc做为一个总体进行捕获
12.Back 引用
\n 任何匹配的 nth捕获组
捕获组能够经过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
在表达式中能够经过\n来对相应的组进行引用,例如(ab)34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。
13.引用
\ Nothing,可是引用如下字符
\Q Nothing,可是引用全部字符,直到 \E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如, ab\\Q{|}\\\\E
能够匹配ab{|}\\
\E Nothing,可是结束从 \Q开始的引用
14.特殊构造(非捕获)
(?:X) X,做为非捕获组
(?idmsux-idmsux) Nothing,可是将匹配标志由 on 转为 off。好比:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配
idmsux说明以下:
‐i CASE_INSENSITIVE :US-ASCII 字符集不区分大小写。(?i)
‐d UNIX_LINES : 打开UNIX换行符
‐m MULTILINE :多行模式(?m)
UNIX下换行为\n
WINDOWS下换行为\r\n(?s)
‐u UNICODE_CASE : Unicode 不区分大小写。(?u)
‐x COMMENTS :能够在pattern里面使用注解,忽略pattern里面的whitespace,以及"#"一直到结尾(#后面为注解)。(?x)例如(?x)abc#asfsdadsa能够匹配字符串abc
(?idmsux-idmsux:X) X,做为带有给定标志 on - off 的非捕获组。与上面的相似,上面的表达式,能够改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)
(?=X) X,经过零宽度的正 lookahead。零宽度正先行断言,仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 表示字母后面跟数字,但不捕获数字(不回溯)
(?!X) X,经过零宽度的负 lookahead。零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,\w+(?!\d) 表示字母后面不跟数字,且不捕获数字。
(?<=X) X,经过零宽度的正 lookbehind。零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 表示99前面是数字19,但不捕获前面的19。(不回溯)
(?
mysql创建UTF8数据库
2009年6月11日 20:10
CREATE TABLE IF NOT EXISTS test(
test_id int auto_increment,
test_name varchar(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create database if not exists test default character set utf8;
dao.drivername=com.mysql.jdbc.Driver
dao.url=jdbc:mysql://localhost:3306/asking?useUnicode=true&characterEncoding=UTF-8
dao.username=
dao.passwd=
Charleehu 2009-06-11 20:10 发表评论
我写的javascript经常使用静态方法类,分享你们(转)
2009年6月11日 20:01
util=function(){
return {
$:function(id){
return document.getElementById(id);
},
trim:function(str){
return str.replace(/(^\s+)|(\s+$)/g, "");
},
len:function(str){
return str.replace(/[^\x00-\xff]/g,'**').length;
},
format:function(str){
var arg = arguments;
return str.replace(/\{(\d+)\}/g, function(m, i){
return arg[parseInt(i)+1];
});
},
each:function(object, callback, args){
var name, i = 0, length = object.length;
if ( args ) {
if ( length === undefined ) {
for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break;
} else
for ( ; i < length; )
if ( callback.apply( object[ i++ ], args ) === false )
break;
} else {
if ( length === undefined ) {
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
} else
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
}
},
setCookie:function(name,value,hours,path,domain){
var str=new String();
var nextTime=new Date();
nextTime.setHours(nextTime.getHours()+hours);
str=name+"="+escape(value);
if(hours)
str+=";expires="+nextTime.toGMTString();
if(path)
str+=";path="+path;
if(domain)
str+=";domain="+domain;
document.cookie=str;
},
getCookie:function(name){
var rs=new RegExp("(^|)"+name+"=([^;]*)(;|$)","gi").exec(document.cookie),tmp;
if(tmp=rs)
return unescape(tmp[2]);
return null;
},
delCookie:function(name){
document.cookie = name + "=-1" + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
},
/**
*url String
*parms String
*method String default value "get"
*asy Boolean defalut value true
*success Function(http_request.responseText)
**/
ajax:function(config){
var url=config.url,
parms=(config.parms?config.parms:"") + "&t="+new Date().getTime(),
method=config.method||"get",
asy=true;
var http_request=null;
if(method.toLowerCase()=="get"){
url=url+"?"+parms;
parms=null;
}
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest) { //Mozilla 浏览器
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {//设置MiME类别
http_request.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) { // IE浏览器
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if(!http_request) { // 异常,建立对象实例失败
throw new Error("不能建立XMLHttpRequest对象实例.");
return null;
}
http_request.open(method,url,asy);
http_request.onreadystatechange=function(){ if (http_request.readyState == 4){ try{ if (http_request.status == 200){ config.success(http_request.responseText); } }catch(e){ throw new Error("数据读取失败."); } } }; if(method.toLowerCase()=="post"){ http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } http_request.send(parms); } };}();