全新的数据持久层解决方案
来源:中国电子政务网 更新时间:2012-04-15

向大家介绍一个在开发过程产生的一个数据库持久层解决方案.
项目的名称:dbcoat, 可以到访问:http://sourceforge.net/projects/dbcoat.
本方案的理念:
1,简单

2,容易学,容易用。
    在五到十分钟就可以学会,用户手册只有几页。
    ‘你会不会***?‘ 不再成为一个问题。
    
3, 在数据库外,忘记了是在操作数据库。

4. 提供一个解决方案,而不是更多的可选方法。

5,舒心顺手
     就像它的名字,希望它能像一件为你订做的外套。

支持的功能:
1,连接池
   连接池支持断开自动重新连接,数据库连接支持‘时间’特性。
2,缓存(Cache)
   1), Cache 是自我管理的,也就是说Cache会自动更新,Cache也有时间限制,
      如果限制的时间到了,Cache会被自动删除。

   2), 条件Cache. 举例来说,像下面这样设置cache option:
       

  1. options.put(Cache.CACHE_RESULT_CONDITION, Cache.condition(8, 100, 2));

       上面代码的意思是:
       当结果集的数量(size)等于大于8并小于等于100
       或搜索的时间大于等于2毫秒时才缓存结果集
       条件cache可以让你只在真需要时缓存结果

    3), 片断结果集cache. 举例来说,你要浏览10000条结果集,每页200个
        像下面这样设置cache option:
       
  1. options.put(Cache.CACH_RESULT_RANGE, Cache.range(0, 200, 200, 400, 9800, 10000))
;
       或
       
  1. options.put(Cache.CACH_RESULT_RANGE, Cache.range(0, 400, 9800, 10000));

       上面代码的意思是:缓存第一页,下一页和最后一页的结果集。
       片断结果集cache可以让只缓存必要的结果集。

       条件和片断结果集cache可以让你有效地用好cache.

    4), 结果集相同的共享同一cache.
        假设有100条纪录,id从1到100,
        由条件'id >= 1' 和 'id <= 100' 创建的结果集共享同一cache, 如果缓存他们。

3,支持join

4, 支持数据库函数:count, avg 等。

用户导向:
1, 准备连接工厂。有两种方式:
    a), 写一个像下面xml文件:
  1.         "1.0" encoding="UTF-8"?>
  2.         
  3.         com.mysql.jdbc.Driver
  4.         jdbc:mysql://localhost:3306/coatTestdb
  5.         root
  6.         
  7.         1000
  8.         true
  9.         true
  10.         
  11.         86400
  12.         
  13.         600
  14.         
  15.         3
  16.         1000
  17.         

    创建连接工厂:
  1.         ConnectionFactory connFact = ConnectionFactory.newInstance(new FileInputStream(
  2.                 new File(propsFile)));
  3.     

    b), 在代码里设置连接属性:
  1.         Properties props = new Properties();
  2.         props.setProperty(DRIVER, driver);
  3.         props.setProperty(URL, url);
  4.         props.setProperty(USER, user);
  5.         props.setProperty(PASSWORD, password);
  6.         ......
  7.         ConnectionFactory connFact =  ConnectionFactory.newInstance(props);

2, 准备持久对象定义文件:
  1.         ......
  2.         Connection conn = connFactgetConnection();
  3.         Database database = new Database(databaseName, conn);
  4.         if (objectDefinitionsFile.exists()) {
  5.             objectDefinitionsFile.delete();
  6.         }
  7.         objectDefinitionsFile.createNewFile();
  8.     
  9.         OutputStream ou = new FileOutputStream(objectDefinitionsFile);
  10.         Assistant.database2ObjectDefinitionXml(ou, database,
  11.         HelloCoatBase.class.getMethod("columnName2PropName",
  12.             new Class[] { String.class }));
  13.         ou.close();
  14.         ......

   详细信息查看'helloworld' 例程:
        http://sourceforge.net/projects/dbcoat

3,用上面准备的连接工厂和持久对象定义文件,创建持久对象管理(ObjectManager)或(Session)实例。
  1.         ......
  2.         ConnectionFactory connFactory = ConnectionFactory.newInstance(connProps);     
  3.         ObjectDefinitionFactory odfact = ObjectDefinitionFactory.getInstance();
  4.         odfact.create(new FileInputStream(file));
  5.         
  6.         ObjectManagerFactory omf = ObjectManagerFactory.getInstance(odfact,
  7.             connFactory);
  8.         ......
  9.         
  10.         EntityManager entityManager = omf.getEnityManager();
  11.         EntitySession entitySession = omf.getEntitySession();        
  12.         // or        
  13.         ObjectManager objectManager = omf.getObjectManager();
  14.         ObjectSession objectSession = omf.getObjectSession();
  15.         ......             

4,用(ObjectManager)或(Session)实例管理持久对象。
  1.         ......
  2.         
  3.         ObjectEntity oe = new ObjectEntity(Book._);
  4.         oe.setValue(Book.ID, id);
  5.         oe.setValue(Book.NAME, "Gone with the wind");
  6.         oe.setValue(Book.AUTHOR, "Margaret Mitchell");
  7.         entityManager.addObject(oe); // or session.add(oe);
  8.         ......