posts - 57, comments - 4, trackbacks - 0, articles - 10
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009年5月21日

http://liubiqu.cnblogs.com/archive/2006/05/04/391735.html

posted @ 2009-06-26 17:53 hanwei 阅读(512) | 评论 (0)编辑 收藏

http://www.flickr.com/photos/bluek/1441625028/in/set-72157602165101465/

posted @ 2009-06-19 11:44 hanwei 阅读(174) | 评论 (0)编辑 收藏

http://blog.sina.com.cn/goblin1130[订阅]
字体大小: 正文
dom解析xml(2009-06-03 10:28:34)
标签:杂谈  分类:xml
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。

JAXP接口包含了三个包:

(1)        org.w3c.dom   W3C推荐的用于XML标准规划文档对象模型的接口。

(2)        org.xml.sax    用于对XML进行语法分析的事件驱动的XML简单API(SAX)

(3)        javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。

二、         前提



DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。

三、         使用DOM解析XML文档



我们现在来看看DOM是如何解析XML的吧!同样的,我将从一个简单的不能再简单的例子来说明DOM是如何解析XML文档的,先让我们看看XML是什么内容吧:

<?xml version="1.0" encoding="gb2312"?>



<books>



   <book email="zhoujunhui">



         <name>rjzjh</name>



         <price>jjjjjj</price>



   </book>



</books>



简单的不能再简单了。但是该有的都有了,根元素、属性、子节点。好了,能反应问题就行了,下面来看看解析这个XML文件的Java代码吧!

1 public class DomParse {

     public DomParse(){              

            DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

            try {

                   DocumentBuilder dombuilder=domfac.newDocumentBuilder();

                   InputStream is=new FileInputStream("bin/library.xml");

                   Document doc=dombuilder.parse(is);

                  

                   Element root=doc.getDocumentElement();

10                   NodeList books=root.getChildNodes();

11                   if(books!=null){

12                          for(int i=0;i<books.getLength();i++){

13                                 Node book=books.item(i);

14                                 if(book.getNodeType()==Node.ELEMENT_NODE){

15                   String email=book.getAttributes().getNamedItem("email").getNodue();

16                                        System.out.println(email);

17                   for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

18                                               if(node.getNodeType()==Node.ELEMENT_NODE){

19                                                      if(node.getNodeName().equals("name")){

20                                                             String name=node.getNodue();

21                                                             String name1=node.getFirstChild().getNodue();

22                                                             System.out.println(name);

23                                                             System.out.println(name1);

24                                                      }

25                                                      if(node.getNodeName().equals("price")){

26                                                             String price=node.getFirstChild().getNodue();

27                                                             System.out.println(price);

28                                                      }

29                                               }

30                                        }

31                                 }

32                          }

33                   }

34            } catch (ParserConfigurationException e) {

35                   e.printStackTrace();

36            } catch (FileNotFoundException e) {

37                   e.printStackTrace();

38            } catch (SAXException e) {

39                   e.printStackTrace();

40            } catch (IOException e) {

41                   e.printStackTrace();

42            }

43     }

44     public static void main(String[] args) {

45            new DomParse();

46     }

47 }

四、         代码解释



先看看这个程序引用类:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

//下面主要是org.xml.sax包的类

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

上面那么简单的代码一看就明白了,但是为了介绍个DOM编程的大概还是来看看这个程序吧:

(1)        得到DOM解析器的工厂实例

                    DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

       得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂

(2)        从DOM工厂获得DOM解析器

                           DocumentBuilder dombuilder=domfac.newDocumentBuilder();

       通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器

(3)        把要解析的XML文档转化为输入流,以便DOM解析器解析它

                 InputStream is=new FileInputStream("bin/library.xml");

InputStream是一个接口。

(4)        解析XML文档的输入流,得到一个Document

                     Document doc=dombuilder.parse(is);

由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的

(5)        得到XML文档的根节点

                     Element root=doc.getDocumentElement();

在DOM中只有根节点是一个org.w3c.dom.Element对象。

(6)得到节点的子节点

                NodeList   books=root.getChildNodes();

              for(int i=0;i<books.getLength();i++){

                              Node book=books.item(i);

            }

这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍

(7) 取得节点的属性值

                     String email=book.getAttributes().getNamedItem("email").getNodue();

                                          System.out.println(email);

注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE

(8)轮循子节点

                  for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

                                              if(node.getNodeType()==Node.ELEMENT_NODE){

                                                     if(node.getNodeName().equals("name")){
                                                            String name=node.getNodue();

                                                            String name1=node.getFirstChild().getNodue();

                                                            System.out.println(name);

                                                            System.out.println(name1);

                                                     }

                                                      if(node.getNodeName().equals("price")){

                                                            String price=node.getFirstChild().getNodue();

                                                            System.out.println(price);
                                                     }

                                               }

这段代码的打印输出为:

null



alterrjzjh



jjjjjj

从上面可以看出

                          String name=node.getNodue();    是一个空值。而

                          String name1=node.getFirstChild().getNodue();   才是真正的值,这是因为DOM把<name>rjzjh</name>也当作是两层结构的节点,其父节点 为<name>节点本身,且它只有一个子节点(如果有属性的话就不止一个了!),子节点是它的值“rjzjh”,所以我们看到上面的结果。

还有,子节点的节点类型也是Node.ELEMENT_NODE型的,node.getNextSibling()方法是取下一个相邻的节点。

五、         DOM结点



DOM是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。DOM中最常见的节点类型有:

(1)元素:

元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点。

(2)属性:

      属性节点包含关于元素节点的信息,但它不是元素的子节点

(3)文本:

      文本节点文本信息,或干脆是空白的文本。

(4)文档:

      文档节点是整个文档中所有其它节点的父节点

元素是一种很重要的类型节点,元素节点可以是其他节点的容器。

六、DOM解析XML文档的步骤:



主要几步见第四点的(1),(2),(3),(4)步骤
已投稿到: 排行榜 圈子

posted @ 2009-06-17 15:48 hanwei 阅读(291) | 评论 (0)编辑 收藏

java写的用DOM来解析、修改、删除XML(2009-06-03 10:31:26)
标签:杂谈  分类:xml

magicalXML.java

package com.magicalxml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class magicalXML {
public static void main(String[] args) throws ParserConfigurationException {
   magicalXML u = new magicalXML();
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
   try {
    //读取源文件,如果不存在就创建一个新的给它
    File f = new File("E:""XML""test""magical123.xml");
    Document d = db.parse(f);
    TransformerFactory tfFac = TransformerFactory.newInstance();
    Transformer tf = tfFac.newTransformer();
    tf.setOutputProperty("encoding","GB2312");
    StreamResult result = new StreamResult(System.out);
    DOMSource source = new DOMSource(d);
    System.out.println("修改前的XML:");
    tf.transform(source, result);
    System.out.println();
   
   
   
       
    System.out.println("修改后的XML:");
    tf.setOutputProperty("encoding","GB2312");
    tf.transform(source, result);
    //保存修改后的xml文件
    tf.transform(source, new StreamResult(new File(
    "E:""XML""test""magical123.xml")));

   } catch (SAXException e) {
    e.printStackTrace();
   } catch (FileNotFoundException e) {
    //创建xml
    Document dl = db.newDocument();
    u.create(dl);
   } catch (TransformerConfigurationException e) {
    e.printStackTrace();
   } catch (TransformerException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }

}
//创建方法
public void create(Document d) {
   Element pub = d.createElement("publication");
   Element book = d.createElement("book");
   Element title = d.createElement("Title");
   Element author = d.createElement("Author");
  
   title.appendChild(d.createTextNode("java basic"));
   author.appendChild(d.createTextNode("john"));
   book.appendChild(title);
   book.appendChild(author);
   pub.appendChild(book);
  
   book = d.createElement("book");
   title = d.createElement("Title");
   author = d.createElement("Author");
   title.appendChild(d.createTextNode("magicalbook"));
   author.appendChild(d.createTextNode("枫叶"));
  
   book.appendChild(title);
   book.appendChild(author);
   pub.appendChild(book);
   //增加到根节点
   d.appendChild(pub);
   try {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer f = tf.newTransformer();
    f.setOutputProperty("encoding","GB2312");
    System.out.println("正在创建新的xml...");
    f.transform(new DOMSource(d), new StreamResult(new File(
      "E:""XML""test""magical123.xml")));
    System.out.println("创建新的xml成功!新的xml如下:");
    f.transform(new DOMSource(d),new StreamResult(System.out));
   }
   catch (Exception e) {
    e.printStackTrace();
   }
}
//读取元素名称和文本值方法
public void read(Document d) {
   NodeList nl = d.getElementsByTagName("*"); // 取所有结点
   for (int i = 0; i < nl.getLength(); i++) {

    if (nl.item(i).getFirstChild().getNodeType() == Node.ELEMENT_NODE)
     System.out.println("元素名称:"+nl.item(i).getNodeName());
    else {
     System.out.println("元素名称:"+nl.item(i).getNodeName());
     System.out.println("文本值:"+nl.item(i).getTextContent());
    }
   }
}
//元素增加属性方法
public void add(Document d, String title, String attr, String value) {
   NodeList nl = d.getElementsByTagName("Title");
   Element el = d.getDocumentElement();
   Node n;
   Element author;
   String str;
   for(int i=0; i<nl.getLength(); i++) {
    n = nl.item(i);
    author = (Element)n.getNextSibling().getNextSibling();
    if(title.equals(n.getFirstChild().getNodue())) {
     System.out.println("为元素"+author.getNodeName()+"增加"+attr+"属性:"+value);
     author.setAttribute(attr, value);
     
   }
}
//修改方法
public void update(Document doc, String title, String author) {
   NodeList nl = doc.getElementsByTagName("Title");
   String strNode;
   Element e;
//   Node n;
   System.out.println("有"+nl.getLength()+"个book节点");
   try {
    for(int i = 0; i < nl.getLength(); i++) {
     e = (Element) nl.item(i);
//     n = nl.item(i);
     strNode = e.getFirstChild().getNodue();
//     System.out.println(strNode);
//     strNode = n.getFirstChild().getNodue();
//     System.out.println(strNode);
     if (title.equals(strNode)) {
      Element Eauthor = (Element) e.getNextSibling().getNextSibling();
      System.out.println("修改前的Author:"+Eauthor.getFirstChild().getNodue());
      Eauthor.getFirstChild().setNodue(author);
      System.out.println("修改后的Author:"+Eauthor.getFirstChild().getNodue());
     }
    }
   } catch (Exception ee) {
    ee.printStackTrace();
   }
}
//删除方法
public void delete(Document doc,String title) {
   NodeList nl = doc.getElementsByTagName("Title");
   Element e = doc.getDocumentElement();
   Node n;
   String strNode;
   //System.out.println(""n有"+nl.getLength()+"个Title节点");
   try {
    for(int i=0; i<nl.getLength(); i++) {
     n = nl.item(i).getFirstChild();
     strNode = n.getNodue();
//     System.out.println(e.getNodeName());
//     System.out.println(e.getFirstChild().getNextSibling().getNodeName());
//     System.out.println(nl.item(i).getNodeName());
//     System.out.println(strNode);
     if(("java basic").equals(strNode)) {
      System.out.println(""n准备要删除的书名为"+title+"的作者是:"+nl.item(i).getNextSibling().getNextSibling().getFirstChild().getNodue());
      e.getFirstChild().getNextSibling().removeChild(nl.item(i).getNextSibling().getNextSibling());
      System.out.println("删除成功!");
     }
    }
   } catch (Exception ee) {
    ee.printStackTrace();
   }
}
}

 

magical123.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><publication>
<book>
   <Title>java basic</Title>
   <Author>john</Author>
</book>
<book>
   <Title>magicalbook</Title>
   <Author>magicalboy</Author>
</book>
</publication>

已投稿到: 排行榜 圈子

posted @ 2009-06-17 14:10 hanwei 阅读(379) | 评论 (0)编辑 收藏

  在使用JDBC连接数据库的时,我们会采用executeQuery(String sql)获得一个结果集。当数据库结构变化或者获得其他数据库表结果集的时候我们需要将ResultSet结果集根据不同的数据结构重新遍历。
如何才能建立一个与数据库结构无关的JDBC连接呢?我们可以通过使用ResultSetMetaData()方法获得表结构。然后使用Object[]数组遍历结果集。当我们要取得相应的结果时,我们可以使用Iterator迭代器。只要遍历迭代器就可以取出结果。
下面是我写的一个方法:
1import java.math.BigDecimal;
2import java.sql.Connection;
3import java.sql.DriverManager;
4import java.sql.ResultSet;
5import java.sql.ResultSetMetaData;
6import java.sql.SQLException;
7import java.sql.Statement;
8import java.util.ArrayList;
9import java.util.Iterator;
10import java.util.List;
11

12
publicclass newJdbc {
13private String url ="jdbc:oracle:thin:@localhost: 310-301 :nitpro"
;
14

15private String dbUserName ="scott";
16

17private String dbUserPassword ="tiger";
18

19private Connection conn =null;
20

21private Statement stmt =null;
22

23private ResultSet rs =null;
24

25public newJdbc() {
26try
{
27 Class.forName("oracle.jdbc.driver.OracleDriver"
);
28 } catch
(ClassNotFoundException e) {
29
e.printStackTrace();
30
}
31
}
32

33public Connection getConnection() {
34try
{
35 conn =
DriverManager.getConnection(url, dbUserName, dbUserPassword);
36 } catch
(SQLException e) {
37
e.printStackTrace();
38
}
39return
conn;
40
}
41

42publicvoid close(ResultSet rs, Statement stmt, Connection conn) {
43if (rs !=null
) {
44try
{
45
rs.close();
46 } catch
(SQLException e) {
47
e.printStackTrace();
48
}
49
}
50if (stmt !=null
) {
51try
{
52
stmt.close();
53 } catch
(SQLException e) {
54
e.printStackTrace();
55
}
56
}
57if (conn !=null
) {
58try
{
59
conn.close();
60 } catch
(SQLException e) {
61
e.printStackTrace();
62
}
63
}
64
}
65

66public List query(String sql) {
67 List list =new
ArrayList();
68

69 conn =this.getConnection();
70try
{
71 stmt =
conn.createStatement();
72 rs =
stmt.executeQuery(sql);
73//获取数据库表结构

74 ResultSetMetaData rsm = rs.getMetaData();
75//取得数据库的列数

76int col = rsm.getColumnCount();
77//生成col长度的Object数组

78 Object[] obj =new Object[col];
79//遍历结果集,将结果存入Object数组

80while (rs.next()) {
81for (int i =0; i < col; i++
) {
82 obj[i] = rs.getObject(i +1
);
83
}
84
list.add(obj);
85
}
86 } catch
(SQLException e) {
87
e.printStackTrace();
88 } finally
{
89this
.close(rs, stmt, conn);
90
}
91return
list;
92
}
93

94publicvoid update(String sql) {
95try
{
96 conn =this
.getConnection();
97 stmt =
conn.createStatement();
98
stmt.executeUpdate(sql);
99 } catch
(SQLException e) {
100
e.printStackTrace();
101
}
102
}
103

104publicstaticvoid main(String args[]) {
105 newJdbc nj =new
newJdbc();
106 String sql ="select * from users"
;
107 List list =
nj.query(sql);
108//返回list的迭代器

109 Iterator it = list.iterator();
110//遍历迭代器,取出结果 1z0-147

111while (it.hasNext()) {
112 Object[] o =
(Object[]) it.next();
113int id = ((BigDecimal) o[0
]).intValue();
114 System.out
.println(id);
115
}
116

117 }
118}

posted @ 2009-06-17 11:20 hanwei 阅读(742) | 评论 (0)编辑 收藏

121.15.144.113
oracle/oracle

posted @ 2009-06-15 14:37 hanwei 阅读(149) | 评论 (0)编辑 收藏

http://www.blogjava.net/nokiaguy/archive/2009/06/archive/2009/06/archive/2009/06/archive/2009/nokiaguy/archive/2009/05/archive/2009/05/archive/2009/05/archive/2009/05/archive/2009/05/01/268517.html



http://www.blogjava.net/nokiaguy/archive/2009/06/14/282121.html

posted @ 2009-06-15 11:43 hanwei 阅读(189) | 评论 (0)编辑 收藏

http://www.blogjava.net/nokiaguy/archive/2009/01/02/249556.html

posted @ 2009-06-15 11:39 hanwei 阅读(159) | 评论 (0)编辑 收藏

http://www.blogjava.net/nokiaguy/archive/2008/05/10/199645.html

posted @ 2009-06-15 11:34 hanwei 阅读(149) | 评论 (0)编辑 收藏

http://www.blogjava.net/luoqx/category/3049.html

posted @ 2009-06-12 09:37 hanwei 阅读(129) | 评论 (0)编辑 收藏

http://www.codecoke.com/tech/XSL-Tutorial/contents.html#id7

posted @ 2009-06-11 09:51 hanwei 阅读(130) | 评论 (0)编辑 收藏

http://www.sudu.cn/info/html/sitemanage/20071227/47945.html

posted @ 2009-06-10 15:25 hanwei 阅读(124) | 评论 (0)编辑 收藏

http://blog.csdn.net/wyzxg/archive/2007/09/12/1782952.aspx

http://darkmasky.javaeye.com/blog/222076

posted @ 2009-06-09 15:56 hanwei 阅读(129) | 评论 (0)编辑 收藏

http://www-307.ibm.com/pc/support/site.wss/document.do?sitestyle=lenovo&lndocid=MIGR-62928

posted @ 2009-06-08 16:48 hanwei 阅读(1867) | 评论 (2)编辑 收藏

http://www.cnblogs.com/baoguo/archive/2007/09/20/900586.html

posted @ 2009-06-05 10:29 hanwei 阅读(471) | 评论 (0)编辑 收藏

CREATE OR REPLACE PROCEDURE myPro
(
ST_NUM IN NUMBER,
ED_NUM IN NUMBER
)
IS
BEGIN
declare
       i number;
begin
FOR i IN ST_NUM..ED_NUM LOOP
INSERT INTO BASIC_CORP_SORT(BASIC_CORP_SORT_ID,BASIC_CORP_NAME) values(i,'你啊可能');
END LOOP;
end;
END;

posted @ 2009-06-04 10:55 hanwei 阅读(203) | 评论 (1)编辑 收藏

http://www.cnblogs.com/happyday56/archive/2007/07/05/806830.html

http://blog.csdn.net/squirrelRao/archive/2008/07/11/2639571.aspx

posted @ 2009-06-04 09:31 hanwei 阅读(127) | 评论 (0)编辑 收藏

JDBC连接ORACLE
2007-09-21 19:21
Oracle数据库连接     CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次.

  一、本地通过JDBC获得Oracle数据库连接

       通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果在本 地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配 置,这种方式一般不太被采用。

1、OCI方式

先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip文件,我们在环境变量classpath中设置classes12.zip所在的路径。

然后通过以下的数据库连接类,在本地通过OCI方式获得Oracle数据库连接。

/**
* 在本地获得数据库连接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过OCI方式获得Oracle数据库连接
*/
public class DbConnection
{
final static String sDBDriver = "oracle.jdbc.driver.OracleDriver";
final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199";

/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连接
*/
public java.sql.Connection connectDbByOci()
{
java.sql.Connection conn=null;
try
{
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr);
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}

在连接字符串 "jdbc:oracle:oci8:sr/sr@ora199" 中,"sr/sr"为Oracle用户的用户名和口令,"ora199"为数据库服务名。
  2、thin方式

先到Oracle技术网(http://otn.oracle.com/global/cn/software/tech/java /sqlj_jdbc/index.html)下载Oracle JDBC Drivers,同样地将下载后的zip文件的路径设置在环境变量classpath。

然后通过以下的数据库连接类,在本地通过thin方式获得Oracle数据库连接。

/**
* 在本地获得数据库连接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过thin方式获得Oracle数据库连接
*/
public class DbConnection
{
private String sConnStr = "";

/**
* 缺省构造器
*/
public DbConnection()
{
sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199";
}

/**
* @param ip,serviceName
*/
public DbConnection(String ip,String serviceName)
{
sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName;
}

/**
* 通过thin方式获得Oracle数据库的连接.
*/
public java.sql.Connection connectDbByThin()
{
java.sql.Connection conn=null;
try
{
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr,"sr","sr");
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}

/**
* 通过thin方式获得Oracle数据库的连接.
* @param userId,password
*/
public java.sql.Connection connectByJdbc(String userId,String password)
{
java.sql.Connection conn=null;
try
{ 
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr,userId,password);
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}

这种方式运用起来比较灵活,简单,具有较强的移植性和适用性。只要注意连接字符串"jdbc:oracle:thin:@10.1.4.199:1521:ora199"中具体参数的设置即可。
  3、JdbcOdbc桥方式

先通过管理工具中的数据源来添加本地对Oracle数据库的连接,然后通过以下的数据库连接类,在本地通过JdbcOdbc桥方式获得Oracle数据库连接。

/**
* 在本地获得数据库连接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过JdbcOdbc桥方式获得Oracle数据库连接
*/
public class DbConnection
{
/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连接
*/
public java.sql.Connection connectDbByJdbcOdbcBridge()
{
java.sql.Connection conn=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:odbc:ora199","sr","sr");
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}


在getConnection方法中第一个参数"jdbc:odbc:ora199" 中的"ora199"为本地ODBC数据源的数据源名称,第二个参数和第三个参数分别为Oracle的用户名和口令。
  二、通过连接池获得Oracle数据库连接

这部分主要讲述在iPlanet Application Server 6.5和Sun ONE Application Server 7中Oracle数据库连接池的配置,以及在应用中如何通过连接池获得数据库的连接。

1、iPlanet Application Server 6.5连接池的配置

先打开iPlanet Application Server 6.5的管理控制台,选中"database"面板,再选择"External JDBC Drivers"选项后,点击"Add…"按钮,在弹出的对话框中,添加一个名为"ora-type4"的JDBC Driver。



Driver Classpath:该参数填写classes12.zip文件的物理路径。

然后在"External JDBC DataSources"中选择"Add…",在弹出的对话框中添加一个JNDI名称为"credit2"的数据源。



DriverType:选择刚添加好的"ora-type4";

Datasource:ora199,为Oracle数据库服务名;

Connection Pool Parameters:图中显示的是缺省设置,可以根据自己环境情况来更改这些设置。

保存完设置后,在"DataSource Selection Box"中,选择刚添加的"credit2"数据源,再选择"Vendor Specific Properties"按钮。在对话中添加一个URL属性。



至此,iPlanet Application Server 6.5中的数据库连接池配置完毕,重起服务使之生效。

  2、Sun ONE Application Server 7连接池的配置

在配置之前将classes12.zip文件置于…/server1/lib目录下。通过浏览器的4848端口打开Sun ONE Application Server 7的管理界面,选择"server1"->"JDBC"-> "Connection Pools"下的"New…"



添加一个名称为"MyConnectionPool"的Oracle数据库连接池。"Next"下一步。



在"General"中填写"Datasource Classname"。



在"Properties"中将不需要的属性删除,同时添加"URL"属性。

"dataSourceName"中填写Oracle数据库服务名。

以下连接池的缺省设置,可以根据自己环境的情况作相应的调整。



选择"Finish"完成连接池的设置。

下一步为"MyConnectionPool"连接池创建一个JNDI,以便应用程序能够通过该名称获得连接池中的连接。 "server1"->"JDBC"-> "JDBC Resources"下的"New…"



至此,Sun ONE Application Server7中的数据库连接池配置完毕,重起服务使之生效。

  3、通过连接池获得连接

以上在iPlanet Application Server 6.5和Sun ONE Application Server7中配置的连接池都可以通过以下的数据库连接类,从连接池中获得Oracle数据库连接。

/**
* 从连接池中获得数据库连接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过连接池方式获得Oracle数据库连接
*/
public class DbConnection
{
/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连接
*/
public java.sql.Connection connectDbByConnectionPool()
{
java.sql.Connection conn=null;
try
{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/credit2");
conn=ds.getConnection();
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}

4、使用连接池的优点

使用连接池的优点主要体现在两个方面:

对数据库的连接统一进行配置、管理、监控,以及对数据库连接池的参数进行优化调整,同时对应用中没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。

便于应用的移植和后端数据库的切换,因为在应用中通过统一的JNDI获得数据库的连接,而具体连接的是哪一台机器上的数据库与应用无关。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=38402


类别:it学习 | 添加到搜藏 | 浏览(1829) | 评论 (0)
 
 

posted @ 2009-06-03 17:56 hanwei 阅读(1028) | 评论 (0)编辑 收藏

百度空间 | 百度首页  | 登录
 
查看文章
 
Java基础:Java中四种XML解析技术不完全评测
2009-04-11 15:42
在平时工作中,难免会遇到把XML作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。

预备

测试环境:

XML文件格式如下:

<?xml version="1.0" encoding="GB2312"?>
                            <RESULT>
                            <VALUE>
                            <NO>A1234</NO>
                            <ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
                            </VALUE>
                            <VALUE>
                            <NO>B1234</NO>
                            <ADDR>四川省XX市XX乡XX村XX组</ADDR>
                            </VALUE>
                            </RESULT>

测试方法:

采用JSP端调用Bean,让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件,计算其消耗时间(单位:毫秒)。

JSP 文件:

<%@ page c %>
                            <%@ page import="com.test.*"%>
                            <html>
                            <body>
                            <%
                            String args[]={""};
                            MyXMLReader.main(args);
                            %>
                            </body>
                            </html>

测 试

首先出场的是 DOM(JAXP Crimson 解析器)

DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何 工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下 导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。

另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 SAX。

Bean文件:

package com.test;
                            import java.io.*;
                            import java.util.*;
                            import org.w3c.dom.*;
                            import javax.xml.parsers.*;
                            public class MyXMLReader{
                            public static void main(String arge[]){
                            long lasting =System.currentTimeMillis();
                            try{
                            File f=new File("data_10k.xml");
                            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
                            DocumentBuilder builder=factory.newDocumentBuilder();
                            Document doc = builder.parse(f);
                            NodeList nl = doc.getElementsByTagName("VALUE");
                            for (int i=0;i<nl.getLength();i++){
                            System.out.print("车牌号码:" + doc.getElementsByTagName("NO")
                            .item(i).getFirstChild().getNodeValue());
                            System.out.println(" 车主地址:" + doc.getElementsByTagName("ADDR")
                            .item(i).getFirstChild().getNodeValue());
                            }
                            }catch(Exception e){
                            e.printStackTrace();
                            }
                            System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");
                            }
                            }

10k消耗时间:265 203 219 172

100k消耗时间:9172 9016 8891 9000

1000k消耗时间:691719 675407 708375 739656

10000k消耗时间:OutOfMemoryError

接着是 SAX

这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而 且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档; 它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。

选择 DOM 还是选择 SAX ?

对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。

DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。

DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。

SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

Bean文件:

package com.test;
                            import org.xml.sax.*;
                            import org.xml.sax.helpers.*;
                            import javax.xml.parsers.*;
                            public class MyXMLReader extends DefaultHandler {
                            java.util.Stack tags = new java.util.Stack();
                            public MyXMLReader() {
                            super();
                            }
                            public static void main(String args[]) {
                            long lasting = System.currentTimeMillis();
                            try {
                            SAXParserFactory sf = SAXParserFactory.newInstance();
                            SAXParser sp = sf.newSAXParser();
                            MyXMLReader reader = new MyXMLReader();
                            sp.parse(new InputSource("data_10k.xml"), reader);
                            } catch (Exception e) {
                            e.printStackTrace();
                            }
                            System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
                            }
                            public void characters(char ch[], int start, int length) throws SAXException {
                            String tag = (String) tags.peek();
                            if (tag.equals("NO")) {
                            System.out.print("车牌号码:" + new String(ch, start, length));
                            }
                            if (tag.equals("ADDR")) {
                            System.out.println(" 地址:" + new String(ch, start, length));
                            }
                            }
                            public void startElement(
                            String uri,
                            String localName,
                            String qName,
                            Attributes attrs) {
                            tags.push(qName);
                            }
                            }

10k消耗时间:110 47 109 78

100k消耗时间:344 406 375 422

1000k消耗时间:3234 3281 3688 3312

10000k消耗时间:32578 34313 31797 31890 30328

然后是 JDOM http://www.jdom.org/

JDOM 的目的是成为 java 特定文档模型,它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 java 特定模型,JDOM 一直得到大力推广和促进。正在考虑通过“Java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 JDOM 开发。

JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 java 开发者的使用。

JDOM 文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。JDOM 对于大多数 java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。

JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。

Bean文件:

package com.test;
                            import java.io.*;
                            import java.util.*;
                            import org.jdom.*;
                            import org.jdom.input.*;
                            public class MyXMLReader {
                            public static void main(String arge[]) {
                            long lasting = System.currentTimeMillis();
                            try {
                            SAXBuilder builder = new SAXBuilder();
                            Document doc = builder.build(new File("data_10k.xml"));
                            Element foo = doc.getRootElement();
                            List allChildren = foo.getChildren();
                            for(int i=0;i<allChildren.size();i++) {
                            System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
                            System.out.println(" 车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
                            }
                            } catch (Exception e) {
                            e.printStackTrace();
                            }
                            System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
                            }
                            }

10k消耗时间:125 62 187 94

100k消耗时间:704 625 640 766

1000k消耗时间:27984 30750 27859 30656

10000k消耗时间:OutOfMemoryError

最后是 DOM4J http://dom4j.sourceforge.net/

虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始,它就一直处于开发之中。

为支持所有这些功能,DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然 DOM4J 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。

在添加灵活性、XPath 集成和对大文档处理的目标时,DOM4J 的目标与 JDOM 是一样的:针对 java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案,实现在本质上处理所有 java/XML 问题的目标。在完成该目标时,它比 JDOM 更少强调防止不正确的应用程序行为。

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

Bean文件:

package com.test;
                            import java.io.*;
                            import java.util.*;
                            import org.dom4j.*;
                            import org.dom4j.io.*;
                            public class MyXMLReader {
                            public static void main(String arge[]) {
                            long lasting = System.currentTimeMillis();
                            try {
                            File f = new File("data_10k.xml");
                            SAXReader reader = new SAXReader();
                            Document doc = reader.read(f);
                            Element root = doc.getRootElement();
                            Element foo;
                            for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
                            foo = (Element) i.next();
                            System.out.print("车牌号码:" + foo.elementText("NO"));
                            System.out.println(" 车主地址:" + foo.elementText("ADDR"));
                            }
                            } catch (Exception e) {
                            e.printStackTrace();
                            }
                            System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");
                            }
                            }

10k消耗时间:109 78 109 31

100k消耗时间:297 359 172 312

1000k消耗时间:2281 2359 2344 2469

10000k消耗时间:20938 19922 20031 21078

JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 java 模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript 中使用 DOM)。

SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

无疑,DOM4J是这场测试的获胜者,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,那就采用DOM4J吧!

本文转载自:陕西新华论坛

友情链接:陕西新华电脑软件学校


类别:默认分类 | 添加到搜藏 | 浏览(31) | 评论 (0)
 
 
 
最近读者:
登录后,您就出现在这里。
   
 
网友评论:
发表评论:
姓 名:    注册 | 登录
网址或邮箱: (选填)
内 容:
插入表情
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu

posted @ 2009-06-03 13:46 hanwei 阅读(99) | 评论 (0)编辑 收藏

http://hi.baidu.com/ywx620/blog/item/b21419c7f50985d4d000607c.html

posted @ 2009-06-03 13:21 hanwei 阅读(74) | 评论 (0)编辑 收藏

http://blog.csdn.net/zxy119/archive/2006/07/21/950793.aspx

posted @ 2009-06-03 11:50 hanwei 阅读(73) | 评论 (0)编辑 收藏

http://blog.csdn.net/zxy119/archive/2006/07/01/858479.aspx

posted @ 2009-06-03 11:49 hanwei 阅读(62) | 评论 (0)编辑 收藏

http://blog.csdn.net/zxy119/archive/2006/07/18/934168.aspx

xml论坛  http://bbs.xml.org.cn/list.asp?boardid=1

posted @ 2009-06-03 11:37 hanwei 阅读(93) | 评论 (0)编辑 收藏

http://blog.csdn.net/pathuang68/archive/2009/04/24/4108254.aspx

posted @ 2009-06-03 09:45 hanwei 阅读(88) | 评论 (0)编辑 收藏

http://www.cnblogs.com/godshare/

posted @ 2009-06-01 16:44 hanwei 阅读(92) | 评论 (0)编辑 收藏

JBOSS部署

    本文主要记录JBoss4.0.0以上版本的部署,JBoss4.0.0以下的版本和JBoss4.0.0的部署不太一样。

    1.安装软件

        (1).JDK(仅仅安装JRE是不行的,因为JSP页面需要编译)。

        (2).把JBoss解压到某目录。

    2.设置环境变量(环境变量设置:我的电脑右键popmenu属性->高级->环境变量)

        (1).JAVA_HOME:安装完JDK后,确认这个环境变量是否存在。如果不存在,新加变量名为:JAVA_HOME,值为:JDK路径 (如:D:"Program Files"java"jdk1.6.0_07,注意不是D:"Program Files"java"jdk1.6.0_07"bin)

        (2).JBOSS_HOME:新增加变量名为:JBOSS_HOME,值为:Jboss的路径(如:H:"jboss-4.2.3.GA,注意不是H:"jboss-4.2.3.GA"bin)

    3.运行JBoss

        直接运行JBoss"bin目录下的run.bat即可,关闭JBoss请运行JBoss"bin目录下的shutdown.bat(如果没设置JAVA_HOME,运行shutdown.bat会失败)。

    以上的环境准备,JBoss4.0.0以上版本和JBoss4.0.0以下版本都是一样的,而接下来的部署,就有些不一样了。

    4.部署

        JBoss支持热部署,也就是war文件部署到服务器上后不需要重新启动JBoss(Tomcat不支持这种特性)。

        在JBoss4.0.0及以上版本,不同类型的文件部署的地方不一样,JBOSS_HOME"server"default"deploy这个是总部署目 录,但要部署的文件不是放在这个目录的,这点和JBoss3.0版本很不一样,大家可以看到JBOSS_HOME"server"default "deploy这个目录下面有很多个子目录,具体的文件就是部署到相应的这些子目录中,如:*.html,*.jsp文件的部署目录是 JBOSS_HOME"server"default"deploy"jboss-web.deployer"ROOT.war",其他的类型文件具体用 到的时候在查吧。

    5.外网访问

        部署完后,打开浏览器,输入http://localhost:8080/hyddd.html(hyddd.html是我刚才部署的文件),这时可以访问了。但如果你输入http://192.168.56.88:8080/hyddd.html(192.168.56.88是我机器的IP),还是不能访问。因为部署完后,默认只能本地访问(即:只有127.0.0.1/localhost能访问),如果想让其他人也可以访问你的网页,需要修改JBoss的配置文件。

        (1).修改JBoss配置文件

        要修改的配置文件:JBOSS_HOME/server"default"deploy"jboss-web.deployer/server.xml,下面是xml中我们需要修改的地方:

  1:     <Connector port="80" address="0.0.0.0"    

  2:          maxThreads="250" maxHttpHeaderSize="8192"

  3:          emptySessionPath="true" protocol="HTTP/1.1"

  4:          enableLookups="false" redirectPort="8443" acceptCount="100"

  5:          connectionTimeout="20000" disableUploadTimeout="true" />

        port:访问端口,默认是8080,这就是为什么上面我们在访问http://localhost:8080/hyddd.html时,需要加“:8080”这东西了,把它改为80,访问网页时就可以不加端口号了,如:http://localhost/hyddd.html(当然,你要继续加上端口号访问也是可以的,如http://localhost:80/hyddd.html

        address:要外网能访问你的网页,关键是设置这个!把address的值改为0.0.0.0就可以了。

        (2).重启JBoss

        重启后在试一下http://192.168.56.88:8080/hyddd.html,恩,可以了:>

posted @ 2009-06-01 16:40 hanwei 阅读(274) | 评论 (0)编辑 收藏

2.配置JBOSS:可以到JBOSS的官网上下载jboss的打包文件(http://libs.jboss.com/jbossas/doownloads),然后直接解压已完成了jboss安装,然后配置JBOSS的环境变量:

    ①.新建JBOSS_HOME:

 

     ②.添加相关的“path”

 

验证jboss是否安装成功:进入你的jboss安装目录下的bin目录,双击运行run.bat,启动jboss,观察控制台有无异常抛出,如果没有异常抛出,并看到类似下图中的结果,这说明jboss安装成功:

 

补充:点击run.bat时,如果出现控制台一闪然后立即自动关闭的情况,有可能是因为你在修改path时不慎删掉了XP本身的环境变量,可以在警 察一下你的“path”环境变量中是否包含下面的部分:;%SystemRoot%"system32;%SystemRoot%;

当jboss启动成功以后,可以在浏览器中输入http://localhost:8080,即可进入jboss的欢迎界面

posted @ 2009-06-01 16:10 hanwei 阅读(274) | 评论 (0)编辑 收藏

http://blog.csdn.net/cnhyong/archive/2008/01/26/2066803.aspx

posted @ 2009-05-27 15:17 hanwei 阅读(79) | 评论 (0)编辑 收藏

http://blog.csdn.net/kongxx/archive/2004/07/12/39814.aspx

posted @ 2009-05-27 14:07 hanwei 阅读(88) | 评论 (0)编辑 收藏

Oracle相关配置参数 
我在Oracle中建立了一个单独的用户:HD,设置其密码为:abc。为该用户分配好相应的数据库空间, 细致的配置方法和信息不再多说,总之你需要得到类似下面的信息以备开发时所使用: 

机器地址:hdibm(因为是在本机还可以使用localhost和127.0.0.1,如果是另一台机器使用该机器的IP地址) 
oracle的侦听端口:1521 
数据库实例名:hdorc 
访问用户名:hd 
访问密码:abc 
需 要注意的是要给HD用户分配至少Connect的角色。另外在他所使用的表空间中分配足够或是无限制的限额大小,否则在开发时都会遇到问题。 除这些之外 还需要你从安装的Oracle或Oracle网站上下载最新的JDBC包,它有两个包,其中一个是与JDK相关的驱动,另一个是多语言支持包(这里我们不 使用OCI的驱动,使用Thin的驱动)。 因为我使用的JDK为1.4所以驱动包我使用了 ojdbc14.jar ,JDK1.4使用的多语言支持包与JDK1.2相同都是 nls_charset12.jar 。 

在数据库中我们建立一些表以用于程序开发,以一个简单的用户管理为例我们先建立一个简单的用户表(sysuser): 

表名:sysuser 
用户ID:userid(vchar:32) 
用户名:username(vchar:20) 
用户密码:userpasword(vchar:20) 
用户最后登录时间:lastlogin(date) 
你也可以使用这个sql语句来创建表: 
CREATE TABLE "HD"."SYSUSER" ("USERID" VARCHAR2(32) NOT NULL, 
    "USERNAME" VARCHAR2(20) NOT NULL, "USERPASWORD" VARCHAR2(20) 
    NOT NULL, "LASTLOGIN" DATE, PRIMARY KEY("USERID"), 
    UNIQUE("USERNAME"))  
    TABLESPACE "USERS" 

驱动名称:Oracle Thin Driver 
驱动程序包名:浏览选择你的ojdbc14.jar文件 
驱动程序类:oracle.jdbc.driver.OracleDriver 
驱 动程序前 缀:jdbc:oracle:thin: < username >; @ < password >; // < server >; [: < 1521 >; ] / < database_name >; (这 里是最新的驱动的URL书写方法,具体的最好看一下相关Oracle驱动的有关URL的说明) 
配置好驱动程序后我们来增加一个数据库连接: 

 
这里: 

数据库连接名:HDTestDB 
驱动名称:Oracle Thin Driver(就是在上面我们建立的) 
驱动程序类:oracle.jdbc.driver.OracleDriver 
数据库连接:jdb c:oracle:thin:hd@abc//hdibm:1521/hdorc 
用户名:hd 
密码:abc 

将之前准备好的Oracle驱动包也加入到Web项目中。主要是这两个文件: 

nls_charset12.jar 
ojdbc14.jar 

配置Hibernate的配置文件 
配置Hibernate数据库连接配置 
数据库的连接配置很简单,在项目的 src目录 下建立一个xml文件,名为 hibernate.cfg.xml 。这个文件的内容为: 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>

    <session-factory>

        <property name="dialect">net.sf.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.username">hd</property>
        <property name="connection.password">abc</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:hdorc</property>
        
<property name="connection.pool.size">1</property>
<property name="statement_cache.size">25</property>
<property name="jdbc.fetch_size">50</property>
<property name="jdbc.batch_size">30</property>

<property name="show_sql">true</property>

        <!-- Mapping files -->
        <mapping resource="com/huangdong/demo/dao/SysUser.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

我们对这里的各个property元素一一说明: 

dialect:使用了Oracle9的对照 
connection.driver_class:Oracle的JDBC驱动类名 
connection.username:Oracle数据库访问用户名 
connection.password:Oracle数据库访问密码 
connection.url:Oracle数据库访问URL 
connection.pool.size:数据库连接池大小 
statement_cache.size:JDBC statement缓冲大小 
jdbc.fetch_size:设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数 
jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 
show_sql:设定是否在控制台上显示向数据库提交的SQL语句,在开发调试时比较有用 

下面是在com.huangdong.demo.dao包中生成SysUser类和SysUser.hb.xml文件。 

由于在Java中使用java.util.Date有很多不方便的地方,所以我将lastlogin的映射后的java属性改为了calendar。 

这是修改后的SysUser.hbm.xml文件: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.huangdong.demo.dao.SysUser" table="SYSUSER">
<id column="userid" length="32" name="userid" type="string">
<generator class="uuid.hex"/>
</id>
<property column="username" length="20" name="username" not-null="true" type="string" unique="true"/>
<property column="userpasword" length="20" name="userpasword" not-null="true" type="string"/>
<property column="lastlogin" length="7" name="lastlogin" type="calendar"/>
</class>
</hibernate-mapping>
这是修改后的SysUser.java文件: 

package com.huangdong.demo.dao;

import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

/** @author Hibernate CodeGenerator */
public class SysUser implements Serializable {

    /** identifier field */
    private String userid;

    /** persistent field */
    private String username;

    /** persistent field */
    private String userpasword;

    /** nullable persistent field */
    private java.util.Calendar lastlogin;

    /** full constructor */
    public SysUser(java.lang.String username, java.lang.String userpasword, java.util.Calendar lastlogin) {
        this.username = username;
        this.userpasword = userpasword;
        this.lastlogin = lastlogin;
    }

    /** default constructor */
    public SysUser() {
    }

    /** minimal constructor */
    public SysUser(java.lang.String username, java.lang.String userpasword) {
        this.username = username;
        this.userpasword = userpasword;
    }

    public java.lang.String getUserid() {
        return this.userid;
    }

public void setUserid(java.lang.String userid) {
this.userid = userid;
}

    public java.lang.String getUsername() {
        return this.username;
    }

public void setUsername(java.lang.String username) {
this.username = username;
}

    public java.lang.String getUserpasword() {
        return this.userpasword;
    }

public void setUserpasword(java.lang.String userpasword) {
this.userpasword = userpasword;
}

    public java.util.Calendar getLastlogin() {
        return this.lastlogin;
    }

public void setLastlogin(java.util.Calendar lastlogin) {
this.lastlogin = lastlogin;
}

    public String toString() {
        return new ToStringBuilder(this)
            .append("userid", getUserid())
            .toString();
    }

    public boolean equals(Object other) {
        if ( !(other instanceof SysUser) ) return false;
        SysUser castOther = (SysUser) other;
        return new EqualsBuilder()
            .append(this.getUserid(), castOther.getUserid())
            .isEquals();
    }

    public int hashCode() {
        return new HashCodeBuilder()
            .append(getUserid())
            .toHashCode();
    }

}

编写数据库连接获取类 
我们编写一个单独的类,用于从SessionFactory中获取数据库连接session。这个类名为HibernateUtil,我们将其放于com.huangdong.demo.util包中,具体的代码如下: 

package com.huangdong.demo.util;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
try {
sessionFactory =
new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Exception building SessionFactory: " + ex.getMessage(),
ex);
}
}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}

public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}

我们为该类加入一个向数据库中增加数据的方法: 

public boolean TestAdd() {
try {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
SysUser user = new SysUser();
user.setUsername("丫丫");
user.setUserpasword("uhkuhkqepdwqi");
user.setLastlogin(Calendar.getInstance());
session.save(user);
tx.commit();
HibernateUtil.closeSession();
} catch (HibernateException e) {
e.printStackTrace();
return false;
}
return true;
}

posted @ 2009-05-27 10:04 hanwei 阅读(4434) | 评论 (0)编辑 收藏

http://blog.csdn.net/cchaha/archive/2009/03/04/3955762.aspx

http://blog.sina.com.cn/s/blog_4d668b1d0100bb7w.html

Eclipse本身很快的,但是加上了myeclipse后,就狂占内存,而且速度狂慢,那如何让Eclipse拖着myeclipse狂飚呢?这里提供一个:

技巧:取消自动validation
validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下,速度立马提升好几个档次!
取消方法: windows-->perferences-->myeclipse-->validation 除开Manual下面的复选框全部选中之外,其他全部不选手工验证方法:
       在要验证的文件上,单击鼠标右键-->myeclipse-->run validation

程序代码自动排版:Ctrl+Shift+F,会自动把代码进行格式化的排版,非常方便
快速执行程序:Ctrl + F11第一次执行时,它会询问您执行模式,设置好后,以后只要按这个热键,它就会快速执行.

Ctrl+Shift+/ 加上段注释/**/
Ctrl+Shift+" 取消段注释/**/
Ctrl+/ 加上行注释或取消行注释
自动汇入所需要的类别:Ctrl+Shift+M Ctrl+Shift+O  好象使用Ctrl+Shift+O  也可以
重要技巧(机器配置低就别用了,呵呵)
Eclipse中默认是输入"."后出现自动提示,用于类成员的自动提示,可是有时候我们希望它能在我们输入类的首字母后就出现自动提示,可以节省大量的输入时间(虽然按alt + /会出现提示,但还是要多按一次按键,太麻烦了).
从Window -> preferences -> java -> Editor -> Content assist -> Auto-Activation下,我们可以在"."号后面加入我们需要自动提示的首字幕,比如"ahiz".
然后我们回到Eclipse的开发环境,输入"a",提示就出现了.
但是我们可以发现,这个Auto-Activation下的输入框里最多只能输入5个字母,也许是Eclipse的开发人员担心我们输入的太多会影响性能,但计算机的性能不用白不用,所以我们要打破这个限制.
其实上面都是铺垫,制造一下气氛,以显得我们下面要做的事情很牛似的,其实不然,一切都很简单.嘿嘿 :)
在"."后面随便输入几个字符,比如"abij",然后回到开发环境,File -> export -> general -> preferences -> 选一个地方保存你的首选项,比如C:"a.epf
用 任何文本编辑器打开a.epf,查找字符串“abij”,找到以后,替换成“abcdefghijklmnopqrstuvwxyz”,总之就是你想怎样 就怎样!!然后回到Eclipse,File -> import -> general -> preferences -> 导入刚才的a.epf文件.此时你会发现输入任何字幕都可以得到自动提示了.爽!!!
最后:自动提示弹出的时间最好改成100毫秒以下,这样会比较爽一点,不然你都完事了,自动提示才弹出来:),不过也要看机器性能.

myeclipse自动提示背景颜色设置(再也不那么淡)
window--preference--java--editor- completion proposals Background 颜色推荐85,90,205

Eclipse 常用快捷键
Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。
  1. 【ALT+/】
  此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类、方法和属性的名字时,多体验一下【ALT+/】快捷键带来的好处吧。
  2. 【Ctrl+O】
  显示类中方法和属性的大纲,能快速定位类的方法和属性,在查找Bug时非常有用。

  3. 【Ctrl+/】
  快速添加注释,能为光标所在行或所选定行快速添加注释或取消注释,在调试的时候可能总会需要注释一些东西或取消注释,现在好了,不需要每行进行重复的注释。

  4. 【Ctrl+D】
  删除当前行,这也是笔者的最爱之一,不用为删除一行而按那么多次的删除键。

  5. 【Ctrl+M】
  窗口最大化和还原,用户在窗口中进行操作时,总会觉得当前窗口小(尤其在编写代码时),现在好了,试试【Ctrl+M】快捷键。

  查看和定位快捷键
  在程序中,迅速定位代码的位置,快速找到Bug的所在,是非常不容易的事,Eclipse提供了强大的查找功能,可以利用如下的快捷键帮助完成查找定位的工作。
  1. 【Ctrl+K】、【Ctrl++Shift+K】
  快速向下和向上查找选定的内容,从此不再需要用鼠标单击查找对话框了。

  2. 【Ctrl+Shift+T】
  查找工作空间(Workspace)构建路径中的可找到Java类文件,不要为找不到类而痛苦,而且可以使用“*”、“?”等通配符。

  3. 【Ctrl+Shift+R】
  和【Ctrl+Shift+T】对应,查找工作空间(Workspace)中的所有文件(包括Java文件),也可以使用通配符。

  4. 【Ctrl+Shift+G】
  查找类、方法和属性的引用。这是一个非常实用的快捷键,例如要修改引用某个方法的代码,可以通过【Ctrl+Shift+G】快捷键迅速定位所有引用此方法的位置。

  5. 【Ctrl+Shift+O】
快速生成import,当从网上拷贝一段程序后,不知道如何import进所调用的类,试试【Ctrl+Shift+O】快捷键,一定会有惊喜。

  6. 【Ctrl+Shift+F】
  格式化代码,书写格式规范的代码是每一个程序员的必修之课,当看见某段代码极不顺眼时,选定后按【Ctrl+Shift+F】快捷键可以格式化这段代码,如果不选定代码则默认格式化当前文件(Java文件)。

  7. 【ALT+Shift+W】
  查找当前文件所在项目中的路径,可以快速定位浏览器视图的位置,如果想查找某个文件所在的包时,此快捷键非常有用(特别在比较大的项目中)。

  8. 【Ctrl+L】
  定位到当前编辑器的某一行,对非Java文件也有效。

  9. 【Alt+←】、【Alt+→】
  后退历史记录和前进历史记录,在跟踪代码时非常有用,用户可能查找了几个有关联的地方,但可能记不清楚了,可以通过这两个快捷键定位查找的顺序。

  10. 【F3】
快速定位光标位置的某个类、方法和属性。

  11. 【F4】
  显示类的继承关系,并打开类继承视图。

  调试快捷键
  Eclipse中有如下一些和运行调试相关的快捷键。
  1. 【Ctrl+Shift+B】:在当前行设置断点或取消设置的断点。
  2. 【F11】:调试最后一次执行的程序。
  3. 【Ctrl+F11】:运行最后一次执行的程序。
  4. 【F5】:跟踪到方法中,当程序执行到某方法时,可以按【F5】键跟踪到方法中。
  5. 【F6】:单步执行程序。
  6. 【F7】:执行完方法,返回到调用此方法的后一条语句。
  7. 【F8】:继续执行,到下一个断点或程序结束。

  常用编辑器快捷键
  通常文本编辑器都提供了一些和编辑相关的快捷键,在Eclipse中也可以通过这些快捷键进行文本编辑。
  1. 【Ctrl+C】:复制。
  2. 【Ctrl+X】:剪切。
  3. 【Ctrl+V】:粘贴。
  4. 【Ctrl+S】:保存文件。
  5. 【Ctrl+Z】:撤销。
  6. 【Ctrl+Y】:重复。
  7. 【Ctrl+F】:查找。

  其他快捷键
  Eclipse中还有很多快捷键,无法一一列举,用户可以通过帮助文档找到它们的使用方式,另外还有几个常用的快捷键如下。
  1. 【Ctrl+F6】:切换到下一个编辑器。
  2. 【Ctrl+Shift+F6】:切换到上一个编辑器。
  3. 【Ctrl+F7】:切换到下一个视图。
  4. 【Ctrl+Shift+F7】:切换到上一个视图。
  5. 【Ctrl+F8】:切换到下一个透视图。
  6. 【Ctrl+Shift+F8】:切换到上一个透视图。

  Eclipse中快捷键比较多,可以通过帮助文档找到所有快捷键的使用,但要掌握所有快捷键的使用是不可能的,也没有必要,如果花点时间熟悉本节列举的快捷键,必将会事半功倍

1. edit->content Assist - >  add      Alt+/  代码关联
2. Window -> Next Editor -> add    Ctrl+Tab 切换窗口
3. Run/Debug Toggle Line Breakpoint -> add Ctrl+` 在调试的时候 增删断点
4. Source-> Surround with try/catch Block -> Ctrl+Shift+v  增加try catch 框框
5. Source -> Generate Getters and Setters -> Ctrl+Shift+. 增加get set 方法


-----------有用的快捷键-----------
Alt+/ 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+1:光标停在某变量上,按Ctrl+1键,可以提供快速重构方案。选中若干行,按Ctrl+1键可将此段代码放入for、while、if、do或try等代码块中。
双击左括号(小括号、中括号、大括号),将选择括号内的所有内容。
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性

-----------Ctrl系列-----------
Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量
Ctrl+Shift+K:和Ctrl+K查找的方向相反
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+T 快速显示当前类的继承结构
Ctrl+Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。
Ctrl+O:在代码中打开类似大纲视图的小窗口
Ctrl+鼠标停留:可以显示类和方法的源码
Ctrl+H:打开搜索窗口
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码

-----------Ctrl+Shift 系列-----------
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+O:快速地导入import
Ctrl+Shift+R:打开资源 open Resource

-----------F快捷键 系列-----------
F3:打开声明该引用的文件
F4:打开类型层次结构
F5:单步跳入
F6:单步跳过
F7:单步跳出
F8:继续,如果后面没有断点,程序将运行完

-----------行编辑用-----------
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Ctrl+Shift+Enter 在当前行插入空行(原理同上条)

-----------不常用的-----------
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Ctrl+Shift+S:保存全部
Ctrl+W 关闭当前Editer
Ctrl+Shift+F4 关闭所有打开的Editer

Ctrl+Shift+G: 在workspace中搜索引用
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)
-----------不明白-----------
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

posted @ 2009-05-27 09:47 hanwei 阅读(472) | 评论 (0)编辑 收藏

http://blog.csdn.net/maggiejin/archive/2008/04/23/2319420.aspx

序列(SEQUENCE)序列是一数据库对象,利用它可生成唯一的整数。一个序列的值是由特殊的Oracle程序自动生成,因此序列避免了在应用 层实现序列而引起的性能瓶颈。该序列为上升序列,由1开始,增量为1,没有上限。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降 序,序列可由比最大值小的值开始,缺省值为序列的最大值。修改序列可以:? 修改未来序列值的增量。

ORACLE没有象SQL SERVER中一样的自增加字段,要实现只能通过SEQUENCE来实现

1.创建序列:
create sequence your_seq
nocycle
maxvalue 9999999999
start with 1;

2.使用触发器实现自增:
create or replace trigger your_seq_tri
before insert on your_table1 for each row
declare
  next_id number;
begin
  select your_seq.nextval into next_id from dual;
  :new.id := next_id;
end;

在oraclek中,为了方便我常常用触发器及序列结合起来实现,下面就是一个示例。
先建表、再建序列、然后是触发器,最后测试=============================================
--为主键指定序列编号
--2003-10-8 15:53
=============================================

conn scott/tiger@powermis

drop table foo;

create table foo(
  id number primary key,
  data varchar2(100));

create sequence foo_seq;

create or replace trigger bifer_foo_id_pk
  before insert
    on foo
    for each row
begin
  select foo_seq.nextval into :new.id from dual;
end;
/

insert into foo(data)
  values('Chirstopher');

insert into foo(id,data)
  values(5,'Sean');

select * from foo;

Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(sequence)相比具有诸多优势。一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。


序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键
字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在
每个数据库里都是唯一的。

此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一
的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。

create table use_seq_table(id integer);
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval);

REM - for some reason, the documentation uses raw(32)
create table use_guid_table(id raw(16));
insert into use_guid_table(sys_guid());

很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在
这样的数据集里一条记录的创建就会让 数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后 来合并到一起的情况下很有用。但是,SYS_GUID所生成的值是一个16位的原始值。序列所生成的整数不会使用16位(的值),除非它达到了10的30 次方(每个字节有两位),而且数字是相当独特的:

SQL> select dump(123456789012345678901234567890) from dual;

DUMP(123456789012345678901234567890)
--------------------------------------------------------------
Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91

较短的值就意味着用于表格和索引的存储空间更少,以及查询访问的时间更短。使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上 的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能 上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被 丢失。

SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。

出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。

posted @ 2009-05-27 09:10 hanwei 阅读(295) | 评论 (0)编辑 收藏

1、JDBC连接Oracle (classes14.jar 该驱动可在oracle安装的目录中找到)
Class.forName( "oracle.jdbc.driver.OracleDriver" );
cn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.1.120:1521:orcl", "test", "123");


2、JDBC连接MySQL
Class.forName( "org.gjt.mm.mysql.Driver" );
cn = DriverManager.getConnection( "jdbc:mysql://192.168.1.120:3306/test", "root", "123");

3、JDBC连接Microsoft SQLServer
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://192.168.1.120:1433;databaseName=test", "admin", "123");

4、JDBC连接ODBC (sDsn为DSN数据源)
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );

posted @ 2009-05-26 18:07 hanwei 阅读(83) | 评论 (0)编辑 收藏

http://hi.baidu.com/mymelon/blog/item/5bfdeafe8871ae305c600839.html

posted @ 2009-05-26 17:22 hanwei 阅读(73) | 评论 (0)编辑 收藏

http://hi.baidu.com/809847283/blog/item/dd209efa81763816a9d3117f.html

posted @ 2009-05-26 17:04 hanwei 阅读(72) | 评论 (0)编辑 收藏

http://www.blogjava.net/zzheng/archive/2008/09/05/227305.html

http://blog.csdn.net/cookieyou/archive/2007/10/18/1831488.aspx

http://charmo.javaeye.com/blog/170259

filter细节 http://www.javaeye.com/topic/39332

posted @ 2009-05-26 15:52 hanwei 阅读(61) | 评论 (0)编辑 收藏

http://blog.csdn.net/KimSoft/category/513434.aspx

http://www.javaeye.com/topic/106924

posted @ 2009-05-26 13:36 hanwei 阅读(62) | 评论 (0)编辑 收藏

http://blog.csdn.net/lenism521

http://www.cnblogs.com/cy163/archive/2008/04/11/1147648.html

posted @ 2009-05-26 11:11 hanwei 阅读(80) | 评论 (0)编辑 收藏

http://blog.csdn.net/overmaker/archive/2008/02/15/2096802.aspx

http://www.blogjava.net/vincent/archive/2008/08/23/223912.html

http://lavasoft.blog.51cto.com/62575/27069

posted @ 2009-05-26 09:25 hanwei 阅读(79) | 评论 (0)编辑 收藏

http://www.blogjava.net/sterning/archive/2007/10/13/152508.html

http://www.blogjava.net/sterning/archive/2007/10/15/152940.html

posted @ 2009-05-25 17:20 hanwei 阅读(86) | 评论 (0)编辑 收藏

http://www.jspcn.net/htmlnews/11049392593751612.html

http://www.blogjava.net/hadeslee/archive/2007/09/06/143216.html

http://www.blogjava.net/rickhunter/archive/2009/05/14/25484.html

http://blog.csdn.net/CMTobby/archive/2007/11/18/1891369.aspx

posted @ 2009-05-25 15:51 hanwei 阅读(86) | 评论 (0)编辑 收藏

http://blog.csdn.net/moneyding/archive/2007/09/10/1779206.aspx

posted @ 2009-05-25 15:01 hanwei 阅读(75) | 评论 (0)编辑 收藏

http://www.oracle.com/technology/global/cn/pub/articles/maps1.html
http://blog.csdn.net/zhiyuzhe/archive/2006/06/01/767903.aspx

posted @ 2009-05-22 15:26 hanwei 阅读(63) | 评论 (0)编辑 收藏

http://www.family168.com/tutorial/jbpm4.0/html/index.html

posted @ 2009-05-22 11:57 hanwei 阅读(635) | 评论 (0)编辑 收藏

65555

posted @ 2009-05-22 10:50 hanwei 阅读(151) | 评论 (0)编辑 收藏

dff

posted @ 2009-05-21 18:05 hanwei 阅读(61) | 评论 (0)编辑 收藏

HQL

http://blog.csdn.net/xugangwujiao/archive/2007/06/04/1637859.aspx

posted @ 2009-05-21 18:04 hanwei 阅读(52) | 评论 (0)编辑 收藏

http://www.javaeye.com/topic/325311

http://www.javaeye.com/topic/193241

http://linliangyi2007.javaeye.com/blog/176345

http://antivir.javaeye.com/?page=2&show_full=true

posted @ 2009-05-21 18:02 hanwei 阅读(66) | 评论 (0)编辑 收藏

log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
log4j:WARN Please initialize the log4j system properly.
的问题解决:
将log4j.properties放到 "WEB-INF"classes中, 搞定。

其中log4j.properties配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- log4j configuration file -->
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="Threshold" value="debug"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %m%n" />
        </layout>
    </appender>

    <!-- org.apache类的log全部记录到这里来-->
<logger name="org.apache" additivity="true">
<level value="info" />   
<appender-ref ref="CONSOLE" />
</logger>

<logger name="com.bitfone.mprove.console" additivity="true">
<level value="debug" />
<appender-ref ref="CONSOLE" />
</logger>
<!--这个地方不注释掉,好像容易引起双重logger
    <root>
        <priority value="info"/>
        <appender-ref ref="CONSOLE" />
    </root>
-->
</log4j:configuration>
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### root logger option ###
log4j.rootLogger=warn, stdout
### Hibernate logging options ###
log4j.logger.net.sf.hibernate=info
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info
### log PreparedStatement cache activity ###
log4j.logger.net.sf.hibernate.ps.PreparedStatementCache=info

posted @ 2009-05-21 15:49 hanwei 阅读(3709) | 评论 (1)编辑 收藏