精:Berkeley DB XML入门详解

来源:互联网 发布:centos ssh 限制目录 编辑:程序博客网 时间:2024/05/22 12:41

Berkeley DB XML入门
一、Berkeley DB XML安装及使用
http://www.oracle.com/technology/global/cn/products/berkeley-db/xml/index.html下载BerkeleyDB XML的安装文件(dbxml-2.4.16.rar)进行安装。
完装完成后,重启计算机。
使用方法:
1、 通过cmd窗口,输入dbxml即可进入到BerkeleyDB XML的客户端窗口。可执行XQuery语句。
2、 通过JavaAPI来访问BerkeleyDB XML数据库,需要安装目录(Berkeley DB XML 2.4.16/jar)下的三个jar包:db.jar、dbxml.jar、dbxmlexamples.jar

二、java中的应用
代码在附件中:
包括四个类:

Java代码 复制代码
  1. DbXmlContainerConfig.java --初始化环境、容器等信息   
  2. JAXBUtils.java            --将文档转换成java类   
  3. MyDbXmlTest.java          --包括添、删、改、查文档和添索引功能   
  4. PhoneBook.java            --文档对应的java类  



DbXmlContainerConfig.java --初始化环境、容器等信息:

Java代码 复制代码
  1. package com.test.berkeley.service.mytest;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileNotFoundException;   
  5. import java.util.HashMap;   
  6. import java.util.Map;   
  7. import java.util.logging.Level;   
  8. import java.util.logging.Logger;   
  9.   
  10. import com.sleepycat.db.DatabaseException;   
  11. import com.sleepycat.db.Environment;   
  12. import com.sleepycat.db.EnvironmentConfig;   
  13. import com.sleepycat.dbxml.XmlContainer;   
  14. import com.sleepycat.dbxml.XmlContainerConfig;   
  15. import com.sleepycat.dbxml.XmlException;   
  16. import com.sleepycat.dbxml.XmlManager;   
  17. import com.sleepycat.dbxml.XmlManagerConfig;   
  18.   
  19. public class DbXmlContainerConfig {   
  20.     private Logger log = Logger.getAnonymousLogger();   
  21.     private String fileHomePath = "E:/test/dbxml/data";   
  22.        
  23.     private static DbXmlContainerConfig dbxmlObj = null;   
  24.     private Environment env = null;   
  25.     private XmlManager xManager = null;   
  26.     private XmlContainer xCont = null;   
  27.     private Map<String, XmlContainer> xmlContainerMap;   
  28.   
  29.     /**  
  30.      * 初始化  
  31.      */  
  32.     private DbXmlContainerConfig(){   
  33.         setEnvironment();   
  34.         setXmlManager();   
  35.         xmlContainerMap = new HashMap<String, XmlContainer>();   
  36.     }   
  37.     /**  
  38.      * 获得实例  
  39.      * @return  
  40.      */  
  41.     public static DbXmlContainerConfig getInstance(){   
  42.         if(dbxmlObj == null){   
  43.             dbxmlObj = new DbXmlContainerConfig();   
  44.         }   
  45.         return dbxmlObj;   
  46.     }   
  47.        
  48.     /**  
  49.      * 创建Environment对象  
  50.      */  
  51.     public void setEnvironment(){   
  52.         log.info("创建Environment对象..");   
  53.         //创建EnvironmentConfig对象   
  54.         EnvironmentConfig envConf = new EnvironmentConfig();   
  55.         envConf.setAllowCreate(true);       //如果设置了true则表示当数据库环境不存在时候重新创建一个数据库环境,默认为false   
  56.         envConf.setInitializeCache(true);   //是否打开初始化缓存   
  57.         envConf.setInitializeLocking(true); //是否开启锁子系统   
  58.         envConf.setInitializeLogging(true); //是否开启日志子系统   
  59.         envConf.setTransactional(true);     //是否使用事务,默认为false   
  60.         envConf.setRunRecovery(true);   
  61. //      envConf.setThreaded(true);   
  62. //      envConf.setLogAutoRemove(true);   
  63.         envConf.setMutexIncrement(22);   
  64. //      envConf.setLogInMemory(true);   
  65.         envConf.setLogRegionSize(1024 * 1024);   
  66. //      envConf.setLogBufferSize(30 * 1024 * 1024);   
  67.         envConf.setCacheSize(64 * 1024 * 1024);   
  68. //      envConf.setLockDetectMode(LockDetectMode.MINWRITE);   
  69.            
  70.         //创建Environment对象,并初始化存储位置   
  71.         File fileHome = new File(fileHomePath);   
  72.         try {   
  73.             env = new Environment(fileHome, envConf);   
  74.         } catch (FileNotFoundException e) {   
  75.             e.printStackTrace();   
  76.             log.info("文件位置未找到!");   
  77.         } catch (DatabaseException e) {   
  78.             e.printStackTrace();   
  79.             log.info("数据库加载错误");   
  80.         }   
  81.     }   
  82.        
  83.     /**  
  84.      * 创建XmlManager对象  
  85.      */  
  86.     public void setXmlManager(){   
  87.         System.out.println("setXmlManager......");   
  88.         XmlManagerConfig managerConfig = new XmlManagerConfig();   
  89.         managerConfig.setAdoptEnvironment(true);   
  90. //        managerConfig.setAllowAutoOpen(true);   
  91. //        managerConfig.setAllowExternalAccess(true);   
  92.         try {   
  93.             xManager = new XmlManager(env, managerConfig);   
  94.         } catch (XmlException ex) {   
  95.             ex.printStackTrace();   
  96.         }   
  97.     }   
  98.        
  99.     /**  
  100.      * 获得Environment对象  
  101.      * @return  
  102.      */  
  103.     public Environment getEnvironment(){   
  104.         return env;   
  105.     }   
  106.        
  107.     /**  
  108.      * 获得XmlManager对象  
  109.      * @return  
  110.      */  
  111.     public XmlManager getXmlManager(){   
  112.         return xManager;   
  113.     }   
  114.        
  115.     /**  
  116.      * 获得XmlContainer对象  
  117.      * @param dbxmlName  
  118.      * @return  
  119.      * @throws XmlException  
  120.      */  
  121.     public XmlContainer getXmlContainer(String dbxmlName) throws XmlException{   
  122.         log.info("获得XmlContainer对象..");   
  123.         if (dbxmlName == null || dbxmlName.equals("")) {   
  124.             return null;   
  125.         }   
  126.         if (xmlContainerMap.containsKey(dbxmlName)) {   
  127.             return xmlContainerMap.get(dbxmlName);   
  128.         }   
  129.         XmlContainerConfig xmlContainerConfig = new XmlContainerConfig();   
  130.         xmlContainerConfig.setTransactional(true);   
  131.         xmlContainerConfig.setAllowCreate(true);   
  132. //        xmlContainerConfig.setNodeContainer(false);   
  133.         try {   
  134.             XmlContainer xmlContainer = xManager.openContainer(dbxmlName, xmlContainerConfig);   
  135.             xmlContainerMap.put(dbxmlName, xmlContainer);   
  136.             return xmlContainer;   
  137.         } catch (XmlException ex) {   
  138.             Logger.getLogger(DbXmlContainerConfig.class.getName()).log(Level.SEVERE, null, ex);   
  139.         }   
  140.         return null;   
  141.     }   
  142. }  


JAXBUtils.java            --将文档转换成java类

Java代码 复制代码
  1. package com.test.berkeley.service.mytest;   
  2.   
  3. import java.io.ByteArrayInputStream;   
  4. import java.io.IOException;   
  5. import java.io.InputStreamReader;   
  6.   
  7. import javax.xml.bind.JAXBContext;   
  8. import javax.xml.bind.JAXBElement;   
  9. import javax.xml.bind.Unmarshaller;   
  10. import javax.xml.transform.stream.StreamSource;   
  11.   
  12. public class JAXBUtils {   
  13.        
  14.     public static <T> T convertDocToJava(Class<T> bindClass, String docContent){   
  15.         JAXBContext jc;   
  16.         Unmarshaller umn;   
  17.         InputStreamReader is = null;   
  18.         StreamSource ss;   
  19.         try {   
  20.             jc = JAXBContext.newInstance(bindClass);   
  21.             umn = jc.createUnmarshaller();   
  22.             is = new InputStreamReader(new ByteArrayInputStream(docContent.getBytes("utf-8")), "utf-8");   
  23.             ss = new StreamSource(is);   
  24.             JAXBElement<T> book = umn.unmarshal(ss, bindClass);   
  25.             return book.getValue();   
  26.         } catch (Exception e) {   
  27.             e.printStackTrace();   
  28.             return null;   
  29.         }finally{   
  30.             if(is != null){   
  31.                 try {   
  32.                     is.close();   
  33.                 } catch (IOException e) {   
  34.                     e.printStackTrace();   
  35.                 }   
  36.             }   
  37.         }   
  38.     }   
  39. }  


PhoneBook.java            --文档对应的java类

Java代码 复制代码
  1. package com.test.berkeley.service.mytest;   
  2.   
  3. import javax.xml.bind.annotation.XmlAccessType;   
  4. import javax.xml.bind.annotation.XmlAccessorType;   
  5. import javax.xml.bind.annotation.XmlAttribute;   
  6. import javax.xml.bind.annotation.XmlElement;   
  7. import javax.xml.bind.annotation.XmlType;   
  8.   
  9. @XmlAccessorType(XmlAccessType.FIELD)   
  10. @XmlType(name = "PhoneBook", propOrder = {   
  11.     "name",   
  12.     "phone"  
  13. })   
  14. /*  
  15. <phonebook>  
  16.         <name><first>Lisa</first><last>Smith</last></name>   
  17.         <phone type=/"home/">420-992-4801</phone>  
  18.         <phone type=/"cell/">390-812-4292</phone>  
  19. </phonebook>  
  20. */         
  21. public class PhoneBook {   
  22.     @XmlElement(required = true)   
  23.     private PhoneBook.Name name;   
  24.     private PhoneBook.Phone phone;   
  25.        
  26.     @XmlAccessorType(XmlAccessType.FIELD)   
  27.     @XmlType(name = "")   
  28.     public static class Name {   
  29.         @XmlElement(name = "first", required = true)   
  30.         private String first;   
  31.         @XmlElement(name = "last", required = true)   
  32.         private String last;   
  33.         public String getFirst() {   
  34.             return first;   
  35.         }   
  36.         public void setFirst(String first) {   
  37.             this.first = first;   
  38.         }   
  39.         public String getLast() {   
  40.             return last;   
  41.         }   
  42.         public void setLast(String last) {   
  43.             this.last = last;   
  44.         }   
  45.            
  46.     }   
  47.        
  48.     @XmlAccessorType(XmlAccessType.FIELD)   
  49.     @XmlType(name = "")   
  50.     public static class Phone {   
  51.         @XmlAttribute(name = "type", required = true)   
  52.         private String type;   
  53.   
  54.         public String getType() {   
  55.             return type;   
  56.         }   
  57.   
  58.         public void setType(String type) {   
  59.             this.type = type;   
  60.         }   
  61.            
  62.     }   
  63.   
  64.     public PhoneBook.Name getName() {   
  65.         return name;   
  66.     }   
  67.   
  68.     public void setName(PhoneBook.Name name) {   
  69.         this.name = name;   
  70.     }   
  71.   
  72.     public PhoneBook.Phone getPhone() {   
  73.         return phone;   
  74.     }   
  75.   
  76.     public void setPhone(PhoneBook.Phone phone) {   
  77.         this.phone = phone;   
  78.     }   
  79. }  



MyDbXmlTest.java          --包括添、删、改、查文档和添索引功能

Java代码 复制代码
  1. package com.test.berkeley.service.mytest;   
  2.   
  3. import com.sleepycat.dbxml.XmlContainer;   
  4. import com.sleepycat.dbxml.XmlDocument;   
  5. import com.sleepycat.dbxml.XmlException;   
  6. import com.sleepycat.dbxml.XmlIndexLookup;   
  7. import com.sleepycat.dbxml.XmlIndexSpecification;   
  8. import com.sleepycat.dbxml.XmlManager;   
  9. import com.sleepycat.dbxml.XmlQueryContext;   
  10. import com.sleepycat.dbxml.XmlQueryExpression;   
  11. import com.sleepycat.dbxml.XmlResults;   
  12. import com.sleepycat.dbxml.XmlTransaction;   
  13. import com.sleepycat.dbxml.XmlUpdateContext;   
  14. import com.sleepycat.dbxml.XmlValue;   
  15.   
  16. public class MyDbXmlTest {   
  17.     protected DbXmlContainerConfig dbxmlConf =  null;   
  18.        
  19.        
  20.     private String dbxmlName = "phone.dbxml";   
  21.     static final private String m_StrName1 = "phone1";   
  22.     static final private String m_StrXml1 = "<PhoneBook><name><first>Tom</first><last>Jones</last></name><phone type=/"home/">420-203-2033</phone></PhoneBook>";   
  23.     static final private String m_StrName2 = "phone2";   
  24.     static final private String m_StrXml2 = "<PhoneBook><name><first>Lisa</first><last>Smith</last></name> <phone type=/"home/">420-992-4801</phone><phone type=/"cell/">390-812-4292</phone></PhoneBook>";   
  25.     static final private String m_StrName3 = "phone3";   
  26.     static final private String m_StrXml3 = "<PhoneBook><name><first>Tom</first><last>Jones</last></name><phone type=/"home/">420-203-2033</phone></PhoneBook>";   
  27.        
  28.     static final private String m_strquery = "collection('phone.dbxml')/phonebook";   
  29.     static final private String m_strquery1 = "collection('phone.dbxml')/phonebook[name/first=$name]";   
  30.        
  31.     public MyDbXmlTest(){   
  32.         dbxmlConf = DbXmlContainerConfig.getInstance();   
  33.     }   
  34.        
  35.     public static void main(String[] args){   
  36.         MyDbXmlTest myDb = new MyDbXmlTest();   
  37.         try {   
  38.             /*添加文档*/  
  39. //          myDb.addDoc(m_StrName1, m_StrXml1);   
  40. //          myDb.addDoc(m_StrName2, m_StrXml2);   
  41.             /*修改文档*/  
  42. //          myDb.updateDoc(m_StrName1, m_StrXml2);   
  43.             /*查询文档*/  
  44.             myDb.queryXmlData(m_strquery);   
  45.             if(myDb.getDocByKey(m_StrName3) == null){   
  46.                 myDb.addDoc(m_StrName3, m_StrXml3);   
  47.             }else{   
  48.                 System.out.println("Tom 已经存在!");   
  49.                 //删除文档   
  50. //              myDb.deleteDoc(m_StrName3);   
  51.             }   
  52.                
  53.         } catch (XmlException e) {   
  54.             e.printStackTrace();   
  55.         }   
  56.     }   
  57.        
  58.     /**  
  59.      * 保存文档  
  60.      * @throws XmlException   
  61.      */  
  62.     public void addDoc(String docName, String docStr) throws XmlException{   
  63.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  64.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  65.         //创建事务   
  66.         XmlTransaction x_tran = x_mng.createTransaction();   
  67.         XmlUpdateContext x_updateCon = x_mng.createUpdateContext();   
  68.         x_cont.putDocument(x_tran, docName, docStr, x_updateCon);   
  69.         x_tran.commit();   
  70.     }   
  71.        
  72.     /**  
  73.      * 更新文档  
  74.      * @param docName  
  75.      * @param docStr  
  76.      * @throws XmlException  
  77.      */  
  78.     public void updateDoc(String docName, String docStr) throws XmlException{   
  79.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  80.         XmlUpdateContext m_uc = x_mng.createUpdateContext();   
  81.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  82.         //创建事务   
  83.         XmlTransaction x_tran = x_mng.createTransaction();   
  84.         XmlDocument doc = x_cont.getDocument(x_tran, docName);   
  85.         doc.setContent(docStr);   
  86.         x_cont.updateDocument(x_tran, doc);   
  87.         x_tran.commit();   
  88. //      x_cont.deleteDocument(docName, m_uc);   
  89. //      x_cont.putDocument(docName, docStr, m_uc);   
  90.     }   
  91.        
  92.     /**  
  93.      * 删除文档  
  94.      * @param docName  
  95.      * @throws XmlException  
  96.      */  
  97.     public void deleteDoc(String docName) throws XmlException{   
  98.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  99.         //创建事务   
  100.         XmlTransaction x_tran = x_mng.createTransaction();   
  101.         XmlUpdateContext m_uc = x_mng.createUpdateContext();   
  102.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  103.         x_cont.deleteDocument(x_tran, docName, m_uc);   
  104.         x_tran.commit();   
  105.         System.out.println("已经删除!");   
  106.     }   
  107.   
  108.     /**  
  109.      * 查询数据,使用xquery  
  110.      * @param strQuery  
  111.      * @throws XmlException  
  112.      */  
  113.     public void queryXmlData(String strQuery) throws XmlException {   
  114.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  115.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  116.         //创建事务   
  117.         XmlTransaction x_tran = x_mng.createTransaction();   
  118.         XmlQueryContext m_qc = x_mng.createQueryContext();   
  119.         XmlQueryExpression expr = x_mng.prepare(x_tran, strQuery, m_qc);   
  120.         XmlResults res = expr.execute(m_qc);   
  121.         x_tran.commit();   
  122.            
  123.         XmlValue value = new XmlValue();   
  124.         /*System.out.print("Result: ");  
  125.         while ((value = res.next()) != null) {  
  126.             System.out.println("/t" + value.asString());  
  127.             value.delete();  
  128.         }*/  
  129.            
  130.         //把查询结果对应对象   
  131.         while ((value = res.next()) != null) {   
  132.             String tempStr = value.asString();   
  133.             if (tempStr != null && !tempStr.equals("")) {   
  134.                 PhoneBook objData = JAXBUtils.convertDocToJava(PhoneBook.class, tempStr);   
  135.                 System.out.println("name=" + objData.getName().getFirst() + "+" + objData.getName().getLast());   
  136.                 if(objData.getPhone() != null){   
  137.                     System.out.println("phone=" + objData.getPhone().getType());   
  138.                 }   
  139.             }   
  140.             value.delete();   
  141.         }   
  142.         expr.delete();   
  143.     }   
  144.     /**  
  145.      * 判断名称是否存在  
  146.      * @param name  
  147.      * @return  
  148.      * @throws XmlException  
  149.      */  
  150.     public boolean isEmpty(String name) throws XmlException{   
  151.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  152.         //创建事务   
  153.         XmlTransaction x_tran = x_mng.createTransaction();   
  154.         XmlQueryContext m_qc = x_mng.createQueryContext();   
  155.         m_qc.setVariableValue("name"new XmlValue(name));   
  156.         XmlQueryExpression xqe = x_mng.prepare(x_tran, m_strquery1, m_qc);   
  157.         XmlResults rs = xqe.execute(m_qc);   
  158.         if(rs.size() > 0){   
  159.             return false;   
  160.         }   
  161.         return true;   
  162.     }   
  163.     /**  
  164.      * 根据文档名称查找文档  
  165.      * @param key  
  166.      * @return  
  167.      * @throws XmlException  
  168.      */  
  169.     public String getDocByKey(String key) throws XmlException{   
  170.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  171.         //创建事务   
  172.         XmlTransaction x_tran = x_mng.createTransaction();   
  173.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  174.         XmlDocument doc = null;   
  175.         try{   
  176.             doc = x_cont.getDocument(x_tran, key);   
  177.         }catch(XmlException ex){   
  178.             if(ex.getErrorCode() == XmlException.DOCUMENT_NOT_FOUND){   
  179.                 x_tran.abort();   
  180.                 return null;   
  181.             }   
  182.         }   
  183.         x_tran.commit();   
  184.         String str = doc.getContentAsString();   
  185.         if(doc != null && doc.getContent() != null){   
  186.             return doc.getContentAsString();   
  187.         }   
  188.         return null;   
  189.     }   
  190.        
  191.     /**  
  192.      * 添加索引  
  193.      * @throws XmlException  
  194.      */  
  195.     public void AddIndex() throws XmlException{   
  196.         XmlManager x_mng = dbxmlConf.getXmlManager();   
  197.         //创建事务   
  198.         XmlTransaction x_tran = x_mng.createTransaction();   
  199.         XmlUpdateContext m_uc = x_mng.createUpdateContext();   
  200.         XmlContainer x_cont = dbxmlConf.getXmlContainer(dbxmlName);   
  201.         XmlIndexSpecification ins = x_cont.getIndexSpecification(x_tran);   
  202.         //[unique]-{path type}-{node type}-{key type}-{syntax type}   
  203.         ins.addIndex("""firstName""node-element-substring-string");   
  204. //      ins.addIndex("", "PRICE", "node-element-equality-double");   
  205.         //更新索引到容器中   
  206.         XmlUpdateContext xuc = x_mng.createUpdateContext();   
  207.         x_cont.setIndexSpecification(x_tran, ins, xuc);   
  208.         x_tran.commit();   
  209.     }   
  210.        
  211. }  
  212. 茶叶茶具和零食之类的东东,请大家到下面这家店铺购买“品润茶业”,希望大家多多支持!
    地址:
    http://prtea.taobao.com
原创粉丝点击